【问题标题】:Only want Alarm to die when removed from Recent Apps or user forced killed只希望警报在从最近的应用程序中删除或用户被强制杀死时死亡
【发布时间】:2016-08-09 17:29:19
【问题描述】:

我有一个应用程序在后台运行时每 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 );     

还有广播接收器:

public class LocationBroadcastReceiver extends BroadcastReceiver{

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

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

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

【问题讨论】:

    标签: android alarmmanager


    【解决方案1】:

    如果应用程序被终止,即使从最近的应用程序中删除,警报也应该响起(但如果它被强制停止)。

    这实际上是使用AlarmManager 的重点:

    注意:警报管理器适用于您希望拥有的情况 您的应用程序代码在特定时间运行,即使您的应用程序 当前未运行。对于正常的计时操作(滴答声、 超时等)使用 Handler 更容易也更高效。

    您可以通过以下方式查看警报是否仍然存在:

    adb shell dumpsys alarm 
    

    可能发生的情况是设备被唤醒以接收警报,但在接收器完成后再次进入睡眠状态,然后服务才能启动。

    接收者应该获取唤醒锁(由服务释放)。支持库提供了一个WakefulBroadcastReceiver,它正是这样做的:

    帮助实现广播接收器的通用模式 接收设备唤醒事件,然后将工作传递给 服务,同时确保设备不会重新进入睡眠状态 在过渡期间。

    【讨论】:

    • 啊,太好了!是的,我实际上也认为这也是警报的全部意义所在,但我就是无法让它正常工作,所以我有疑问。我会试试这个并检查它是否有效。无论如何感谢您的信息。顺便说一句,用户会注意到服务在唤醒后以任何方式运行了大约 5 秒吗?
    • 啊,应用程序死后,警报实际上并没有在转储中显示..
    • 这很奇怪,我在 API 21 上尝试了你的代码,它似乎可以工作。即使应用程序已被杀死并且屏幕已关闭:进程已创建,并且接收者会收到警报。唯一可能不同的是Receiver是静态注册的(否则系统不知道如何重新创建它),但它并没有解释为什么警报会从列表中消失。
    • 感谢您的帮助。我实际上认为我弄清楚了为什么它不起作用。这是由于华为设备中的一些特殊电池设置造成的。找到解释它的这个 StackOverflow 问题。现在测试一下。 stackoverflow.com/questions/34729966/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    相关资源
    最近更新 更多