如何在应用程序被杀死后在后台运行线程

12

我希望每隔 'x' 分钟向用户提供toast通知,我尝试使用service实现此功能,但当应用程序被杀死时,service也停止了。 同样的问题也出现在intent Service中,为了使线程/服务在应用程序被杀死后仍然存在于内存中,我该怎么做?

2个回答

5

您的问题术语有些混淆:

  • 应用程序位于进程中。如果进程被终止,则在该进程中运行的所有内容都将被终止。
  • 如果您想要某些内容在该进程终止后仍然存在,则应使用第二个进程并在其中运行该内容以使其幸存。
  • 服务可以在自己的进程中运行,这似乎是一个不错的选择。请查看服务标记中的android:process属性:http://developer.android.com/guide/topics/manifest/service-element.html

但您想要做的可能更简单:设置重复任务。为此,您可以使用闹钟管理器

例如:

  • 向闹钟管理器提供一个待处理的意图
  • 待处理的意图将触发您自己的服务
  • 服务将被唤醒,然后运行。这有一个优点,不会让您的服务一直运行并计算时间以知道何时唤醒它(这会消耗电池)。在这里,闹钟管理器将在需要时唤醒它,您的服务将只执行其任务并死亡。

如果将此方法与答案的第一部分相结合,使您的服务在不同的进程中运行,则可以实现对Android设备非常轻量级的东西:仅您的服务(在其自己的进程中)将在给定间隔时间内唤醒,而应用程序的进程不会被此闹钟启动,仅服务的进程。

至于Toast通知,是的,服务是一个好地方来实现它,但通知栏可能更适合显示通知并通知用户某个事件发生在后台服务中。


这是解决问题的正确答案。 AlarmManager 确保每 n 分钟调用接收器,无需担心进程是否保持活动状态。然而,Adhikari 的回答更符合所提出的问题。 - velis

4
尝试实现前台服务。前台服务 前台服务会显示通知,直到你想要停止为止。
在你的服务的onCreate中实现以下代码片段。
Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
        System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
        getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);

我想要显示一个Toast,而不是一个通知。 - Dwarakesh Pallagolla
1
如果显示通知,则服务将在前台运行且永不停止;否则,系统将在需要资源时结束它。 - Adhikari Bishwash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接