来自通知的意图没有额外内容

时间:2012-07-18 22:17:00

标签: android android-intent android-notifications

这似乎是一个常见的问题,我经历了我可以找到的所有相关问题: Activity isn't picking up new intentWhy extra data (integer) is not sent in android notification intent?Notification passes old Intent ExtrasCan't put extras for an intent in notificationandroid pending intent notification problem;但仍然无法弄清楚这一点。

问题是一样的。我设置了一个带有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);

实际上不存在bundle(getExtras()返回null)。

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

如代码所示,我使用getCurrentMillis来确保requestID更改....

还发现在MyActivity中,onCreateonNewIntent未被调用。只有onResume。即使设置了FLAG_ACTIVITY_NEW_TASK ......?

我错过了一些非常简单的事情吗?

7 个答案:

答案 0 :(得分:46)

为通知设置FLAG_ACTIVITY_NEW_TASK意图将导致以下内容:

  • 如果活动已在任务中运行,则将启动新任务,并将意图传递到onCreate()

    <中的活动/ LI>
  • 但是,如果活动已在任务中运行,则该任务将被带到前台。就这样。意图将,并且不会调用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

上查看我的(仍然)未解决的Google代码问题

答案 1 :(得分:38)

我刚刚将PendingIntent.FLAG_UPDATE_CURRENT标志添加到我的待定意图中,它开始为我工作(跳过了Intent的所有标志)。

示例代码:

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

答案 2 :(得分:4)

  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(intent);

    重置您在onNewIntent()内的活动中的额外内容
    protected void onNewIntent(Intent intent) {
           setIntent(intent);
           ... 
     }
    

答案 3 :(得分:0)

更简单的方法:真正的问题是,对同一目标的意图被替换。我刚刚创建了一个新服务“NotificationDismissalService”来解决这个问题。进入该服务的唯一目的是setDeleteIntent项。因为它是一项独特的服务,所以参数不会被替换。 NotificationDismissalService的主体(并且它实际上是每个唯一意图类型的一个这样的解雇服务)是“onStartCommand”的简单实现,其向优选服务发送意图(读取/写入正确的参数)。因为这是一个服务的实际发送,中间没有pendingintent,所以它可以正常工作。

答案 4 :(得分:0)

您可以按照意图发送附加内容

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);

要在Test Activity类中获取Intent额外值,您需要编写以下代码:

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

答案 5 :(得分:0)

我使用过这样的东西

1  =IF(ISNUMBER(SEARCH("X",A4)),0,A1)
2  =IF(ISNUMBER(SEARCH("X",A4)),0,A2)
3  =IF(ISNUMBER(SEARCH("X",A4)),0,A3)
4  =IF(ISNUMBER(SEARCH("X",A4)),0,A4)
5  =IF(ISNUMBER(SEARCH("X",A8)),0,A5)
6  =IF(ISNUMBER(SEARCH("X",A8)),0,A6)
7  =IF(ISNUMBER(SEARCH("X",A8)),0,A7)
8  =IF(ISNUMBER(SEARCH("X",A8)),0,A8)

查看完整示例here

答案 6 :(得分:0)

当应用程序未运行或处于后台并且用户点击托盘中的通知时,您可以获得额外的 Intent 并检查密钥:

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("RC","MainActivity.onCreate() called");

    if (getIntent().getExtras() != null){
        Bundle extra = getIntent().getExtras();
        Log.d("RC", "MainActivity.onCreate() : keys count = " + extra.keySet().size());

        for ( String key : extra.keySet()) {
            Log.d("RC","MainActivity.onCreate() : key = " + key + " = " + extra.getString(key));
        }

    }
}

这将显示:

D/RC: MainActivity.onCreate() called
D/RC: MainActivity.onCreate() : keys count = 8
D/RC: MainActivity.onCreate() : key = google.delivered_priority = high
D/RC: MainActivity.onCreate() : key = google.sent_time = null
D/RC: MainActivity.onCreate() : key = google.ttl = null
D/RC: MainActivity.onCreate() : key = google.original_priority = high
D/RC: MainActivity.onCreate() : key = from = 631131412302
D/RC: MainActivity.onCreate() : key = google.message_id = 0:1627370460932539%952b1da9952b1da9
D/RC: MainActivity.onCreate() : key = gcm.n.analytics_data = null
D/RC: MainActivity.onCreate() : key = collapse_key = com.reflectcode.demo.cloudmessaging