当前位置: 首页 > 知识库问答 >
问题:

在Android中控制重启崩溃服务的时间

柴飞星
2023-03-14

我正在尝试制作一个粘性服务,该服务在死亡后不久就会重新启动(例如,因为Android已经杀死了它以释放内存)。(Un)幸运的是,我在Android 5.0.1上,它有一个漂亮的内存泄漏错误,使真正的测试变得容易。

看着logcat我看到:

I/ActivityManager(  943): Process com.app.my (pid 28834) has died
W/ActivityManager(  943): Scheduling restart of crashed service com.app.my/com.service.my in 191688ms
I/ActivityManager(  943): Process com.app.my (pid 30842) has died
W/ActivityManager(  943): Scheduling restart of crashed service com.app.my/com.service.my in 766752ms

后来时间上升到3M,使其不可接受。

我试图使用AlarmManager和重新启动意图来解决这个问题:

    Intent restartIntent = new Intent(activity, activity.getClass());
    restartIntent.putExtra("config", config);
    PendingIntent restartAct = PendingIntent.getActivity(
       activity.getApplicationContext(), 0, restartIntent, PendingIntent.FLAG_NO_CREATE);
    AlarmManager alarmManager = (AlarmManager)activity.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 60000, 60000, restartAct);

然而,这没有帮助。我在日志中找不到任何信息,所以可能是AlarmManager重复在activity终止后被放弃,或者可能是我做错了什么?

我在观察WhatsApp应用程序,发现:

I/ActivityManager(  943): Process com.whatsapp (pid 27009) has died
W/ActivityManager(  943): Scheduling restart of crashed service com.whatsapp/.messaging.MessageService in 10947ms
I/ActivityManager(  943): Process com.whatsapp (pid 29913) has died
W/ActivityManager(  943): Scheduling restart of crashed service com.whatsapp/.messaging.MessageService in 10918ms
I/ActivityManager(  943): Process com.whatsapp (pid 30681) has died
W/ActivityManager(  943): Scheduling restart of crashed service com.whatsapp/.messaging.MessageService in 10987ms

第一次和最后一次崩溃与 com.app.my 过程完全相同。不知何故,WhatsApp设法将“重试时间”保持在同一水平,尽管经常崩溃。他们是怎么做到的?这里的答案表明,对于所有aps来说,它应该是相同的:崩溃的服务在很长一段时间后重新启动

备注:

  • 服务返回START_REDELIVER_INTENT
  • 使用onDestroy再次启动活动/服务不是解决方案,因为在这种情况下不会调用它。
  • 我也没有尝试在强制停止后重启(强制停止后重启服务)
  • 我尝试过在onCreate中做“繁忙的工作”。这无助于减少重启时间(Android服务在被强制杀死后重新启动所需的时间)
  • 我不是在启动线程而是在启动活动,所以这在我的情况下是不透明的,对吧?Android:以巨大的延迟安排崩溃服务的重启?
  • 我不能使用通知,所以START_STICKY,前台Android服务在没有通知的情况下消失不是一个解决方案

共有1个答案

沈建柏
2023-03-14

检查:

Intent watchdogIntent = new Intent(getApplicationContext(), SomeClasss.class);
    watchdogIntent.setAction(INTENT_ACTION);

    ((AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE))
            .setInexactRepeating(
                    AlarmManager.ELAPSED_REALTIME,
                    0,
                    currentWatchDogInterval,
                    PendingIntent.getService(
                            getApplicationContext(),
                            0,
                            watchdogIntent,
                            0)
            );
 类似资料:
  • 问题内容: 关于它有几个问题,但我总是读同一本书:“如果系统需要资源,该服务将被杀死”或“您无法构建永远运行的服务,因为它在后台运行的次数越多,越容易受到影响。被系统杀死”等等。 我面临的问题是:我的服务运行正常,并且可以预期,如果我运行我的应用程序,然后退出它,我的服务仍在运行,但是当我杀死我的应用程序时(通过转到“最近的应用程序”并对其进行扫描)离开)服务停止。在这一刻,如果我转到设置>>应用

  • 我有一个问题。在过去的4-5周里,我一直在Eclipse中使用Android,并且虚拟机从未出现过问题(是的,它们很慢。但从未崩溃)。 现在,我相信,自从4.2开始为uni开发一个新项目(截止日期下周)以来,我的4.2虚拟机在启动时突然开始崩溃,因为“内核恐慌”(最后的响应)。 我想问一下我是否有什么可以做的,也许可以下载修补程序或其他什么。API和Eclipse都是最新的,或者我的计算机可能有什

  • 我已经有3到4天没有使用Android Studio 2.3.2了,当我尝试启动它时,突然出现以下错误。请注意,一周前我单独安装了Android Studio 3.0 Canary 1,但一切正常,两个版本都可以正常工作。我不明白为什么我突然在启动Android Studio时遇到了问题。 我使用MacBook。 以下是Android Studio在发布时给出的错误日志: 谢谢你的帮助!

  • 问题内容: 我想每5分钟检查一次服务中的实际时间,然后根据时间将手机静音或取消静音。早些时候,我尝试在线程.sleep(300000)的末尾使用while(true),但是它总是与ANR一起崩溃,所以我尝试使用计时器任务,但是现在它在带有NullPointerException 的行之后崩溃 LogCat: 问题答案: 您需要在onCreate内初始化audioManager。

  • 我开发的应用程序在使用Android Studio进行测试时效果很好。但是在谷歌Play商店发布后遇到了问题。 该应用程序具有多个页面。其中一个页面使用Unity启动AR图像跟踪功能,只需单击一个按钮即可。从Android Studio将应用程序添加到我的手机时完全没有问题,一切正常。但是,当从谷歌Play商店下载时,当单击按钮启动unity时,它会立即崩溃。 我是一个新的Android开发者。任

  • 我正在探索使用Android客户端的Xively框架。我已经安装了演示应用程序中给出的“服务”。当我在Android2.3和4.0设备上启动应用程序时,它就会崩溃。下面是相同的堆栈轨迹,令人惊讶的是它是在Android4.1上工作的。有什么建议可以让它在Android2.3和4.0设备上运行吗 Stacktrace 10-25 18:25:18.854:D/HttpService(17080):o