检测onActivityResult的活动创建

时间:2013-12-24 21:05:05

标签: android android-activity

如何检测某个活动是否已启动以处理onActivityResult,或者是否因为方向更改或其他事件而开始重新创建活动。

我开始活动A并且如果条件满足,我开始活动B,我在A中处理结果。

在内存不足的情况下,活动A被销毁并重新创建以处理来自B的结果。 在onInit期间,我的内部状态显示我仍然需要显示活动B,因此重新显示B.

我怎样才能正确处理?

2 个答案:

答案 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无法从您的活动中恢复。