我有一个活动A调用startActivityForResult来启动活动B,通常用户可以单击活动A中的按钮来启动活动B以获得结果。
现在我需要从活动C打开活动B,当活动B返回时,它应该返回活动A.这可能吗?
我尝试使用intent从Activity C启动Activity A并调用A的startActivityForResult方法,但似乎无法获取Activity A的实例。
正常堆栈是A-> B但现在我希望它是C-> B,但是当B返回时,它将结果返回给A.
我在想是否有可能的方法来做C-> A-> B但是从用户那里隐藏A?
答案 0 :(得分:2)
这是一个非常聪明的问题。我认为凯文的回答是正确的方法,尽管我想补充一下这个主题:
首先,我们需要了解Activity的启动模式。在android中有3种活动启动模式:
标准模式:这是默认模式,其中始终会创建新的Activity
,以便与发送的每个Intent
分开处理。
单一顶部模式:此模式与标准模式的作用几乎相同,唯一的区别在于,如果在顶部有一个类型相同的Activity
实例在来电者任务中堆叠,新的Activity
不将被创建(Intent
将被发送到现有的Activity
onNewIntent()
方法)。
单一任务模式:此模式与standard
和singleTop
完全不同。 Activity
singleTask launchMode
launchMode
只允许一个实例。
基本上,我们可以在AndroidManifest.xml
内直接指定<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask">
</activity>
作为属性:
finish()
至于你的问题,假设我们坚持使用标准laucnhMode ,我能想到实现你想要的唯一解决方法就是在每次调用{startActivity()
之后调用ActivityA
方法。 1}} 不是 ActivityC
。例如,假设我在public void buttonClick(View view) {
switch (((Button) view).getText().toString()) {
case "A":
startActivity(new Intent(getApplicationContext(), ActivityA.class));
break;
case "B":
startActivity(new Intent(getApplicationContext(), ActivityB.class));
finish();
break;
case "C":
startActivity(new Intent(getApplicationContext(), ActivityC.class));
finish();
break;
}
}
内:
ActivityA
这样,无论我在哪里“回”,我都会回到tab_an
。
我知道这可能无法解决您的问题,但我希望它能为您提供更多思考方式。
让我知道这对你有什么帮助,如果不是简单的评论,我会编辑我的帖子。
答案 1 :(得分:1)
所以你的筹码是A-C-B,你希望它只是A?这很简单,只要在收到B的结果时调用C finish()
中的onActivityResult(...)
即可。这可能是任何结果或某些特定结果。它可以将此结果返回给A。
您无法可靠地获取活动A的实例,因为当A在后台或后台时,无法保证有任何实例可以获取。它可能会被持续存在并被破坏。
答案 2 :(得分:0)
只需在开始结果
之前添加getActivity()getActivity().startActivityForResult(intent, 1);