如何从通知单击发送参数到活动?

我可以find一种方法来从我的通知中发送参数给我的活动。

我有一个创build通知的服务。 当用户点击通知时,我想用一些特殊的参数打开我的主要活动。 例如一个项目ID,所以我的活动可以加载并呈现一个特殊的项目详细信息视图。 更具体地说,我正在下载一个文件,当文件被下载的时候,我想让这个通知有一个意图,当点击它时,它会以特殊模式打开我的活动。 我曾尝试在我的意图上使用putExtra ,但似乎不能提取它,所以我认为我做错了。

创build通知的服务中的代码:

  // 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我的活动。

有任何想法吗?

看看这个指南( 创build一个通知 ),并采样ApiDemos“StatusBarNotifications”和“NotificationDisplay”。

为了pipe理活动是否已经在运行,您有两种方法:

  1. 在启动活动时向Intent添加FLAG_ACTIVITY_SINGLE_TOP标志,然后在活动类中实现onNewIntent(Intent intent)事件处理程序,这样就可以访问为活动调用的新的意图(这与调用getIntent (),这将始终返回启动您的活动的第一个意图。

  2. 与第一个相同,但不是向Intent添加一个标志,而是在您的活动AndroidManifest.xml中添加“singleTop”

如果使用intent extras,请PendingIntent.getActivity()使用PendingIntent.getActivity()标志调用PendingIntent.getActivity() ,否则相同的额外值将被重用于每个通知。

我有类似的问题我的应用程序显示消息通知。 当有多个通知并单击每个通知时,它会在查看消息活动中显示该通知详细信息。 我解决了在查看消息意图中收到相同的额外参数的问题。

这里是解决这个问题的代码。 创build通知的代码

  Intent notificationIntent = new Intent(getApplicationContext(), viewmessage.class); notificationIntent.putExtra("NotificationMessage", notificationMessage); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingNotificationIntent = PendingIntent.getActivity(getApplicationContext(),notificationIndex,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT); notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.setLatestEventInfo(getApplicationContext(), notificationTitle, notificationMessage, pendingNotificationIntent); 

查看消息活动的代码。

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); onNewIntent(getIntent()); } @Override public void onNewIntent(Intent intent){ Bundle extras = intent.getExtras(); if(extras != null){ if(extras.containsKey("NotificationMessage")) { setContentView(R.layout.viewmain); // extract the extra-data in the Notification String msg = extras.getString("NotificationMessage"); txtView = (TextView) findViewById(R.id.txtMessage); txtView.setText(msg); } } } 

也许有点晚,但是:而不是:

 public void onNewIntent(Intent intent){ Bundle extras = intent.getExtras(); Log.i( "dbg","onNewIntent"); if(extras != null){ Log.i( "dbg", "Extra6 bool: "+ extras.containsKey("net.dbg.android.fjol")); Log.i( "dbg", "Extra6 val : "+ extras.getString("net.dbg.android.fjol")); } mTabsController.setActiveTab(TabsController.TAB_DOWNLOADS); } 

用这个:

 Bundle extras = getIntent().getExtras(); if(extras !=null) { String value = extras.getString("keyName"); } 

在这里遇到同样的问题。 我通过使用不同的请求代码来解决它,使用相同的id作为通知,同时创buildPendingIntent。 但仍然不知道为什么应该这样做。

 PendingIntent contentIntent = PendingIntent.getActivity(context, **id**, notificationIntent, 0); notif.contentIntent = contentIntent; nm.notify(**id**, notif); 

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

喜欢这个:

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

我不明白为什么要这样做,这与意图不能被确定只能由其额外…

我试了一切,但没有任何工作。

最终想出了以下解决scheme。

1-在清单中添加活动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); 

AndroidManifest.xml中

包含launchMode =“singleTop”

 <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,但这是最新更新,为我工作。

这很容易,这是我使用对象的解决scheme!

我的POJO

 public class Person implements Serializable{ private String name; private int age; //get & set } 

方法通知

  Person person = new Person(); person.setName("david hackro"); person.setAge(10); Intent notificationIntent = new Intent(this, Person.class); notificationIntent.putExtra("person",person); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.notification_icon) .setAutoCancel(true) .setColor(getResources().getColor(R.color.ColorTipografiaAdeudos)) .setPriority(2) .setLargeIcon(bm) .setTicker(fotomulta.getTitle()) .setContentText(fotomulta.getMessage()) .setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT)) .setWhen(System.currentTimeMillis()) .setContentTitle(fotomulta.getTicketText()) .setDefaults(Notification.DEFAULT_ALL); 

新的活动

  private Person person; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_notification_push); person = (Person) getIntent().getSerializableExtra("person"); } 

祝你好运!!

做了一些search后,我从android开发人员指南得到解决scheme

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

如果你使用

 android:taskAffinity="myApp.widget.notify.activity" android:excludeFromRecents="true" 

在您的AndroidManifest.xml文件中启动Activity,您必须在您的意图中使用以下内容:

 Intent notificationClick = new Intent(context, NotifyActivity.class); Bundle bdl = new Bundle(); bdl.putSerializable(NotifyActivity.Bundle_myItem, myItem); notificationClick.putExtras(bdl); notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId())); notificationClick.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); // schließt tasks der app und startet einen seperaten neuen TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); stackBuilder.addParentStack(NotifyActivity.class); stackBuilder.addNextIntent(notificationClick); PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(notificationPendingIntent); 

重要的是设置独特的数据,例如使用一个唯一的ID如:

 notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId())); 

对于服务使用PendingIntent.FLAG_UPDATE_CURRENT

为我工作。

显示通知时请使用PendingIntent,而不是解决。

PendingIntent intent = PendingIntent.getActivity(this,0,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);

添加PendingIntent.FLAG_UPDATE_CURRENT作为最后一个字段。