我可以在意图中作为额外内容发送类吗?

14

我想通过extra传递类名,应该如何操作?

Intent p = new Intent(StartScreen.this, Setting.class);
p.putExtra(" ",StartScreen.this);

我想要获取Setting类的类名,但不想它是String,因为我之后会像这样使用这个类名:

Bundle extras = getIntent().getExtras();
extras.getString("class");
Intent i = new Intent(Setting.this, class);
startActivity(i);

你想要实现什么目标? - Stefan
我有一个设置界面,可以更改应用程序的主题,因此当完成操作时,我需要该设置界面启动调用它的活动。无法仅使用finish(),原因是我需要最后一个活动重新开始而不仅仅是恢复。 - Jesus Dimrix
2个回答

20

你可以使用这段代码

Intent p = new Intent(StartScreen.this, Setting.class);
p.putExtra("class","packagename.classname");

并在设置类中

Bundle extras = getIntent().getExtras();
String classname=extras.getString("class");
Class<?> clazz = Class.forName(classname);
Intent i = new Intent(Setting.this, clazz);
startActivity(i);

2
这不应该是首选方法,而应该使用Serializable或Parcelable(请参见此答案 - Luka Govedič

13

比起已接受的答案,更整洁的方法是使用 SerializableParcelable

以下是使用 Serializable 的示例:

在您的第一个活动中...

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("EXTRA_NEXT_ACTIVITY_CLASS", ThirdActivity.class);
startActivity(intent);

然后在您的第二个活动中...

Bundle extras = getIntent().getExtras();
Class nextActivityClass = (Class<Activity>)extras.getSerializable("EXTRA_NEXT_ACTIVITY_CLASS");
Intent intent = new Intent(SecondActivity.this, nextActivityClass);
startActivity(intent);

使用 Parcelable 完全相同,只需将上面代码中的 extras.getSerializable("EXTRA_NEXT_ACTIVITY_CLASS") 替换为 extras.getParcelable("EXTRA_NEXT_ACTIVITY_CLASS")

Parcelable 方法将更快,但设置更难(因为您需要使第三个 Activity 实现 Parcelable - 参见 http://developer.android.com/reference/android/os/Parcelable.html )。


2
谢谢您的回答!值得注意的是,这种方法适用于开发插件而不是官方答案。我目前正在开发一个弹出屏幕的插件,需要知道在该屏幕完成后要打开哪个类。在这种情况下,Class.forName将无法工作,因为插件不知道类名。将类名解析为可序列化对象将起到作用。 - Raymond

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