如何将通知点击中的参数发送到活动?
-
20-09-2019 - |
题
我可以找到一种方法从通知中将参数发送到我的活动。
我有一项创建通知的服务。当用户单击通知时,我想使用一些特殊参数打开我的主要活动。例如,一个项目 ID,这样我的活动就可以加载并呈现一个特殊的项目详细信息视图。更具体地说,我正在下载一个文件,当下载文件时,我希望通知具有这样的意图:当单击它时,它会以特殊模式打开我的活动。我尝试过使用 putExtra
符合我的意图,但似乎无法提取它,所以我认为我做错了。
我的服务中创建通知的代码:
// 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 展示我的活动。
有任何想法吗?
解决方案
看看这个指南(创建通知)以及示例 ApiDemos“StatusBarNotifications”和“NotificationDisplay”。
要管理活动是否已在运行,您有两种方法:
添加 FLAG_ACTIVITY_SINGLE_TOP 启动activity时标记到Intent,然后在activity类中实现 onNewIntent(意图意图) 事件处理程序,这样您就可以访问为该活动调用的新意图(这与仅调用 getIntent() 不同,这将始终返回启动您的活动的第一个意图。
与第一相同,但您必须添加而不是向 Intent 添加标志 “单顶” 在您的活动 AndroidManifest.xml 中。
如果您使用 Intent Extras,请记得致电 PendingIntent.getActivity()
与旗帜 PendingIntent.FLAG_UPDATE_CURRENT
, ,否则每个通知都会重复使用相同的附加内容。
其他提示
我有类似的问题我的应用程序显示的消息的通知。 当有多个通知和点击每个通知它显示在视图中消息活动该通知的细节。我解决鉴于消息意图正被接收的相同额外参数的问题。
下面是固定本的代码。 码用于创建通知意图。
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的通知,同时创造的PendingIntent。但还是不知道为什么应该这样做。
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())));
我不明白为什么这需要做的,它得到的东西做的意图不能被其临时演员只认...
我什么都试过,但没有奏效。
最终想出了下述解决方案。
在用于活动清单中添加1- 机器人:launchMode = “singleTop”
2-同时使待处理的意图执行以下操作,使用束,而不是直接使用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 强>
设置的意图和的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");
希望它能帮助,它是基于其他的答案在这里计算器,但是这是最更新为我工作。
这很容易,这是使用对象我的解决方案!
我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");
}
<强>好运!! 强>
做一些搜索我得到从机器人显影剂引导溶液后
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);
要获取测试Activity类意向额外的价值,你需要编写如下代码:
Intent intent = getIntent();
String extra = intent.getStringExtra("extra") ;
如果您使用
android:taskAffinity="myApp.widget.notify.activity"
android:excludeFromRecents="true"
在开始练习你的AndroidManifest.xml文件,你必须使用你的意图如下:
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意图= PendingIntent.getActivity(此,0, notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
...添加PendingIntent.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 = getIntent();
if(intent!=null) {
String extraKey = intent.getStringExtra("EXTRA_KEY");
}
...
<强>非常重要注意:强>的意图:: putExtra()方式是一个重载一个。为了获得额外的关键,就需要使用意向::获得【型号】超()方式。
注意:<强> NOTIFICATION_ID 和<强> NOTIFICATION_CHANNEL_ID 强>是为ExampleActivity声明的常数
天儿真好, 我也可以说,我想在这些职位,并从其他地方多了一些提到的一切。 #1问题对我来说是新的意向始终有一个空包。 我的问题是过分集中于细节“有我。这包括或。那”。 我的解决办法是从细节退后一步,看着通知的总体结构。当我这样做,我设法代码的关键部位放置在正确的顺序。 所以,如果你遇到类似问题,请检查:
1. Intent notificationIntent = new Intent(MainActivity.this, NotificationActivity.class);
2a. Bundle bundle = new Bundle();
//我喜欢指定数据键入要好得多。例如bundle.putInt
2b. notificationIntent.putExtras(bundle);
3. PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this, WIZARD_NOTIFICATION_ID, notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
4. NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
5. NotificationCompat.Builder nBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_notify)
.setContentTitle(title)
.setContentText(content)
.setContentIntent(contentIntent)
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
.setAutoCancel(false)//false is standard. true == automatically removes the notification when the user taps it.
.setColor(getResources().getColor(R.color.colorPrimary))
.setCategory(Notification.CATEGORY_REMINDER)
.setPriority(Notification.PRIORITY_HIGH)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
notificationManager.notify(WIZARD_NOTIFICATION_ID, nBuilder.build());
使用此序列我得到一个有效的包。