从通知的意图没有额外(Intent from notification does not have

2019-06-26 09:44发布

这似乎是一个普遍的问题,我经历了所有相关的问题,我能找到已经来到: 活动不拿起新的意图 , 为什么额外的数据(整数)没有在Android通知意向发送? , 通知通过老意图额外 , 不能把临时演员在通知的意图 , Android的意图未决问题的通知 ; 但仍然无法想出解决办法。

问题是一样的。 我设置了一个的PendingIntent携带通知一些额外的信息,我不明白这一点在另一边。

下面是用于生成通知的代码:

Notification notification = new Notification(R.drawable.icon, getResources().getString(R.string.notification_ticker), System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;

Intent start_test = new Intent(this, MyActivity.class);
start_test.putExtra("start_test", true);
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent pi = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), start_test, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(this, getResources().getString(R.string.notification_title), getResources().getString(R.string.notification_content, expired), pi);
nm.notify(NOTIFICATION_ID, notification);

而在另一边:

boolean start_test=getIntent().getBooleanExtra("start_test", false);

该包实际上是不存在(getExtras()返回null)。

我尝试了不同的标志为PendingIntent.getActivityFLAG_UPDATE_CURRENTFLAG_CANCEL_CURRENTFLAG_ONE_SHOT ),没有这些帮助的。

正如代码所示,我用getCurrentMillis确保的RequestID变化....

还发现,在MyActivity, onCreateonNewIntent没有得到调用。 唯一onResume是。 即使FLAG_ACTIVITY_NEW_TASK设置...?

我缺少的东西很简单呢?

Answer 1:

设置FLAG_ACTIVITY_NEW_TASK的通知意向将导致以下后果:

  • 如果活动尚未在任务运行时,新的任务将被启动,并且打算将传递到活动onCreate()

  • 然而,如果活动已经在运行的任务,该任务将被带到前台。 就这样。 意图将不会传递和onNewIntent()不会被调用。

如果你想的意图, 实际交付您需要指定:

start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);

它使没有差别是否launchMode活动是singleTop与否,你还必须指定Intent.FLAG_ACTIVITY_SINGLE_TOP的意图。

注意:如果活动已在任务运行和活动是不是在任务活动堆栈的顶部,任务将被推上前台。 就这样。 意图将不会被发表。 做的唯一方法这一点是添加Intent.FLAG_ACTIVITY_CLEAR_TOP其他2个标志,但是这可能不是你想要发生(取决于您的具体情况)。

见我(还)在谷歌代码开放问题在http://code.google.com/p/android/issues/detail?id=17137



Answer 2:

我刚添加的PendingIntent.FLAG_UPDATE_CURRENT标志,以待处理的意图,并开始为我工作(跳过意图所有标志)。

示例代码:

PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);


Answer 3:

  1. 如果不需要则避免设置在明显的活动作为一个单一的任务。 省略这一行,或者你可以把它改成singleTop:

      android:launchMode="singleTask” 
  2. 如果你必须有一个任务,然后在待定意图的标志集合到:意向。 FLAG_ACTIVITY_NEW_TASK | 意图。 FLAG_ACTIVITY_CLEAR_TASK和的PendingIntent。 FLAG_CANCEL_CURRENT。

     resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK); pIntent = PendingIntent.getActivity(context, 0, resultIntent, PendingIntent.FLAG_CANCEL_CURRENT ); 
  3. 如果你有一个单一的任务-通过setIntent(意向)重置您的临时演员在里面onNewIntent()的活动;

     protected void onNewIntent(Intent intent) { setIntent(intent); ... } 


Answer 4:

更简单的方法:真正的问题是,意向,为同一个目标,被替换。 我已经刚刚创建了一个新的服务,“NotificationDismissalService”解决了这个。 去到该服务的唯一目的是setDeleteIntent项目。 因为它是一个独特的服务,参数不被替换。 NotificationDismissalService的主体(和这将真正是每个唯一意图类型一个这样解雇服务)是一种简单的实现发送的意图的优选服务(读/写正确的参数)“onStartCommand”的。 因为这是一个服务于之间的实际发送,没有的PendingIntent,它工作得很好。



Answer 5:

您可以在下面的意图发送方式演员

PendingIntent contentIntent ;
Intent intent = new Intent(this,TestActivity.class);
intent.putExtra("extra","Test");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);

stackBuilder.addParentStack(ArticleDetailedActivity.class);

contentIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

要获得测试Activity类意向额外的价值,你需要编写如下代码:

Intent intent = getIntent();
 String extra = intent.getStringExtra("extra") ;


Answer 6:

我用这样的事情

Intent myIntent = new Intent(context, DoSomething.class);
 PendingIntent pendingIntent = PendingIntent.getActivity(
        context, 
        0, 
        myIntent, 
        Intent.FLAG_ACTIVITY_NEW_TASK);

退房的完整的例子在这里



文章来源: Intent from notification does not have extras