我有活动 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。
答案 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