Intent extra会因未知原因被清除

时间:2018-03-18 11:07:05

标签: android android-intent android-pendingintent

我有活动 A ,它使用以下代码启动活动 B

Intent intent = new Intent(this, B.class);
intent.putExtra("foo", new MySerializableObject());
startActivity(intent);

B " foo"正确接收,然后我创建PendingIntent一段时间后开始自己,你可以把它想象成一些闹钟应用程序。无论如何,神秘的事情是,当我按照以下方式安排这个意图时:

Intent intent = new Intent(context, B.class);
intent.putExtra("bar", true);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent,
        PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
        SystemClock.elapsedRealtime() + delayMs, pendingIntent);

然后一切都很好(收到这个意图" bar"值为true),但是如果我在" bar"之前或之后添加以下行:

intent.putExtra("foo", new MySerializableObject());

然后,当我收到这个意图时," foo"和" bar"缺失。我的意思是从这两行返回false:

getIntent().hasExtra("foo")
getIntent().hasExtra("bar")

这种行为可能是什么原因?

修改 基于评论中的建议我尝试过:

intent.putExtra("foo", true);
intent.putExtra("bar", true);

并且它有效,所以我认为MySerializableObject可能有问题,所以这就是我接下来尝试过的:

intent.putExtra("foo",
        new Serializable() {
            @Override
            public int hashCode() { return super.hashCode(); }
            });
intent.putExtra("bar", true);

但这会导致我所描述的完全相同的问题(" foo"" bar")缺失。最后我还尝试更换" foo"用" xxx"但它并没有改变任何东西,所以对我来说它看起来像一些奇怪的Android bug。

1 个答案:

答案 0 :(得分:0)

正如android-hub所建议的,我尝试过使用Bundle,但问题是一样的。这有用(“栏”可用):

    Bundle b = new Bundle();
    b.putBoolean("bar", true);
    intent.putExtras(b);

虽然没有(“xxx”和“bar”都不存在):

    Bundle b = new Bundle();
    b.putSerializable("xxx", new Serializable() {});
    b.putBoolean("bar", true);
    intent.putExtras(b);

上面提到的answer解释了一下发生了什么,但是当你看到建议的解决方案(使用Bundle)不起作用时。无论如何,我想这部分是一个正确的解释:

  

如果核心OS进程需要修改Intent附加组件,那么该进程最终会尝试重新创建Serializable对象,作为设置附加组件以进行修改的一部分。该过程没有您的类,因此它会获得运行时异常。

阅读后我在日志中看到了这个:

  

W / Intent:填写额外内容失败java.lang.RuntimeException:   Parcelable遇到ClassNotFoundException,读取Serializable   object(name = test.edu.B $ 1)

之前我错过了,因为我只是从我的应用程序查看日志。无论如何,我可能不得不将MySerializableObject分解为本机类型(字符串,int数组等)为它们创建特殊键等等,我想它会起作用但是很痛苦。我不想使用Parcelable(即使它可以工作),因为我不希望我的模型类是特定于Android的。

在浪费几个小时的时间和时间来确定这个问题后,我唯一能说的就是Google在这种特殊情况下做了非常糟糕的设计。在我看来,PendingIntent应该检查是否有一些serializable被添加到intent并且已经在我的应用程序中抛出了一些不支持的异常,或者如果它无法与其他Android组件一起处理,那么首先应该没有用于将Serializable添加到Intent的API