Quá trình tiếp theo là đơn giản để hiểu và để tái tạo nhưng dẫn đến một lỗi:Tại sao onDestroy không hoạt động A không được gọi sau khi một cuộc gọi để kết thúc() trong ActivityB
- activityA bắt đầu một activityB trong
onCreate()
phương pháp của nó - activityB được tạo ra và tôi gọi
finish()
trong phương pháp của nó onResume() - activityB
onDestroy()
được gọi - activityA
onResume()
được gọi - và ở đây trong activityA, tôi bấm vào một nút menu để gọi
finish()
- hoặc nhấn phím quay lại. - activityA được lấy ra nhưng
onDestroy()
KHÔNG gọi và A vẫn còn sống (dumpsys adb shell 'myPackageName' chỉ ra quá nhiều hoạt động sinh hoạt)
Mã
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="gleroy.com.algo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".activity.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="gleroy.com.algo.activity.FakeA"
android:label="@string/app_name"></activity>
<activity
android:name="gleroy.com.algo.activity.FakeB"
android:label="@string/app_name"></activity>
</application>
</manifest>
Hoạt động A:
public class FakeA extends Activity {
private final static String TAG = FakeA.class.getCanonicalName();
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate, taskId :" + getTaskId());
super.onCreate(savedInstanceState);
Intent intent = new Intent(FakeA.this, FakeB.class);
startActivity(intent);
}
@Override
protected void onResume() {
Log.d(TAG, "onResume");
super.onResume();
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
super.onCreateOptionsMenu(menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.stop_session_menu_item:
/* stop and quit */
finish();
return false;
}
return super.onOptionsItemSelected(item);
}
}
Hoạt động B:
public class FakeB extends Activity {
private final static String TAG = FakeB.class.getCanonicalName();
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate, taskId :"+getTaskId());
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume, isFinishing :" + isFinishing());
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
}
Hoạt động A được bắt đầu từ MainActivity, trong đó có một nút đơn giản:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, FakeA.class);
startActivity(intent);
}
});
Vì vậy, tôi biết rằng chúng tôi không thể chắc chắn rằng onDestroy()
là gonna được gọi nhưng đây ActivityA của tôi là bị rò rỉ rõ ràng.
Ngoài ra tôi quan sát thấy rằng nếu tôi sử dụng một Timer
và TimerTask
để trì hoãn startActivity
trong ActivityA hoặc finish()
trong ActivityB sau đó tôi không có lỗi này nữa.
Dưới đây là những sự kiện:
- FakeA onCreate, taskID: 154
- FakeA onResume
- FakeA onPause, isFinishing: false
- FakeB onCreate, taskID: 154
- FakeB onResume, isFinishing: false
- FakeA onResume
- FakeB onD estroy
- cuộc gọi kết thúc hoặc nhấn phím BACK: FakeA onPause, isFinishing: true
trở lại đúng trong onOptionsItemSelected() và kiểm tra – Keshav1234
sai hoặc đúng không thay đổi bất cứ điều gì – gleroyDroid
bạn gọi startActivity (B) trong A.onResume()? mục đích của UX lạ đó là gì? – pskink