gpt4 book ai didi

android - 即使服务正在运行,如果服务在 OOM kill 后由系统重新启动,peekService() 也会返回 null

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:47:36 25 4
gpt4 key购买 nike

我正在使用

启动服务
startService(new Intent(this, RelayService.class));

然后服务使用

启动警报
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, SyncAlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + SYNC_EVERY_MS, SYNC_EVERY_MS, pi);

然后 BroadcastReceiver SyncAlarmReciver 正在尝试使用

RelayServiceBinder relay = (RelayServiceBinder) 
peekService(context, new Intent(context, RelayService.class));

一切正常,直到其他应用程序需要更多内存时应用程序被杀死后系统重新启动服务。重新启动后,服务使用相同的代码重新启动警报,但 peekService() 返回 null。通过调试消息,我看到服务和广播接收器中的 context 是相同的, RelayService 对象也是相同的,即这些对象是内存中的相同对象。我该如何解决这个问题?

如果有帮助,这里是提到的三段代码的链接:main activity , service , broadcast receiver .

附言我知道该服务正在连续运行,因为我正在密切观察该过程并看到它运行良好并且没有以任何方式重新启动,还因为我看到它在启动警报之前打开的连接不会被打扰。

最佳答案

正如 JesusFreke 所建议的,问题在于 peekService() 只能返回一个existing IBinder 对象。由于系统重新启动了服务,此时没有 Activity 绑定(bind)到服务,因此 IBinder 对象尚不存在。所以返回了一个null。遗憾的是文档完全忽略了这一事实。

因为我绝对不想在服务未运行时启动服务,所以使用 startService() 似乎是个坏主意,所以我求助于查询服务的静态属性(这反正在那里)。

关于android - 即使服务正在运行,如果服务在 OOM kill 后由系统重新启动,peekService() 也会返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27391858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com