我正在使用闹钟管理器每天凌晨2点设置广播。警报管理器在正常情况下工作正常,但在以下情况下失败。
有人可以帮我解决这个问题
//Alarm manager
//timeToTwoAm is calculate time to 2AM from current time
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,timeToTwoAm,
AlarmManager.INTERVAL_DAY, alarmIntent);
答案 0 :(得分:2)
您的闹钟不会被保留。重新启动后,所有已注册的警报都将被删除。
2个解决方案会有所帮助:
<强> 1。注册BOOT_COMPLETED广播接收器:
的AndroidManifest.xml
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".notification.alarm.OnBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
在您的OnBootReceiver中,只需再次在AlarmManager上注册您的闹钟。
<强> 2。使用JobScheduler-API(&gt; = API 21)或GcmNetworkManager(PlayServices)
根据您的使用情况,还可以使用新的GcmNetworkMaanger,它允许在重新启动期间保留作业。
为您的清单添加服务:
<service
android:name=".LoadWeatherService"
android:exported="true" android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
<intent-filter>
<action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" />
</intent-filter>
</service>
在您的服务中声明要做的事情:
public class LoadWeatherService extends GcmTaskService {
public void onInitializeTasks() {
super.onInitializeTasks();
// Reregister your Job after update of Google Play Services
}
@Override
public int onRunTask(TaskParams taskParams) {
// Do your stuff
return GcmNetworkManager.RESULT_SUCCESS;
}
}
订阅你的工作
String tag = "myperiodicTask";
PeriodicTask periodicTask = new PeriodicTask.Builder().setService(LoadWeatherService.class)
.setRequiredNetwork(Task.NETWORK_STATE_CONNECTED).setPeriod(60L).setFlex(10L)
.setTag(tag).setPersisted(true).build();
GcmNetworkManager.getInstance(this).schedule(periodicTask);
请注意:这只是我应用中的一个示例,您必须根据需要进行调整。
进一步阅读GcmNetworkManager:https://developers.google.com/cloud-messaging/network-manager