0

我想研究Acitvity liftTimes,然后我有两个Activity,分别称为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

第二步:从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() 方法?谁来帮帮我?

4

3 回答 3

1

我试过你的代码,我的 onDestroy() 方法没有被调用。在您的情况下,我想 onDestroy 被调用是因为系统想要清除一些内存在您的 Step4 之后,您的 backStack 如下所示

方法4之后的你的回栈是这样的

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

根据开发者网站

调用 onDestroy 方法

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

于 2013-10-22T07:19:26.620 回答
1

由于系统调用了 stop 方法,然后为 Activity 调用了 destroy 方法,何时调用 destroy 方法取决于设备。

stop 方法不会删除设备上 Activity 的内存,但该 Activity 不再工作,但一旦调用 destroy 方法,该 Activity 的所有内存分配都将被销毁。

于 2013-10-22T07:24:50.787 回答
0

它完全取决于正在运行的应用程序的设备和#。如果您有一个高端设备(其 RAM 大于 1GB;您可能不会看到调用 onDestroyed()。那是因为 Android 可以让更多应用程序在更多内存中运行。

同样,您始终可以通过从 TaskManager 中终止任务来强制调用 onDestroy()。或者,您可以在 ICS+ 设备上设置开发人员选项“不保留活动”。每当您离开时,这总是会破坏您的应用程序。

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

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

希望这会有所帮助,问候。

于 2013-10-22T08:46:07.000 回答