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