我有一个退出方法可以做到这一点:
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,然后立即终止它。
由于
答案 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次)。但问题已经消失,而且这种方法并没有真正被调用。所以我很困惑。也许这不是我的问题的底部,但是..某种程度上相关。