56

这似乎是一个常见问题,我已经解决了所有我能找到的相关问题: 活动没有接收新的意图为什么在 android 通知意图中没有发送额外的数据(整数)?, Notification 通过旧的 Intent Extras , Can't put extras for an intent in notification , 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.getActivity我尝试了( FLAG_UPDATE_CURRENT, FLAG_CANCEL_CURRENT, )的不同标志FLAG_ONE_SHOT,但这些都没有帮助。

如代码所示,我使用 getCurrentMillis 来确保 requestID 发生变化......

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

我错过了一些非常简单的东西吗?

4

7 回答 7

56

通知 Intent 的设置FLAG_ACTIVITY_NEW_TASK将导致以下情况:

  • 如果 Activity尚未在任务中运行,则将启动一个新任务并将 Intent 传递给onCreate()

  • 但是,如果活动已经在任务中运行,则该任务将被带到前台。就这样。Intent不会被传递,onNewIntent()也不会被调用。

如果您希望实际交付Intent,您需要指定:

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

Activity 的存在与否无关紧要,您仍然必须在 Intent 中指定。launchModesingleTopIntent.FLAG_ACTIVITY_SINGLE_TOP

注意:如果 Activity 已经在任务中运行,并且该 Activity不在该任务中的 Activity 堆栈顶部,则该任务将被带到前台。就这样。Intent 将不会被交付。实现这一点的唯一方法是添加Intent.FLAG_ACTIVITY_CLEAR_TOP到其他 2 个标志,但这可能不是您想要发生的(取决于您的具体情况)。

在http://code.google.com/p/android/issues/detail?id=17137上查看我在 Google 代码上的(仍然)未决问题

于 2012-07-19T15:15:21.250 回答
54

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

示例代码:

PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
于 2014-05-14T07:59:12.480 回答
7
  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);
           ... 
     }
    
于 2015-12-17T13:38:37.867 回答
3

您可以按照以下方式发送附加信息

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

要在测试活动类中获得 Intent 额外价值,您需要编写以下代码:

Intent intent = getIntent();
 String extra = intent.getStringExtra("extra") ;
于 2016-05-20T12:41:26.477 回答
0

更简单的方法:真正的问题是,指向同一个目标的意图被替换了。我刚刚通过创建一个新服务“NotificationDismissalService”解决了这个问题。访问该服务的唯一意图是 setDeleteIntent 项。因为它是一项独特的服务,所以参数不会被替换。NotificationDismissalService 的主体(它实际上是每个唯一意图类型的一个这样的解雇服务)是“onStartCommand”的一个简单实现,它将意图发送到首选服务(读取/写入正确的参数)。因为这是服务的实际发送,中间没有挂起的意图,所以它工作得很好。

于 2014-02-02T03:33:14.240 回答
0

我用过这样的东西

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

在此处查看完整示例

于 2017-01-16T10:35:35.217 回答
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
于 2021-07-27T07:38:45.870 回答