我有一个信息小部件,每60秒更新一次。在OREO之前,我使用服务来完成此操作,但现在无法这样做,因为当应用程序在后台时无法使用服务,因此我遵循了这里的一些帖子,并使用了闹钟和AlarmManager来更新小部件。
问题是它可以工作几个小时,但在一两天内,闹钟的onReceive方法不再被调用。某些情况下会发生这种情况,因为闹钟停止了,而用户没有删除小部件,因此小部件停止更新。
似乎AlarmManager不是最好的方法,或者我做错了什么。
这是我的小部件闹钟接收器:
这是我设置闹钟的小部件的源代码:
问题是它可以工作几个小时,但在一两天内,闹钟的onReceive方法不再被调用。某些情况下会发生这种情况,因为闹钟停止了,而用户没有删除小部件,因此小部件停止更新。
似乎AlarmManager不是最好的方法,或者我做错了什么。
这是我的小部件闹钟接收器:
public class WidgetAlarmReceiver extends BroadcastReceiver {
private final static String TAG = "WidgetAlarmReceiver";
@Override
public void onReceive(final Context context, Intent intent) {
Log.d(TAG,"onReceive");
ComponentName componentName = new ComponentName(context, AppWidget.class);
RemoteViews remoteViews = WidgetHelper.getInstance().generateRemoteViews(context);
AppWidgetManager.getInstance(context).updateAppWidget(componentName, remoteViews);
}
}
这是我设置闹钟的小部件的源代码:
public class AppWidget extends AppWidgetProvider {
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
RemoteViews remoteViews = WidgetHelper.getInstance().generateRemoteViews(context);
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
private void startWidgetAlarm(Context context){
alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, WidgetAlarmReceiver.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
alarmMgr.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(), 60000, alarmIntent);
}
private void stopWidgetAlarm(Context context){
alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, WidgetAlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
alarmMgr.cancel(sender);
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
startWidgetAlarm(context);
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
stopWidgetAlarm(context);
}
}
我的清单部分:
<receiver android:name=".AppWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/new_app_widget_info" />
</receiver>
<receiver android:name=".WidgetAlarmReceiver" android:exported="false"/>