从 Android 通知传递数据

Passing Data from Android Notifications

我创建了一个通知并正确显示了它,但我不知道如何将数据传递给 activity。我从意图中提取了一个字符串作为通知的标题显示,但我需要提取第二个字符串,并让 NotificationHandlerActivity 处理它。

//里面的intentservice

private void sendNotification(Bundle extras) {
    Intent intent=new Intent(this, NotificationHandlerActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("link", extras.getString("link"));
    mNotificationManager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
    long[] vibrate = {100L, 75L, 50L};
    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.abc_ic_menu_copy_mtrl_am_alpha)
                    .setContentTitle(extras.getString("title"))
                    .setOngoing(false)
                    .setAutoCancel(true)
                    .setVibrate(vibrate);
    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}

//NotificationHandlerActivity里面

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle b = getIntent().getExtras();
}

像这样使用它:

Intent intent=new Intent(this, NotificationHandlerActivity.class);
intent.putExtra("key", "value");

mNotificationManager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
long[] vibrate = {100L, 75L, 50L};
NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.abc_ic_menu_copy_mtrl_am_alpha)
                .setContentTitle(extras.getString("title")) 
                .setOngoing(false) 
                .setAutoCancel(true) 
                .setVibrate(vibrate);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

你应该在你的 Intent 中使用额外的东西。因为您的意图目前是匿名的,所以您不能这样做。 Extras 是基本的键值存储。见下文:

public static final String KEY_SECOND_STRING = "keySecondString";
...

    ...
    String secondString = "secondString";
    mNotificationManager = (NotificationManager)     
         this.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent intent = new Intent(this, NotificationHandlerActivity.class);
    intent.putExtra(KEY_SECOND_STRING, secondString);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
    ...

然后,从您的 NotificationHandlerActivity,您可以从意图访问 secondString。

@Override
public void onCreate(Bundle sIS){
    super.onCreate();
    String secondString = getIntent().getStringExtra("keySecondString");
    ...
}

显然,在 PendingIntent 上调用 getActivity() 时使用 0 作为 requestCode 不是正确的方法。我将其更新为仅使用 System.currentTimeMillis() 并且这似乎有效。我假设我第一次构建通知时使用 0 作为 requestCode,额外的内容不存在。