大多数熟悉Notification和PendingIntent API的人都知道现在不推荐使用setLatestEventInfo。
因此我尝试替换现有代码(取决于弃用的方法):
Context context = getApplicationContext();
Intent activityIntent = new Intent(context, Activity.class);
activityIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Notification notification = new Notification(R.drawable.icon, getString(R.string.notify),System.currentTimeMillis());
PendingIntent startIntent = PendingIntent.getActivity(context, 0, activityIntent, 0);
notification.setLatestEventInfo(context, getString(R.string.notify), getString(R.string.notifysummary), startIntent);
this.startForeground(1234,notification);
正如您可能猜到的那样,我是在后台运行的服务中调用它。服务启动时,会显示通知。这是一个持久的持续通知,它将活动“Activity.class”置于前面,以防它存在并创建活动的新实例,以防它同时被杀死。工作正常没有任何问题。
现在,想要迁移到更新的API级别,我尝试使用以下NotificationBuilder示例替换上述代码:
Context context = getApplicationContext();
Intent activityIntent = new Intent(context, Activity.class);
activityIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent startIntent = PendingIntent.getActivity(context, 0, activityIntent, Intent.FLAG_ACTIVITY_SINGLE_TOP);
Notification notification = new Notification.Builder(context).setSmallIcon(R.drawable.ic_launcher).setContentText("App running").setContentTitle("My app").setOngoing(true).setAutoCancel(false).setContentIntent(startIntent).build();
this.startForeground(1234,notification);
但点击通知没有任何效果。但是,我已经尝试了“Intent.FLAG_ACTIVITY_NEW_TASK”因为文档说我应该。即使活动已经在最前面,这也会创建一项新任务,与文档所说的内容相对应:PendingIntent,FLAG_ACTIVITY_NEW_TASK。
有没有人遇到同样的问题?如何构建一个持久性通知,在单击时不会被忽略,并且如果堆栈中的某个位置将活动置于顶部,否则会创建它的新实例?
感谢您的帮助。
答案 0 :(得分:2)
这是不正确的:
PendingIntent startIntent = PendingIntent.getActivity(context, 0, activityIntent, Intent.FLAG_ACTIVITY_SINGLE_TOP);
您正在将Intent
标记传递给getActivity()
。 getActivity()
的第4个参数需要PendingIntent
个标记,例如:
您正在传递Intent.FLAG_ACTIVITY_SINGLE_TOP
作为第4个参数。该constance实际上具有值0x20000000。巧合的是,PendingIntent.NO_CREATE
的值也是0x20000000,所以你所做的与此相同:
PendingIntent startIntent = PendingIntent.getActivity(context, 0, activityIntent, PendingIntent.NO_CREATE);
那是你的问题。
只需将第4个参数设置为getActivity()
至0
,就像在原始代码中一样。