关于Android Activity LifeTimes

时间:2013-10-22 06:36:15

标签: android android-activity

我想学习Acitvity liftTimes,然后我有两个活动,叫做MainActivity和SecondActivity,我将启动模式设置为singleTask模式,代码如下:

public class MainActivity extends Activity {

/** Called when the activity is first created. */
public static final String PREFS_NAME = "MyPrefsFile";
private TextView tv;
private Button bt;
private final static String TAG = "MainActivity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e(TAG+"onCreate", "onCreate");
    setContentView(R.layout.activity_main);
    findViews();
    tv.setText("MainActivity ID:" + this.toString());
    bt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(MainActivity.this,
                    SecondActivity.class);
            startActivity(intent);

        }
    });
}

private void findViews() {
    // TODO Auto-generated method stub
    tv = (TextView) findViewById(R.id.textView);
    bt = (Button) findViewById(R.id.turnBt);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
    Log.e(TAG+"onRestoreInstanceState", "onRestoreInstanceState");
}
@Override
protected void onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
    Log.e(TAG+"onRestart", "onRestart");
}
@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Log.e(TAG+"onStart", "onStart");
}
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    Log.e(TAG+"onResume", "onResume");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
    Log.e(TAG+"onSaveInstanceState", "onSaveInstanceState");
}
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    Log.e(TAG+"onPause", "onPause");
}
@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Log.e(TAG+"onDestroy", "onDestroy");
}
@Override
protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    Log.e(TAG+"onStop", "onStop");
}

}

public class SecondActivity extends Activity{
private TextView tv;
private Button bt;
private final static String TAG = "SECONDACTIVITY";
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    Log.e(TAG, "onCreate");
    setContentView(R.layout.second_layout);
    findViews();
    tv.setText("第二个界面的ID:"+this.toString()); 
    bt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
             Intent intent = new Intent(SecondActivity.this, MainActivity.class);  
                startActivity(intent); 

        }
    });
}

private void findViews() {
    // TODO Auto-generated method stub
    tv = (TextView)findViewById(R.id.textView);
    bt = (Button) findViewById(R.id.turnBt);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
    Log.e(TAG, "onRestoreInstanceState");
}
@Override
protected void onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
    Log.e(TAG, "onRestart");
}
@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Log.e(TAG, "onStart");
}
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    Log.e(TAG, "onResume");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
    Log.e(TAG, "onSaveInstanceState");
}
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    Log.e(TAG, "onPause");
}
@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Log.e(TAG, "onDestroy");
}
@Override
protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    Log.e(TAG, "onStop");
}

} 步骤1: 启动MainActivity; logcat显示如下:

10-22 13:56:59.704: E/MainActivityonCreate(4649): onCreate
10-22 13:56:59.735: E/MainActivityonStart(4649): onStart
10-22 13:56:59.736: E/MainActivityonResume(4649): onResume

第2步: 从MainActivity到SecondActivity; logcat显示如下:

10-22 14:03:52.452: E/MainActivityonPause(4884): onPause
10-22 14:03:52.462: E/SECONDACTIVITY(4884): onCreate
10-22 14:03:52.485: E/SECONDACTIVITY(4884): onStart
10-22 14:03:52.485: E/SECONDACTIVITY(4884): onResume
10-2214:03:52.773:E/MainActivityonSaveInstanceState(4884): onSaveInstanceState
10-22 14:03:52.774: E/MainActivityonStop(4884): onStop

第3步: 从SecondActivity到MainActivity logcat显示如下:

10-22 14:05:14.561: E/SECONDACTIVITY(4884): onPause
10-22 14:05:14.574: E/MainActivityonCreate(4884): onCreate
10-22 14:05:14.592: E/MainActivityonStart(4884): onStart
10-22 14:05:14.593: E/MainActivityonResume(4884): onResume
10-22 14:05:14.877: E/SECONDACTIVITY(4884): onSaveInstanceState
10-22 14:05:14.877: E/SECONDACTIVITY(4884): onStop

第4步: 从MainActivity到SecondActivity logcat显示如下:

10-22 14:05:51.049: E/MainActivityonPause(4884): onPause
10-22 14:05:51.061: E/SECONDACTIVITY(4884): onRestart
10-22 14:05:51.061: E/SECONDACTIVITY(4884): onStart
10-22 14:05:51.061: E/SECONDACTIVITY(4884): onResume
10-22 14:05:51.330: E/MainActivityonStop(4884): onStop
10-22 14:05:51.330: E/MainActivityonDestroy(4884): onDestroy

我的问题:为什么第4步,MainActivity调用onDestroy()方法? 有人帮帮我吗?

3 个答案:

答案 0 :(得分:1)

我尝试了你的代码,我的onDestroy()方法没有被调用。 在你的情况下onDestroy被调用我猜是因为系统想要清除一些内存在你的Step4之后你的backStack看起来像下面

方法4之后的后堆栈就像这样

SecondActivity  Step 4
MainActivity    Step 3
SecondActivity  Step 2
MainActivity    Step 1

根据developer website

onDestroy方法叫

  

在您的活动被销毁之前收到的最后一个电话。这可能是因为活动正在完成(有人在其上调用finish(),或者因为系统暂时销毁此活动实例以节省空间。您可以使用isFinishing()方法区分这两种情况。

答案 1 :(得分:1)

当系统调用stop方法之后,会为活动调用destroy方法,并且在调用destroy方法时它将由设备决定。

stop方法不会删除设备上活动的内存,但活动不再有效,但是一旦调用destroy方法,活动的所有内存分配都将被销毁。

答案 2 :(得分:0)

完全依赖于设备&运行应用程序的数量。如果你有一个高端设备(RAM> 1GB;你可能不会看到调用onDestroyed()。这是因为Android可以让更多应用程序在更多内存中运行。

同样,你总是可以通过从TaskManager中删除任务来强制onDestroy()被调用。或者,您可以在ICS +设备上设置开发人员选项“不要保留活动”。无论何时离开,这都会破坏您的应用。

onStop()和onDestroy()之间的主要区别在于onStop()仅挂起您的Activity(UI和UI线程),但它不会触及您正在运行的线程(如网络线程,服务,接收器e,g) 。因此,即使调用onStop(),您的应用仍然可以在后台运行(播放音乐或下载内容)。

android系统调用onDestroy()来声明内存空间(对于新的活动调用或自身),它将破坏位于ActivityStack底部的Activity。您可以将onDestroy()视为系统中的正常关闭请求。如果onDestroyed()调用,你应该停止一切。在此调用之后,您的每个线程都将被终止。

希望这有帮助,问候。