【问题标题】:How to make an alarm live even when the application which set it is killed?即使设置警报的应用程序被杀死,如何使警报生效?
【发布时间】:2014-04-01 20:31:31
【问题描述】:

我对设置闹钟有点困惑。如果有人可以提供反馈或一些提示,将不胜感激。总而言之,这是我的情况:

在我的应用程序中,我设置了一个闹钟:

////////////////////////
// Set an alarm

// Actually I set a unique id here. The hardcoded value is for simplicity only.
int id = 123454321;

Intent intent = new Intent(context, MyAlarm.class);
PendingIntent sender = PendingIntent.getBroadcast(context, id, intent, 0);

long firstTime = SystemClock.elapsedRealtime();
firstTime += 10*1000;

AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 15*1000, sender);
////////////////////////

////////////////////////
// MyAlarm implementation
public class MyAlarm extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        // Do some periodic work here
    }
}
////////////////////////

当我设置闹钟时,一切都很好。当我使用命令时,我可以看到我的警报:

    adb shell dumpsys alarm

即使我的应用程序进入后台,我也能看到警报。

接下来我通过

手动杀死我的应用程序

设置-应用程序-管理应用程序--强制停止

当我重新发出命令“adb shell dumpsys alarm”时,我发现我的警报消失了。这让我觉得当我的应用程序进入后台并且框架将其杀死以释放资源时,我的警报也会被杀死。但是,我想要一个警报,它会独立于应用程序是否正在运行。有没有人有提示如何做到这一点?

【问题讨论】:

  • 考虑使用服务?即使这样,服务也有可能被杀死,你可以给服务更高的优先级,这样你的服务被杀死的可能性就最小了。
  • 是的,我也尝试过服务,但服务也被杀死了。我从另一个平台上的 Mark Murphy 那里得到了关于这个主题的评论,他说手动停止这样的应用程序不会模拟操作系统行为。

标签: android alarm


【解决方案1】:

我有一个应用程序,它会设置闹钟然后消失。

我使用的代码是:

清单:

    <receiver android:name=".AlarmReceiver" android:process=":remote"></receiver>

待定意图代码:

    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.putExtra("ALARM_MESSAGE", alarmMessage);
    PendingIntent receiverIntent =
        PendingIntent.getBroadcast(context,
        MyConstants.UPDATE_ALARM, intent,
        pendingIntent.FLAG_UPDATE_CURRENT);

设置(实际上是取消旧并重置):

    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    am.cancel(receiverIntent); // get rid of previous if unfired.
    am.set(AlarmManager.RTC_WAKEUP, calcTime.afterMidnight(), receiverIntent);

pendingIntent 触发接收器,接收器做一些快速的工作,发送通知,然后离开。接收方不必发布通知。它可以启动一个有意图的活动,发送一条祝酒消息等。

我有一个接收器,可以在启动后恢复警报。 (警报确实会在断电时消失。)

【讨论】:

  • 感谢您的回答。我试过了,但是设置-应用程序-管理应用程序--强制停止之后警报仍然被移除
  • 强制停止将关闭一切。在过去,这就是所谓的异常结束。异常结束。当您通过设置强制停止时,您是在告诉 Android 操作系统该应用程序存在重大问题,您希望将其完全删除。你的应用程序有问题吗?如果没有,则需要使用finish()正常退出。
  • PS:我错过了你在我第一次阅读时强迫停止的事实。
  • 感谢您的澄清。我试图模拟框架杀死应用程序以释放资源的情况。然而,看起来,“强制停止”并没有模拟这种情况。
  • 您将有两个主要的例程(还有更多,但通常不需要)将被击中。 onPause 和 onStop。您可以通过按 Home 键来测试 onPause。可以通过在主线中执行 finish() 来测试 on stop。例如退出按钮。您可以使用 log.d 来跟踪并确保它们在模拟器中工作。设备上的临时 toast 消息。
【解决方案2】:

我猜您的接收器对象尚未在清单中注册。如果您在清单文件中注册了接收器对象,那么即使您的应用程序没有运行,系统也会找到并调用它。

【讨论】:

  • 感谢您的提示,但我在清单中注册了接收器。我在清单文件中有一行 。显然,在手动停止应用程序后,该应用程序启动的所有警报和服务也会被删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多