После перезагрузки или обновления приложения мой виджет Android перестает обновляться - PullRequest
0 голосов
/ 06 сентября 2018

Каждый раз, когда я перезагружаю свой телефон или обновляю приложение (на моем тестовом устройстве и на эмуляторе Android), виджет перестает обновляться, пока я не создам новый экземпляр виджета. Затем оба экземпляра виджета снова начнут обновляться. Я предполагаю, что это что-то с вызовом onUpdate() на старом WidgetIds, но я не могу понять это. Вот небольшой фрагмент моего кода.

 public class NewAppWidget extends AppWidgetProvider {

private static final String refresh = "b_refresh";

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);

    Intent intent = new Intent(context, NewAppWidget.class);
    intent.setAction(refresh);
    intent.putExtra("appWidgetId", appWidgetId);

    views.setOnClickPendingIntent(R.id.refresh, PendingIntent.getBroadcast(context,0,intent, PendingIntent.FLAG_UPDATE_CURRENT));
    appWidgetManager.updateAppWidget(appWidgetId, views);
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    for (int appWidgetId : appWidgetIds) {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }
}

@Override
public void onReceive(Context context, Intent intent) {
    if(refresh.equals(intent.getAction())) {
        Toast.makeText(context, "Clicked2", Toast.LENGTH_LONG).show();
    }
}

}

РЕДАКТИРОВАТЬ: вот мой manifest.xml

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver android:name=".NewAppWidget">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="android.appwidget.action.EXTRA_APPWIDGET_IDS"/>
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/new_app_widget_info" />
    </receiver>

    <activity android:name=".NewAppWidgetConfigureActivity">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
        </intent-filter>
    </activity>
</application>

1 Ответ

0 голосов
/ 06 сентября 2018

Добавьте звонок на super.onReceive() на ваш onReceive().

Объяснение

Если вы посмотрите на источник базового класса onReceive(), вы увидите, что он реализует часть логики инфраструктуры для управления жизненным циклом виджета. (Также намекают на документы ). Он обрабатывает APPWIDGET_UPDATE и, собственно, и отвечает за вызов onUpdate(). (Например, когда система загружается и ей нужно нарисовать ваш начальный виджет, она отправляет вашему приложению APPWIDGET_UPDATE, который передается в onReceive()). Итак, я не уверен на 100%, как onUpdate() когда-либо вызывали в вашем случае, в вашем случае, но я предполагаю, что у вас есть код где-то еще, который вызывает updateAppWidget(), и это единственная причина, по которой ваши виджеты появилось даже мгновенно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...