如何在多个Activity之间传递Intent参数?

51

我有很多通过Intents链接在一起的活动,并且一些Intents需要在extras Bundle中传递参数。当我必须通过多个Activity转发参数时,是应该明确地复制每一个参数,还是有更好的实践方法可以做到这一点呢?例如,我可以克隆-复制当前Intent作为调用其他子任务Intents的起点,这将(可能)复制所有先前的Bundle参数。

举个例子,假设您有一个文件资源管理器Activity,它处于两种模式之一:专家和新手。您想将此状态传递给某些子任务Activity,如文件属性页面,您可以在启动它之前调用putExtra(“skillLevel”,“Expert”)来实现。现在,如果属性页面也有子任务Activity,例如压缩选项,那么您应该如何转发“skillLevel”参数呢?

4个回答

96

我不知道为什么你想使用构造函数来复制所有其他属性。

newIntent.putExtras(oldIntent);

这方法应该可以解决问题。


这里的意图是对象,而不是类。对吗? - class Android
我该如何把它们取回来? - Neon Warge
2
强调putExtras末尾的"s"。稍微忽略了一下。 - CamHart

34
我认为最好和更简洁的方法是通过使用接收到的Intent来初始化下一个Intent,使用Intent(Intent)构造函数。
Intent newIntent = new Intent(receivedIntent);

1
谢谢!我需要更多的东西,所以我用这种方式来使用它,然后我设置组件来指示去哪里:otherIntent.setComponent(new ComponentName(context, MyIntentService.class)); - Juan Saravia
如果您使用@Gary提到的解决方案,那么这将更加容易。 - winklerrr

2
如果一个参数是系统级别的,将其存储在共享首选项中直到更改可能更容易(比如游戏难度)。这会有记住用户离开应用程序时设置的难度的副作用。

这是一个非常好的观点,实际上在我给出的示例中,SharedPreferences比Intents更适合管理“技能级别”的状态。然而,我的真正问题(不太适合示例)无法以这种方式使用单个全局状态变量。 - Rupert Rawnsley

-2

由于Android中没有全局变量,您可以创建一个包含应用程序范围信息并使用单例模式的类。由于该类将被整个系统共享,因此您始终可以获得相同的对象实例,从而获得相同的信息。

以下是一个示例:

public class Object {

private static Object instance;

private Object objectcall;  

private Object(){

}

public void setObject(Object newObject){
    this.objectcall = newObject;

} 


public  Object getObject(){
    return this.objectcall;
}


public static synchronized Object getInstance(){

         if(instance==null){    
           instance=new Object();
         }
         return instance;

}
}

当您想在Activity中检索它时,只需调用

Object objectSingleton = Object.getInstance();

2
因为这种方法忽略了Android Activity生命周期,所以我会Downvote。 因此,这种方法容易出现不可预测的行为/崩溃,例如当系统由于低内存而销毁并稍后重新创建Activity时。另一方面,Intent参数是由系统存储的,并将在重建时传递给Activity。 - robert

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