正在进行的通知和singleTop-Flag

时间:2013-07-24 19:36:20

标签: android-intent android-notifications android-pendingintent

大多数熟悉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”因为文档说我应该。即使活动已经在最前面,这也会创建一项新任务,与文档所说的内容相对应:PendingIntentFLAG_ACTIVITY_NEW_TASK

有没有人遇到同样的问题?如何构建一个持久性通知,在单击时不会被忽略,并且如果堆栈中的某个位置将活动置于顶部,否则会创建它的新实例?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这是不正确的:

PendingIntent startIntent = PendingIntent.getActivity(context, 0, activityIntent,  Intent.FLAG_ACTIVITY_SINGLE_TOP);

您正在将Intent标记传递给getActivity()getActivity()的第4个参数需要PendingIntent个标记,例如:

  • PendingIntent.FLAG_CANCEL_CURRENT
  • PendingIntent.FLAG_NO_CREATE
  • PendingIntent.FLAG_ONE_SHOT
  • PendingIntent.FLAG_UPDATE_CURRENT

您正在传递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,就像在原始代码中一样。