【问题标题】:Service crashes on 'death' of Activity活动“死亡”时服务崩溃
【发布时间】:2011-09-27 15:56:17
【问题描述】:

我有一个启动服务的 Activity。

在我的活动中:

startService(new Intent(this, MyService.class));

在我的服务中,onStart():

/* Show notification */
int icon = R.drawable.icon;
tickerText = getResources().getString(R.string.app_name);
long when = System.currentTimeMillis();
contentTitle = getResources().getString(R.string.app_name);
contentText = getResources().getString(R.string.running);

Intent notificationIntent = new Intent(this, activityClass).setAction(Intent.ACTION_MAIN).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification = new Notification(icon, tickerText, when);
notification.setLatestEventInfo(this, contentTitle, contentText, contentIntent);

notification.flags = Notification.FLAG_ONGOING_EVENT;

((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).notify(0, notification);

startForeground(0, notification);

该服务有一个计时器,它每 3-4 分钟执行一次工作,并在可能的情况下向 Activity 广播信息。当 Activity 关闭时,Service 应该继续工作。

当我运行应用程序并返回主屏幕时,服务会继续运行。但过了一会儿,我收到了这些 logcat 消息,服务停止了:

07-03 16:55:09.440:INFO/ActivityManager(583):进程 com.myapp (pid 11665) 已死亡。 07-03 16:55:09.440: WARN/ActivityManager(583): 计划在 5000 毫秒内重新启动崩溃的服务 com.myapp/.MyService

如何防止这种情况发生?

【问题讨论】:

  • 好的,如何防止进程死机?

标签: android service crash


【解决方案1】:

提供的答案对我没有帮助。但是我找到了一个非常简单的方法来做到这一点,添加清单

    <service android:name="..." android:process=":remote" />

http://developer.android.com/guide/topics/manifest/service-element.html

目前只是测试,我的 Activity 已经被杀死,但我的服务正在运行。

【讨论】:

    【解决方案2】:

    当我运行应用程序并返回主屏幕时,服务会继续运行。但过了一会儿,我收到了这些 logcat 消息,服务停止了……我该如何防止这种情况发生?

    一般来说,你不会。

    服务并非旨在永远运行。太多的开发人员已经启动了服务并且从未停止过它们。而且,就您而言,他们这样做是没有充分理由的。让服务在内存中徘徊只是看着时钟滴答声是浪费的,尤其是因为开发人员会这样做,Android 会在服务停留太久后“崩溃”服务。

    在您的情况下,请切换到使用AlarmManager,可能与IntentService 结合使用,这样当没有更多工作要做时,服务会自动关闭。

    【讨论】:

    • 我尝试使用 AlarmManager,但如果可能的话,我更喜欢一种解决方法,因为我正在使用分析。这些是在一个必须相同的上下文中启动和关闭的。当我关闭服务时,上下文会丢失,我无法关闭分析实例。还是有其他方法可以做到这一点? (顺便说一下,我正在使用 Flurry)。
    • @Niek:“或者还有其他方法吗?” - 自己跟踪使用数据。或者切换到另一个分析包,该包旨在与服务一起使用。
    【解决方案3】:

    您需要考虑让您的服务作为Remote Service 运行,以便它在自己的进程中运行。

    关于远程服务的博客: http://saigeethamn.blogspot.com/2009/09/android-developer-tutorial-part-9.html

    示例示例: http://about-android.blogspot.com/2010/02/android-remote-service-sample.html

    【讨论】:

    • 这意味着应用程序在活动期间占用两倍的 RAM,这会浪费应用程序并使情况变得更糟。
    • @CommonsWare - Activity 可能不需要一直运行,但无论如何,如果应用程序需要工作,并且由于 Activity 结束而停止,则需要找到一些解决方案。
    • @James Black:服务总是要被关闭,理想情况下是由开发人员关闭,然后是用户(任务杀手、设置应用程序等),然后是操作系统(这里发生了什么案子)。任何假设服务将永远存在的应用程序设计从根本上是有缺陷的。此外,与本地服务相比,这种方式的“远程服务”不会被用户或操作系统停止。
    • @CommonsWare - 但是 Activity 的死亡不会杀死远程服务。这就是 OP 遇到的问题,所以我能看到的唯一解决方法是远程服务。在不知道应用程序的用途的情况下,是否需要长期运行的服务是猜测。
    • @James Black:“这是 OP 遇到的问题”——不,不是,尽管 OP 的标题。引用最后一段,“当我运行应用程序并返回主屏幕时,服务继续运行。但过了一会儿我收到这些 logcat 消息,服务停止了。”该活动没有“死亡”,就像一个活动通常在按下 BACK 或离开前台一段时间后被销毁一样。
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多