永久修改启动Activity的Intent

12

我想发送一个Intent来启动一个Activity。我希望能够修改该Intent。然后,当Activity被销毁并重新创建时,我希望在调用getIntent()时仍然存在这些修改。

目前,在Activity尚未被销毁的情况下修改Intent是可行的。但如果它被销毁了,则在重新创建活动时,它将获得启动它的原始Intent,而不是可能已经修改的第一次启动时接收到的副本。


为什么?它只是用于存储Intent的额外值吗?还是还有其他什么作用? - user2058839
我不知道这是否可能,很抱歉。如果您能解释一下您的整体目标,也许我们可以建议替代方案。 - CommonsWare
谢谢各位,情况有点复杂。我正在编写推送意图的第三方代码。当用户点击通知时,主应用程序会启动一个意图(intent)。该 Intent 启动主活动(activity),例如。主活动检查是否存在特定的额外数据(extra data),如果是,则将其传递给我的 SDK 代码。在这种情况下,我会显示一个 UI 界面。问题是,一旦我的 UI 关闭,我就没有简单的方法来确定那是我看到的第一次 intent,还是第50次。 - Sky Kelsey
3个回答

13
修改Intent以删除我的额外数据可以正常工作,只要主Activity仍然存在,但如果它被销毁/重建,则额外数据会再次出现。
那是因为您修改的是Intent的本地副本,而不是操作系统进程中维护的主副本,其中任务列表被保存。
如果这些数据确实是活动的实例状态,应通过onSaveInstanceState()保存,然后通过onRestoreInstanceState()获取。你的库的用户需要将这些事件转发给你。
如果你不想将其视为实例状态,而是进程状态,请将数据存储在单例中。
如果数据应超过进程的生命周期,请将其写入磁盘。
如果我在托管应用程序的广播接收器中保存数据,然后在我的代码中使用并删除它,那是没有意义的。注册在清单中的接收器仅为单个广播而存在,然后完成。

感谢您清晰简洁的回答。我应该说“保存数据来自”而不是“保存数据在”。我很可能会将其保存到SharedPreferences中。 - Sky Kelsey
此外,我认为这是Android中的一个设计缺陷,因为Intent甚至可以以这种方式被修改,而大多数开发人员一开始就对Activity生命周期的理解不够牢固。 - Sky Kelsey
@SkyKelsey:让“Intent”不可变将会给各种身体部位带来严重的疼痛。 :-) - CommonsWare
我猜是这样,虽然我不知道使用情况。但是提供一个API来获取Intent的COPY而不是实际的Intent会更好。或者至少提供文档让我们知道Intent随Activity一起销毁等信息。 - Sky Kelsey

3

这不是正确的做法。你想要做的是保存数据,对吧?在这种情况下,你不需要操作意图,只需更改值,然后保存它们,下次应用程序运行时,它将从上次加载值,以下是一些代码:

如何保存值:

//Create sharedPref (It's android's way of saving values)
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();

//Save Values here
editor.putInt(getString(R.string.saved_high_score), newHighScore);

//Commit changes
editor.commit();

如何加载数值:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);

更多信息请参考:developer.android.com/training/basics/data-storage/shared-preferences.html。该网页介绍了与Android应用程序中的共享偏好设置相关的IT技术内容。

谢谢。你可能是对的,我必须这样做。由于我正在编写SDK代码,我宁愿让我的代码处理所有这些问题,而不是让主机应用程序为我处理。我可以将数据保存在主机应用程序的广播接收器中,然后在我的代码中使用和删除它。 - Sky Kelsey
你的意思是什么?我所描述的方式将值保存在安装应用程序的设备内部,并且对其他应用程序是私有的(这意味着只有你的应用程序可以访问它)。 - TomTsagk
是的,我非常熟悉SharedPreferences。但是我受到限制,因为如果可能的话,我不想为将我的SDK集成到他们的应用程序中的开发人员添加额外的代码行。 - Sky Kelsey
1
啊,我现在明白了,不幸的是我认为没有其他方法,但这种做法真的并不糟糕。 - TomTsagk
我最终做了这件事。我将另一个回复标记为答案,因为它解决了提出的问题。谢谢。 - Sky Kelsey

1
尝试一下。
activity.setIntent(activity.getIntent());

适用于我

1
那应该不起作用。activity.getIntent()只是给你Activity对象内部意图的引用。然后,您修改此引用指向的对象,并将原始引用点设置为相同的对象,这没有任何意义。 - nutella_eater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接