4

我的 android 应用程序启动了一项服务来收听耳机按钮。在服务运行时,我想显示一个通知。因为它不会被杀死也很重要,所以我决定在我的服务中使用 startForeground 函数。

在服务的 OnCreate 中,我启动 BuildNotification():

 public void BuildNotification() {

    // Make sure the launch mode of the activity is singleTask, otherwise it will create a new one
    Intent intent = new Intent(this, ListItemsActivityScroll.class);
    PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);

     // Build notification
     note = new NotificationCompat.Builder(this)
             .setContentTitle(getString(R.string.notification_text))
             .setSmallIcon(R.drawable.vp_launcher)
             .setContentText(getString(R.string.notification_content))
             .setContentIntent(pIntent).build();

     startForeground(1, note); 
  }

第一次启动服务时,通知会显示并停留在状态栏中,直到服务被销毁。但是,如果第二次创建该服务,它只会显示几秒钟。

消失后,服务仍在运行。我还执行了“adb shell dumpsys 活动服务”,它确实显示了服务正在前台运行,并且还为我提供了设置为通知的正确标志:

isForeground=true foregroundId=1     foregroundNoti=Notification(contentView=com.example.mediabuttontest/0x10900a7 vibrate=null,sound=null,defaults=0x0,flags=0x62)

0x62 标志表示以下处于活动状态:FLAG_FOREGROUND_SERVICE、FLAG_NO_CLEAR、FLAG_ONGOING_EVENT

我认为这对于保持通知处于活动状态是正确的。

有人理解这种行为吗?为什么它在第一次创建服务时起作用,但在第二次创建时不起作用?我的代码有错误吗?

编辑:感谢您的时间和评论,我创建了另一个测试应用程序并开始删除代码,直到问题消失。最后,它是由启用/禁用广播接收器组件引起的:

        pm.setComponentEnabledSetting(mRemoteControlResponder,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

不知何故,这使通知消失了。在文档中还提到“DONT_KILL_APP”可以使您的应用程序行为不可预测:

设置时要小心,因为更改组件状态会使包含应用程序的行为变得不可预测。

我想这是真的:)

4

0 回答 0