理解为什么在这种情况下创建Android活动

时间:2012-09-03 22:09:31

标签: android android-activity activity-lifecycle

我有一个退出方法可以做到这一点:

public void quitFinalize(ServicedActivity actCtx)
{   
    for (ServicedActivity act : mRunningActivities)
        launchActivity(actCtx, new Intent(mAppCtx, act.getClass()).setAction("--"));
}

检查mRunningActivities是否正常。它包含我的任务中创建但未销毁的所有活动。所有活动都继承自:

public class ServicedActivity extends FragmentActivity implements OnClickListener
{
    ...

    @Override
    protected void onNewIntent(Intent intent) 
    {
        super.onNewIntent(intent);

        if (/*Intent.ACTION_SCREEN_OFF*/"--".equals(intent.getAction()))            // used for quitting the game
        {
            finish();
        }
    }

        ...
}

我注意到,对于Set中的2个活动,该机制运行正常。但是,对于3个活动,Android 4.0.3决定它应该启动(创建)Set中其中一个活动的另一个实例(它似乎特别喜欢启动某个Activity而不是任何活动)。并且他们完成了所有这些(因此4个被破坏的活动而不是原来的3个)

我确信不是我无意中创建了这个活动 - 我的所有launchActivity逻辑都是通过一个方法过滤的,该方法将FLAG_ACTIVITY_REORDER_TO_FRONT标志附加到Intent,所以我不能最终得到同一个Activity类的两个实例。必须是正在重新创建它的操作系统。

还尝试没有'android:launchMode =“singleTop”'清单文件属性 - 对于应用程序中的所有活动,它都是这样的。同样的事情。

这里发生了什么?上面的onNewIntent()方法按预期命中3次,但在中间,Android会创建一个新的Activity,然后立即终止它。

由于


1 个答案:

答案 0 :(得分:0)

我设法错误地克服了这个问题,似乎: 文档提到要在各种事件(例如配置更改)上销毁/重新创建活动。所以我想到在可能的所有配置变化上从操作系统中窃取控制权;现在AndroidManifest.xml看起来像

<activity android:name=".ui.MainMenu" android:launchMode="singleTop" android:screenOrientation="reverseLandscape" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
   android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|fontScale"   />

... etc, same for all activities

现在,docs也声明:

  

public void onConfigurationChanged(Configuration newConfig)从:   API等级1

     

当设备配置发生变化时由系统调用   活动正在运行。请注意,只有在您拥有时才会调用此选项   您想要处理的所选配置   清单中的configChanges属性。如果有任何配置更改   然后,发生未选择由该属性报告的情况   而不是报告它,系统将停止并重新启动活动   (使用新配置启动它。)

我确实在我的活动中覆盖了这个方法,它很少被调用(例如,20次中可能有1次)。但问题已经消失,而且这种方法并没有真正被调用。所以我很困惑。也许这不是我的问题的底部,但是..某种程度上相关。