我的 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”可以使您的应用程序行为不可预测:
设置时要小心,因为更改组件状态会使包含应用程序的行为变得不可预测。
我想这是真的:)