9

我有一个 Android 应用程序,该应用程序具有在后台运行的服务,与远程服务器通信并在需要时向用户显示通知。该应用程序还具有供用户交互的活动。

要求之一是应用程序需要在早上自动启动。在一天结束时,用户可以自由地退出应用程序(退出功能会停止服务,释放唤醒锁,并让 Android 终止进程)。为了自动重新启动应用程序,我正在使用 AlarmManager 和 PendingIntent 安排警报:

    //create intent to alert OnStartReceiver when alarm goes off
    Intent i = new Intent(context, OnStartReceiver.class);
    i.setAction("com.pointtrace.intents.alarm");
    i.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION|Intent.FLAG_FROM_BACKGROUND);


    //wrap inside PendingIntent so that it can be used from outside
    //our application
    PendingIntent pi = PendingIntent.getBroadcast(context, 1, i, PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

    Log.d("GXT", "Scheduling alarm action(i)=" + i.getAction());

    //set alarm to go off at wake time
    alarms.set(AlarmManager.RTC_WAKEUP, getWakeTime(), pi);

OnStartReceiver 类注册为接收广播,并在发生警报时重新启动应用程序。

除非用户从任务管理器中终止应用程序,否则一切正常。如果应用程序被 Android 操作系统杀死或我调用 System.exit(0) 正常退出;它重新启动正常。但是当它从任务管理器中被杀死时,看起来几乎就像警报被取消了。

我在 Android 文档中找不到任何暗示任务管理器会取消警报的内容。我在如何正确设置警报方面做错了吗?

我试过删除标志并只使用 0 但它没有任何区别。

谢谢。

4

2 回答 2

8

退出功能停止服务,释放唤醒锁,并让 Android 终止进程

如果你暗示你有一个连续的WakeLock,除非它只在永久插入的设备上运行,否则你的用户会用鳟鱼打你。

此外,Android 可以随时终止进程。不要误startForeground()认为 Android 永远不会杀死您的进程的某种保证。

但是当它从任务管理器中被杀死时,看起来几乎就像警报被取消了。

我不知道“任务管理器”是什么,因为 Android 中没有。如果您指的是设置中正在运行的应用程序列表,然后单击强制停止,那么是的,这会取消任何未完成的警报并阻止您的应用程序再次运行,直到手动启动您的组件之一(例如,用户从启动器启动您的应用程序)。

我在如何正确设置警报方面做错了吗?

可能不是。强制停止绝对可以消除您的警报。

于 2012-07-25T20:57:42.790 回答
0

我为同一个问题浪费了 1 个月的时间。最后我找到了解决方案。从 Android 版本 > 21 开始,引入了一个名为“自动启动”的选项,这意味着用户可以实际配置是否可以自动启动任何应用程序。因此,请检查您的应用是否具有自动启动权限。此设置位置可能因手机制造商而异。因此,您需要在手机设置中搜索此“自动启动”选项。即使它不起作用,也请尝试从“优化列表”中删除您的应用程序,您可以在设置中找到它。

于 2018-07-11T20:18:16.267 回答