Android长时间运行服务无通知

3

我看到像Advance Task killer、Watch Dog、eBay、电池小部件等程序都有类似的例子。这些程序会运行一个后台服务来监控设备活动,并使用广播接收器,但是它们提供了一个选项来禁用通知图标的显示。目前,我的应用程序通过调用以下命令无故障地工作:

Context context = getApplicationContext();
Intent intent = new Intent(context, SomeBackGroundService.class);
context.startService(intent) 

然后在我的服务中,我正在调用:

startForeground(NOTIFICATION_ID, notification);

现在问题来了,其他应用是如何运行长时间的广播接收器而不显示通知图标的呢?我需要怎么做才能禁用/隐藏该图标并将此功能添加到我的应用程序中呢?
提前感谢您。

你提到的那些应用程序不能保证持续运行。如果系统需要释放内存,它将在必要时终止它们。 - Johann
3个回答

5

虽然我不是专家,但我不同意接受的答案。

您的startForeground是确保您的服务继续运行的关键。

如果没有这个,它可能会继续运行,但其优先级较低,因此更有可能被系统杀死。


这是一个事实,我已经观察到它正在发生。文档清楚地表明,如果需要释放内存,您的服务将会被杀掉。 - Johann
无论如何,我最终没有选择这条路。我的服务器被攻击并且数据丢失了。我编写了一个扩展广播接收器并将数据存储到我的偏好文件中的类。因此它始终处于监听状态。我启动服务线程来处理当我获得预期意图时应执行的操作。这非常完美地运行。 - Havoc

-1

您的服务完全独立于是否存在通知。如果您删除了startForeground这一行,服务将继续运行。服务停止的唯一时机是调用context.stopService()或stopSelf()。在您的服务中添加一些日志,您会发现它仍然在运行。

覆盖onStartCommand以确定垃圾回收后服务的行为:

 @Override
 public int onStartCommand(Intent intent, int flags, int startId() {
      super.onStartCommand(intent, flags, startId);
      doWork();
      return START_STICKY;
 }

START_STICKY会在垃圾回收后重新创建您的服务。START_REDELIVER_INTENT将使用原始意图在垃圾回收后重新创建您的服务,仅在需要额外意图数据时使用。


我会再试一次,但是过去当我有这样的代码时,服务或广播接收器中的一个会被杀死。我的应用程序是一个长时间运行的服务,用于在监听特定设备相关事件时触发新事件或日志。 - Havoc
好的,我从我的服务中删除了startForeground(NOTIFICATION_ID,notification);并用mNotificationManager.notify(NOTIFICATION_ID,notification)替换它。现在,在我的服务运行一段时间后,广播接收器停止接收。有什么想法吗? - Havoc
我进一步研究了这个问题。发现我的广播接收器停止了监听。我认为它被垃圾回收了。 - Havoc
如果系统需要释放内存,而未使用startForeground,则服务将被终止。这一点已经有明确的文档说明。 - Johann
@AndroidDev START_STICKY 使得服务在终止后会重新启动,这也有明确的文档说明。 - Zaid Daghestani
显示剩余3条评论

-3
创建一个包含 PNG 图标的通知,宽高均为 1 像素,并将该像素设为透明。

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