我开发了一个简单的应用程序,在Android 4.4.X设备上表现出一些奇怪的行为。
假设我想要有两个“主”活动,其中第一个在每次恢复时通过启动“HelloActivity”每秒钟说“您好”,而第二个具有android:launchMode =“singleTask”android:taskAffinity =“.MyAffinity”
定义。 第二个是由第一个启动的。
我的代码
清单文件非常简单:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="14" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.affinitylaunchmodebugtest.MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:label="HELLO"
android:name="com.example.affinitylaunchmodebugtest.HelloActivity"
android:configChanges="keyboardHidden|orientation|screenSize">
</activity>
<activity
android:label="AffinityTestActivity"
android:name="com.example.affinitylaunchmodebugtest.AffinityTestActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask"
android:taskAffinity=".MyAffinity">
</activity>
</application>
MainActivity 在按下按钮时启动 AffinityTestActivity 并记录其生命周期。每隔一秒,它还会在恢复时启动 HelloActivity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println(this+" onCreate");
super.onCreate(savedInstanceState);
Button b = new Button(MainActivity.this);
b.setText("START AFFINITY TEST ACTIVITY");
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println(this+" starts "+AffinityTestActivity.class.getSimpleName());
Intent intent = new Intent(MainActivity.this, AffinityTestActivity.class);
startActivity(intent);
}
});
setContentView(b);
}
private boolean skipHello = true;
@Override
protected void onResume() {
System.out.println(this+" onResume");
super.onResume();
if (!skipHello) {
System.out.println(this+" starts "+HelloActivity.class.getSimpleName());
Intent intent = new Intent(MainActivity.this, HelloActivity.class);
startActivity(intent);
skipHello = true;
} else {
skipHello = false;
}
}
@Override
protected void onPause() {
System.out.println(this+" onPause");
super.onPause();
}
@Override
protected void onDestroy() {
System.out.println(this+" onDestroy");
super.onDestroy();
}
}
AffinityTestActivity在按钮单击时调用finish()并记录其生命周期:
public class AffinityTestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println(this+" onCreate");
super.onCreate(savedInstanceState);
Button b = new Button(AffinityTestActivity.this);
b.setText("FINISH");
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println(this+" finishes");
finish();
}
});
setContentView(b);
}
@Override
protected void onResume() {
System.out.println(this+" onResume");
super.onResume();
}
@Override
protected void onPause() {
System.out.println(this+" onPause");
super.onPause();
}
@Override
protected void onDestroy() {
System.out.println(this+" onDestroy");
super.onDestroy();
}
}
HelloActivity 和 AffinityTestActivity 实际上是相同的 - 它们只有一个调用 finish() 方法的按钮和打印日志以记录其生命周期。
测试场景
- 启动 MainActivity。
- 启动 AffinityTestActivity。
- 结束 AffinityTestActivity (当 AffinityTestActivity 结束时,MainActivity 被恢复并启动了 HelloActivity)。
- 分析输出结果。
日志
Android 4.4.2 和 4.4.3: (在 Nexus 7 II 和 Samsung Galaxy S5 上进行测试) 可以看到,日志以 HelloActivity 的 onPause 结尾,这是不合理的(在步骤3中,HelloActivity 显示在顶部)。此外,AffinityTestActivity 没有被销毁,而 MainActivity 没有暂停。
06-20 11:13:20.547: I/System.out(18650): com.example.affinitylaunchmodebugtest.MainActivity@41f17e50 onCreate
06-20 11:13:20.557: I/System.out(18650): com.example.affinitylaunchmodebugtest.MainActivity@41f17e50 onResume
06-20 11:13:25.371: I/System.out(18650): com.example.affinitylaunchmodebugtest.MainActivity$1@41f6e5c0 starts AffinityTestActivity
06-20 11:13:25.581: I/System.out(18650): com.example.affinitylaunchmodebugtest.MainActivity@41f17e50 onPause
06-20 11:13:25.591: I/System.out(18650): com.example.affinitylaunchmodebugtest.AffinityTestActivity@41f6a480 onCreate
06-20 11:13:25.611: I/System.out(18650): com.example.affinitylaunchmodebugtest.AffinityTestActivity@41f6a480 onResume
06-20 11:13:36.452: I/System.out(18650): com.example.affinitylaunchmodebugtest.AffinityTestActivity$1@41f1ede8 finishes
06-20 11:13:36.662: I/System.out(18650): com.example.affinitylaunchmodebugtest.AffinityTestActivity@41f6a480 onPause
06-20 11:13:36.682: I/System.out(18650): com.example.affinitylaunchmodebugtest.MainActivity@41f17e50 onResume
06-20 11:13:36.682: I/System.out(18650): com.example.affinitylaunchmodebugtest.MainActivity@41f17e50 starts HelloActivity
06-20 11:13:36.782: I/System.out(18650): com.example.affinitylaunchmodebugtest.HelloActivity@41f8dbb8 onCreate
06-20 11:13:36.802: I/System.out(18650): com.example.affinitylaunchmodebugtest.HelloActivity@41f8dbb8 onResume
06-20 11:13:36.852: I/System.out(18650): com.example.affinitylaunchmodebugtest.HelloActivity@41f8dbb8 onPause
旧版 Android(<4.4.2,测试过 2.3.5、4.1.2 和 4.2.1 设备以及 4.0.3 模拟器)表现如预期 - HelloActivity 在 onResume 后不会被暂停,AffinityTestActivity 被销毁:
06-20 11:16:30.867: I/System.out(3296): com.example.affinitylaunchmodebugtest.MainActivity@40f998b0 onCreate
06-20 11:16:30.907: I/System.out(3296): com.example.affinitylaunchmodebugtest.MainActivity@40f998b0 onResume
06-20 11:16:34.157: I/System.out(3296): com.example.affinitylaunchmodebugtest.MainActivity$1@40f9b350 starts AffinityTestActivity
06-20 11:16:34.277: I/System.out(3296): com.example.affinitylaunchmodebugtest.MainActivity@40f998b0 onPause
06-20 11:16:34.297: I/System.out(3296): com.example.affinitylaunchmodebugtest.AffinityTestActivity@40fab810 onCreate
06-20 11:16:34.357: I/System.out(3296): com.example.affinitylaunchmodebugtest.AffinityTestActivity@40fab810 onResume
06-20 11:16:38.687: I/System.out(3296): com.example.affinitylaunchmodebugtest.AffinityTestActivity$1@40fad640 finishes
06-20 11:16:38.707: I/System.out(3296): com.example.affinitylaunchmodebugtest.AffinityTestActivity@40fab810 onPause
06-20 11:16:38.717: I/System.out(3296): com.example.affinitylaunchmodebugtest.MainActivity@40f998b0 onResume
06-20 11:16:38.717: I/System.out(3296): com.example.affinitylaunchmodebugtest.MainActivity@40f998b0 starts HelloActivity
06-20 11:16:38.747: I/System.out(3296): com.example.affinitylaunchmodebugtest.MainActivity@40f998b0 onPause
06-20 11:16:38.777: I/System.out(3296): com.example.affinitylaunchmodebugtest.HelloActivity@40fbdd48 onCreate
06-20 11:16:38.827: I/System.out(3296): com.example.affinitylaunchmodebugtest.HelloActivity@40fbdd48 onResume
06-20 11:16:39.877: I/System.out(3296): com.example.affinitylaunchmodebugtest.AffinityTestActivity@40fab810 onDestroy
我的问题:
- 为什么我的HelloActivity在Android 4.4.X设备上启动并显示在顶部后立即暂停?
- 我该如何避免这种情况,强制应用程序具有“正常”的活动生命周期,就像老版本的Android(<4.4.2)一样?
我正在开发一个更复杂的应用程序,需要处理其活动的生命周期,而这种行为会破坏我的应用程序功能。
非常感谢!