0

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

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 个 Activity,Android 4.0.3 决定它应该启动(创建)Set 中的一个 Activity 的另一个实例(它似乎特别喜欢启动一个特定的 Activity,而不仅仅是任何一个)。他们完成了所有活动(因此 4 个被破坏的活动而不是原来的 3 个)

我确定不是我无意中创建了该活动 - 我的所有 launchActivity 逻辑都通过将 FLAG_ACTIVITY_REORDER_TO_FRONT 标志附加到 Intent 的方法进行过滤,因此我不能以相同的 Activity 类的两个实例结束。必须是重新创建它的操作系统。

也尝试不使用 'android:launchMode="singleTop"' 清单文件属性 - 对于应用程序中的所有活动都是如此。一样。

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

谢谢


4

1 回答 1

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

现在,文档还指出:

public void onConfigurationChanged (Configuration newConfig) 自:API 级别 1

当您的活动运行时设备配置发生更改时由系统调用。请注意,仅当您选择了要使用清单中的 configChanges 属性处理的配置时,才会调用此方法。如果发生任何未被该属性选择报告的配置更改,则系统不会报告它,而是停止并重新启动活动(以使用新配置启动它)。

我确实在我的活动中重写了这个方法,它很少被调用(比如,20 次中可能有 1 次)。但是问题消失了,这个方法并没有真正被调用。所以我有点困惑。也许这不是我问题的根源,而是……某种程度上相关。

于 2012-09-05T22:22:34.987 回答