操作系统杀死应用程序时,警报被终止

时间:2016-08-09 14:34:42

标签: android alarmmanager

当操作系统杀死应用程序时,我的警报被杀死。我认为这是警报的一个要点,它会继续运行,即使操作系统杀死了应用程序?我使用" ./ 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);
}

2 个答案:

答案 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带领我找到解决方案。