我可以找到一种方法将参数从我的通知发送到我的活动。

I have a service that creates a notification. When the user clicks on the notification I want to open my main activity with some special parameters. E.g an item id, so my activity can load and present a special item detail view. More specific, I'm downloading a file, and when the file is downloaded I want the notification to have an intent that when clicked it opens my activity in a special mode. I have tried to use putExtra on my intent, but cant seem to extract it, so I think I'm doing it wrong.

我的服务中创建通知的代码:

        // construct the Notification object.
     final Notification notif = new Notification(R.drawable.icon, tickerText, System.currentTimeMillis());


    final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
    contentView.setImageViewResource(R.id.image, R.drawable.icon);
    contentView.setTextViewText(R.id.text, tickerText);
    contentView.setProgressBar(R.id.progress,100,0, false);
    notif.contentView = contentView;        

    Intent notificationIntent = new Intent(context, Main.class);
    notificationIntent.putExtra("item_id", "1001"); // <-- HERE I PUT THE EXTRA VALUE
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
    notif.contentIntent = contentIntent;

    nm.notify(id, notif);

从我的活动中试图从通知中获取额外参数的代码:

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);


    Bundle extras = getIntent().getExtras();
    if(extras != null){
        Log.i( "dd","Extra:" + extras.getString("item_id") );
    }

额外的总是空的,我从来没有得到任何东西到我的日志。

顺便说一句……onCreate只在我的活动开始时运行,如果我的活动已经开始,我也想收集额外的内容,并根据我收到的item_id呈现我的活动。

什么好主意吗?


当前回答

AndroidManifest.xml

包括启动模式=“单顶”

<activity android:name=".MessagesDetailsActivity"
        android:launchMode="singleTop"
        android:excludeFromRecents="true"
        />

SMSReceiver.java

设置Intent和PendingIntent的标志

Intent intent = new Intent(context, MessagesDetailsActivity.class);
    intent.putExtra("smsMsg", smsObject.getMsg());
    intent.putExtra("smsAddress", smsObject.getAddress());
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent contentIntent = PendingIntent.getActivity(context, notification_id, intent, PendingIntent.FLAG_UPDATE_CURRENT);

MessageDetailsActivity.java

onResume() -每次都被调用,加载额外的内容。

Intent intent = getIntent();
    String extraAddress = intent.getStringExtra("smsAddress");
    String extraBody = intent.getStringExtra("smsMsg");

希望它能有所帮助,这是基于stackoverflow上的其他答案,但这是对我来说最有效的更新。

其他回答

AndroidManifest.xml

包括启动模式=“单顶”

<activity android:name=".MessagesDetailsActivity"
        android:launchMode="singleTop"
        android:excludeFromRecents="true"
        />

SMSReceiver.java

设置Intent和PendingIntent的标志

Intent intent = new Intent(context, MessagesDetailsActivity.class);
    intent.putExtra("smsMsg", smsObject.getMsg());
    intent.putExtra("smsAddress", smsObject.getAddress());
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent contentIntent = PendingIntent.getActivity(context, notification_id, intent, PendingIntent.FLAG_UPDATE_CURRENT);

MessageDetailsActivity.java

onResume() -每次都被调用,加载额外的内容。

Intent intent = getIntent();
    String extraAddress = intent.getStringExtra("smsAddress");
    String extraBody = intent.getStringExtra("smsMsg");

希望它能有所帮助,这是基于stackoverflow上的其他答案,但这是对我来说最有效的更新。

看看这个指南(创建通知)和ApiDemos“StatusBarNotifications”和“NotificationDisplay”的示例。

如果活动已经在运行,你有两种方式进行管理:

在启动活动时添加FLAG_ACTIVITY_SINGLE_TOP标志到Intent,然后在活动类中实现onNewIntent(Intent Intent)事件处理程序,这样你就可以访问为活动调用的新意图(这与仅仅调用getIntent()不一样,这将总是返回启动你的活动的第一个Intent。 与第一个相同,但不是在Intent中添加一个标志,你必须在你的活动AndroidManifest.xml中添加“singleTop”。

如果你使用意图附加,记得调用带有PendingIntent标志的PendingIntent. getactivity()。FLAG_UPDATE_CURRENT,否则将为每个通知重用相同的额外内容。

在你的通知实现中,使用这样的代码:

NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
...
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra("EXTRA_KEY", "value");

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
nBuilder.setContentIntent(pendingIntent);
...

要在ExampleActivity中获取Intent额外值,使用以下代码:

...
Intent intent = getIntent();
if(intent!=null) {
    String extraKey = intent.getStringExtra("EXTRA_KEY");
}
...

非常重要的注意:Intent::putExtra()方法是一个重载方法。要获得额外的键,你需要使用Intent::get[Type] extra()方法。

注意:NOTIFICATION_ID和NOTIFICATION_CHANNEL_ID是在ExampleActivity中声明的常量

在阅读了一些电子邮件列表和其他论坛后,我发现这个技巧似乎在意图中添加了一些独特的数据。

是这样的:

   Intent notificationIntent = new Intent(Main.this, Main.class);
   notificationIntent.putExtra("sport_id", "sport"+id);
   notificationIntent.putExtra("game_url", "gameURL"+id);

   notificationIntent.setData((Uri.parse("foobar://"+SystemClock.elapsedRealtime()))); 

我不明白为什么要这样做,这与意图有关,不能仅通过其附加功能来确定…

我什么都试过了,但都没用。

最终提出了以下解决方案。

为活动添加1- in清单 android: launchMode = " singleTop "

2-在制作挂起的意图时,使用bundle而不是直接使用intent. putstring()或intent. putint ()

                    Intent notificationIntent = new Intent(getApplicationContext(), CourseActivity.class);

                    Bundle bundle = new Bundle();
                    bundle.putString(Constants.EXAM_ID,String.valueOf(lectureDownloadStatus.getExamId()));
                    bundle.putInt(Constants.COURSE_ID,(int)lectureDownloadStatus.getCourseId());
                    bundle.putString(Constants.IMAGE_URL,lectureDownloadStatus.getImageUrl());

                    notificationIntent.putExtras(bundle);

                    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                            Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),
                            new Random().nextInt(), notificationIntent,
                            PendingIntent.FLAG_UPDATE_CURRENT);