2015-04-29 16 views
6

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)

<?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 TimerTimerTask để 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
+0

trở lại đúng trong onOptionsItemSelected() và kiểm tra – Keshav1234

+0

sai hoặc đúng không thay đổi bất cứ điều gì – gleroyDroid

+0

bạn gọi startActivity (B) trong A.onResume()? mục đích của UX lạ đó là gì? – pskink

Trả lời

1

Thay finish() thử finishAffinity(). Theo như tôi biết: finish() chỉ hủy cuộc sống hiện tại Activity trong khi, finishAffinity() hủy mọi hoạt động Activities.

+0

finishAffinity() có thể giết chết nhiều hoạt động – gleroyDroid

0

Giải pháp tốt nhất là đơn giản để phát hiện có hay không nó rất hữu ích để bắt đầu Hoạt động FakeB.

Các vấn đề liên quan