当操作系统杀死应用程序时,我的警报被杀死。我认为这是警报的一个要点,它会继续运行,即使操作系统杀死了应用程序?我使用" ./ adb shell dumpsys alarm"来检查报警的寿命。命令,每次操作系统杀死我的应用程序时,警报也消失了。我是如何开始报警的:
public static void startLocationAlarm(Context context){
if(ActivityLifecycleHandler.isApplicationInForeground()) {
return; // If App is in foreground do not start alarm!
}
String alarm = Context.ALARM_SERVICE;
AlarmManager am = ( AlarmManager ) context.getSystemService( alarm );
Intent intent = new Intent(locationBroadcastAction);
PendingIntent pi = PendingIntent.getBroadcast( context.getApplicationContext(), 0, intent, 0 );
int type = AlarmManager.ELAPSED_REALTIME_WAKEUP;
long interval = ONE_MINUTE;
long triggerTime = SystemClock.elapsedRealtime() + interval;
am.setRepeating(type, triggerTime, ONE_MINUTE, pi );
}
要添加更多上下文,我正在尝试在后台服务(而不是IntentService)中进行一些位置操作。这是我的接收器。使用Wakeful因为我不希望服务在它完成之前被杀死。
public class LocationBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent ) {
Intent myIntent = new Intent( context, LocationServiceAlarmOwnGoogleClient.class );
//context.startW( myIntent );
LocationBroadcastReceiver.startWakefulService(context, myIntent);
}
}
有关更多信息:我在OnStart方法中取消了几个活动的警报,用户可以在后台运行后返回这些活动。我不知道这是否会导致这种奇怪的行为?这是我的取消方法:
public static void stopLocationAlarm(Context context){
Intent intent = new Intent(locationBroadcastAction);
PendingIntent sender = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
答案 0 :(得分:0)
您可以添加侦听手机开启回拨的服务。 将此权限添加到清单
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
并注册收件人
<receiver android:name=".util.notification.local.MyBootCompletedService">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
public class MyBootCompletedService extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
AlarmReceiver.startLocalNotificationService(context);
}
}
答案 1 :(得分:0)
导致警报被取消的错误实际上与代码无关,而是与华为设备上的特殊电池设置有关。如果您的应用未在“受保护的应用”中设置为“受保护”,则系统会在应用时取消您的警报。将您的应用添加到“受保护的应用”将解决此问题。小米设备也是如此。必须将它们添加到“受保护的应用程序”,然后警报将按预期工作。感谢@CommonsWare带领我找到解决方案。