我有一个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但它没有任何区别。
感谢。
答案 0 :(得分:4)
退出功能会停止服务,释放唤醒锁定,并让Android终止进程
如果你暗示你有一个连续的WakeLock
,除非这只是在永久插入的设备上运行,否则你的用户会用鳟鱼打你。
此外,Android可以随时终止进程。不要将startForeground()
误认为Android永远不会破坏您的流程。
但是当它从任务管理器中被杀死时,看起来几乎就像警报被取消了一样。
我不知道“任务管理器”是什么,因为Android中没有。如果您指的是“设置”中正在运行的应用列表,然后单击“强制停止”,则表示“是”,它会取消任何未完成的警报,并阻止您的应用再次运行,直到手动启动某个组件(例如,用户从启动器启动您的应用) )。
我是否在如何正确设置警报方面做错了什么?
可能不是。强制停止肯定会消除你的警报。
答案 1 :(得分:0)
我因同一问题失去了1个月的时间。终于我找到了解决方案。从大于21的Android版本开始,引入了一个名为“自动启动”的选项,这意味着用户可以实际配置是否可以自动启动任何应用程序。因此,请检查您的应用是否具有自动启动权限。根据手机制造商的不同,该设置位置可能有所不同。因此,您需要在手机设置中搜索“自动Lanuch”选项。 即使不起作用,也请尝试从“优化列表”中删除您的应用,您可以在设置中找到该应用。