只有当从最近的应用程序中移除或用户被强制杀死时才希望警报死亡

时间:2016-08-09 08:39:41

标签: android alarmmanager

我有一个应用程序在应用程序处于后台时每10分钟由一个警报触发的服务中执行某些操作。即使操作系统杀死了应用程序,我也希望警报继续关闭(所以它已经死了并且必须重新启动)并且只有当用户实际从最近的应用程序中移除应用程序或强制将其从设置中删除时才会终止它(或者注销但是那已经有效了)。我尝试了很多不同的方法,最近我尝试了这个http://www.dotkam.com/2011/01/10/android-prefer-alarms-and-intent-receivers-to-services/没有任何运气。我的闹钟看起来像这样。

    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;

    // Set trigger time to 0, because want to fire off the first one instantly
    am.setRepeating( type, 0, ONE_MINUTE, pi );     

和BroadcastReceiver:

public class LocationBroadcastReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent ) {

    Intent myIntent = new Intent( context, LocationService.class );
    context.startService( myIntent );
}
}

知道我做错了什么?一切正常,直到操作系统杀死应用程序。

1 个答案:

答案 0 :(得分:1)

如果应用程序被杀,警报应该会消失,即使是从最近的应用程序中移除了警报(但如果它被强制停止则不会)。

实际上是使用AlarmManager

的重点
  

注意:警报管理器适用于您想要的情况   即使您的应用程序,您的应用程序代码也会在特定时间运行   目前没有运行。对于正常的计时操作(刻度,   超时等)使用Handler更容易,效率更高。

您可以看到警报是否仍然存在:

adb shell dumpsys alarm 

可能发生的事情是设备被唤醒以接收警报,但是一旦接收器完成,在服务开始之前就会再次入睡。

接收器应采用唤醒锁定(由服务释放)。支持库提供了WakefulBroadcastReceiver,其完全相同:

  

帮助实现BroadcastReceiver的常见模式   接收设备唤醒事件,然后将工作传递给a   服务,同时确保设备不会重新入睡   在过渡期间。