Android:我的部分演员在未决意图中迷失了

Posted

技术标签:

【中文标题】Android:我的部分演员在未决意图中迷失了【英文标题】:Android: Part of my extras are getting lost in pending intent 【发布时间】:2016-04-20 23:12:34 【问题描述】:

我第一次制作 android 应用程序时遇到了这个问题。 当用户 A 向另一个用户 B 发送好友请求时,用户 B 会收到通知。我希望当用户 B 单击通知时将其重定向到用户 A 个人资料。

主要活动(应用程序中的主页)根据用户来自哪里打开不同的片段。用户配置文件就是这样一个片段。

这就是我从主活动的演示者类发送通知的方式。

Intent notificationIntent = new Intent(activity.getApplicationContext(), MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Bundle extras = new Bundle();
extras.putString("name" ,this.friendRequestFromUserName.toString());
extras.putString("email", this.friendRequestFromUserEmail);
extras.putString("notification", "notificationFriendRequest");

notificationIntent.putExtras(extras);

System.out.println("PUTTING EXTRA");
System.out.println(notificationIntent.getExtras().toString());
// output here is:
//Bundle[name=The Lion King, email=mufasa@lionking.com, notification=notificationFriendRequest]

NotificationCompat.Builder builder = new NotificationCompat.Builder(activity)
    .setSmallIcon(R.drawable.ic_notification)
    .setContentTitle("New friend!")
    .setContentText(this.friendRequestFromUserName + " wants to be friends.")
    .setAutoCancel(true)
    .setOnlyAlertOnce(true)
    .setOngoing(false)
    .setContentIntent(PendingIntent.getActivity(activity.getApplicationContext(), 0, notificationIntent, 0));

builder.setOngoing(false);
builder.setAutoCancel(true);

Notification not = builder.build();
not.flags = Notification.FLAG_AUTO_CANCEL;
NotificationManager manager = (NotificationManager)this.activity.getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
        manager.notify(123, not);

但是,在主活动中,当用户单击通知时,只有部分 Bundle 是“到达”。 以下是我尝试获得额外内容的方法:

    extraName = intent.getStringExtra("name");
    extraMail = intent.getStringExtra("email");
    extra = intent.getStringExtra("notification");

    System.out.println(intent.getExtras().toString());
    //Bundle[notification=notificationFriendRequest]

我还尝试将数组作为额外的,结果相同。由于我的部分额外内容到了,但其他部分没有,而且我找不到类似的主题和问题,我决定询问是否有人可以提供帮助或解释为什么会发生这种情况或如何发生这种情况。谢谢。

【问题讨论】:

您是否尝试在getActivity 中使用唯一的requestCodes? 不,我没有。现在我尝试为请求代码生成随机 int 似乎根本没有发送任何额外内容。 好吧,我做到了,当我给出不同于 0 的数字时,它不会发送任何额外内容(我尝试生成随机数,也只是输入除零以外的其他数字)。我也不确定这段代码的目的是什么:/ 所以使用独特的requestCodePendingIntent.FLAG_UPDATE_CURRENT标志的组合 如果您在给定时间只使用一个通知 (id = 123),您可以跳过不同的请求代码,只需使用 0 或其他任何值 【参考方案1】:

因此,正如 pskink 建议的那样,我添加了唯一的 requestCode 和 PendingIntent.FLAG_UPDATE_CURRENT 标志并解决了它。

.setContentIntent(PendingIntent.getActivity(activity.getApplicationContext(), Math.abs(generator.nextInt()), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT));

由于我看不到如何将建议标记为答案,因为这是我在这里的第一个问题,所以我自己回答。再次感谢你,pskink!

【讨论】:

如果您在给定时间只使用一个通知 (id = 123),您可以跳过不同的请求代码,只需使用 0 或其他任何值 Android,让我惊喜不断。【参考方案2】:

您以错误的方式获取值。当您在 Intent 中将所有内容作为捆绑传递时,首先您必须首先从这样的意图中获取 Bundle 对象

Bundle extras = getIntent().getExtras(); 然后从 bundle 对象中获取其他字符串

【讨论】:

当我像这样打印额外内容时 System.out.println(intent.getExtras().toString());这具有相同的结果 - 捆绑包只有三个附加功能之一 当你得到额外的东西时,不要打印尝试调试。我认为您的打印行不会一次性打印所有附加内容【参考方案3】:

尝试先获取bundle对象,然后获取这样的值,希望对您有所帮助。

@Override
protected void onCreate(Bundle savedInstanceState) 
     super.onCreate(savedInstanceState);

     try
          Bundle data= this.getIntent().getExtras();
          extraName = data.getString("name");
          extraMail = data.getString("email");
          extra = data.getString("notification");
     catch(Exception e)
          e.printStackTrace();
     

【讨论】:

可能错误可能在 notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);因为如果设置,如果活动已经在历史堆栈的顶部运行,它将不会被启动。我会尝试使用 notificationIntent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);而是 谢谢,但情况并非如此(同时尝试了两个标志,也分别尝试了)。请注意,活动实际上是启动的,检查是否有额外的意图,只找到一个并打开用户片段(如果没有额外的行为不同),只有那个用户是无名和无电子邮件的。 我还尝试了一堆其他标志,但没有不同的结果。

以上是关于Android:我的部分演员在未决意图中迷失了的主要内容,如果未能解决你的问题,请参考以下文章

Android:未调用的未决意图具有多个警报的打盹

您可以在本地广播中使用未决意图吗?

地理围栏未触发(未决意图和广播接收器)

如何在android报警时从待处理的意图中获取requestCode

发送带有未决意图的数据并进入 AppWidgetProvider 中的打开活动

多个 Android Widget 实例仅更新最后一个小部件