如何从一个通知,点击活动送的参数?(How to send parameters from a no

2019-06-17 18:41发布

我能找到一种方法,从我的通知发送参数到我的活动。

我有一个创建一个通知的服务。 当用户点击通知我要打开我的主要活动有一些特殊的参数。 例如一个项目的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提出我的活动。

有任何想法吗?

Answer 1:

看看本指南( 创建通知 )和样品ApiDemos“StatusBarNotifications”和“NotificationDisplay”。

为了管理如果活动已经运行有两种方式:

  1. FLAG_ACTIVITY_SINGLE_TOP标志添加到意向开展活动时,然后在活动类实现onNewIntent(意向意图)事件处理程序,这样你可以访问新的意图,这是所谓的活动(这是不一样的只是打电话getIntent (),这将始终返回推出的活动的第一个意图。

  2. 同一个号码,但不是把一个标志的意图您必须在AndroidManifest.xml中的活动添加“singleTop”。

如果您使用的意图演员,remeber调用PendingIntent.getActivity()与标志PendingIntent.FLAG_UPDATE_CURRENT ,否则同样的演员会为每个通知被重用。



Answer 2:

我有类似的问题,我的应用程序会显示邮件通知。 当有多个通知和点击每个通知它显示在视图中消息活动该通知的细节。 我解决了查看邮件的意图正在接收的相同额外的参数问题。

这里是一个固定这的代码。 代码创建的通知意向。

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


}


Answer 3:

也许有点晚,但:而不是这样的:

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


Answer 4:

在这里遇到同样的问题。 我通过使用不同的请求码解决它,使用相同ID的通知,同时创造的PendingIntent。 但还是不知道为什么应该这样做。

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


Answer 5:

阅读一些电子邮件列表和其他论坛后,我发现这招似乎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()))); 

我不明白为什么这需要做的,它得到的东西做的意图不能被其临时演员只认...



Answer 6:

我什么都试过,但没有奏效。

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

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


Answer 7:

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

希望它能帮助,它是基于其他的答案在这里计算器,但是这是最更新为我工作。



Answer 8:

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

我的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");
}

祝好运!!



Answer 9:

做一些搜索后,我得到了来自Android开发者指南解决方案

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


Answer 10:

如果您使用

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


Answer 11:

对于服务使用PendingIntent.FLAG_UPDATE_CURRENT

为我工作。



Answer 12:

同时表现出比它解决的通知,请如的PendingIntent使用。

的PendingIntent意图= PendingIntent.getActivity(此,0,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);

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



文章来源: How to send parameters from a notification-click to an activity?