如何检测某个活动是否已启动以处理onActivityResult,或者是否因为方向更改或其他事件而开始重新创建活动。
我开始活动A并且如果条件满足,我开始活动B,我在A中处理结果。
在内存不足的情况下,活动A被销毁并重新创建以处理来自B的结果。 在onInit期间,我的内部状态显示我仍然需要显示活动B,因此重新显示B.
我怎样才能正确处理?
答案 0 :(得分:1)
编辑试图解决被问到的实际问题。
为了防止在返回活动时运行设置代码,您可以利用onSaveInstanceState
方法。您可以在类A
中覆盖此方法,这样,如果您的活动因任何原因被终止,您可以存储关于它的状态(例如您已经为结果启动了活动B
的事实) 。在此方法中,您可以通过在其上设置键值对来修改传入的Bundle
。然后,当重新启动活动时,此捆绑包将传递给类的onCreate
。因此,A类的相关部分可能如下所示:
public class A extends Activity {
boolean startedB = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
startedB = savedInstanceState != null && savedInstanceState.getBoolean("started_b", false);
if (!startedB) {
Intent intent = new Intent(this, B.class);
startActivityForResult(intent, 1);
startedB = true;
}
// rest of code
// .....
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean("started_b", startedB);
}
}
原始答案
当您为结果启动活动时,您可以在用于启动活动的意图上添加额外的标记或值。例如,如果我想为结果启动活动Foo
,我可以使用
Intent intent = new Intent(this, Foo.class);
intent.putExtra(IS_FOR_RESULT, true);
startActivityForResult(intent, REQUEST_CODE);
其中IS_FOR_RESULT
是一个字符串,例如"IS_FOR_RESULT"
和REQUEST_CODE
是一个整数,例如1
。在已启动的活动onCreate
(在本例中为类Foo
)中,您可以检查是否已针对具有以下内容的结果启动
Intent intent = getIntent();
if (intent.hasExtra(IS_FOR_RESULT) && intent.getBooleanExtra(IS_FOR_RESULT) {
// Handle activity being started for a result
}
根据您所说的内容,您可能还希望在已启动的类onNewIntent
中进行类似的检查,以防您为结果启动现有活动,但它不会创建新的实例
通常,intents和intent extras是在应用程序组件之间传递特定于实例的信息的有用工具。
答案 1 :(得分:0)
您可以通过实施FuegoFro建议的逻辑来检测是否仅针对应用程序中的结果启动了活动。但是,您无法检测您的活动从其他应用程序启动的方式。
它可以从Android源代码推断:启动结果活动和刚开始它的唯一区别是requestCode
的值:
@Override
public void startActivity(Intent intent) {
startActivityForResult(intent, -1);
}
并且此requestCode
无法从您的活动中恢复。