关于Android活动生命周期

关于Android活动生命周期,android,android-activity,Android,Android Activity,我想研究AcitCity liftTimes,然后我有两个活动,称为MainActivity和SecondActivity,我将启动模式设置为singleTask模式,代码如下: public class MainActivity extends Activity { /** Called when the activity is first created. */ public static final String PREFS_NAME = "MyPrefsFile"; private T

我想研究AcitCity 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");
}
}

} 步骤1: 开展主要活动; 日志显示如下:

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
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
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
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
步骤2: 从主要活动到次要活动; 日志显示如下:

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
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
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
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
步骤3: 从第二个活动到主活动 日志显示如下:

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
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
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
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到SecondActivity 日志显示如下:

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
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
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
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,main活动调用ondestory()方法?
有人帮我吗?

我尝试了你的代码,但我的onDestroy()方法没有被调用。 在您的情况下,onDestroy会被调用,我想是因为系统想在您的步骤4之后清除一些内存,您的后退如下所示

方法4之后的后堆栈如下所示

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

调用的onDestroy方法

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


因为系统在为活动调用销毁方法之后调用了stop方法,所以何时调用销毁方法取决于设备


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

它完全取决于运行应用程序的设备。如果您有高端设备(内存>1GB;您可能不会看到调用onDestroyed()。这是因为Android可以在更多内存中运行更多应用程序

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

onStop()和onDestroy()的主要区别在于,onStop()只挂起您的活动(UI和UI线程),但它不会触及您正在运行的线程(如网络线程、服务、接收器等)。因此,即使调用了onStop(),您的应用程序仍可以在后台工作(播放音乐或下载内容)

android系统调用onDestroy()来声明内存空间(用于新活动调用或自身),它将销毁位于ActivityStack底部的活动。您可以将onDestroy()视为来自系统的正常关机请求。如果onDestroyed()发生故障,您应该停止所有操作调用。在此调用之后,您的每个线程都将被终止


希望这能有所帮助,尊敬的。

谢谢您的回复,我在两个不同的设备上测试了代码,但是当我转到步骤4时,总是会调用onDestroy(),因此可能不是因为系统想要清除一些内存和调用onDestroy()方法;顺便说一句,我将这两个活动设置为singleTask模式,因此后堆栈必须如下所示:SecondActivity和MainActivity only(后堆栈上只有一个实例活动)?@lgw150在调用startActivity()之前,是否使用intent.setFlags(FLAG_activity_SINGLE_TOP)为intent设置了FLAG_activity_SINGLE_TOP FLAG?

如果设置,则如果活动已在历史堆栈顶部运行,则不会启动该活动。Hmmmm请尝试一件事,在移动设备中从任务管理器关闭所有应用程序,然后再次运行此代码,然后查看onDestroy()是否获取或不获取调用。@fadedreamz:不,我只是在manifest.xml中设置启动模式,如下所示:,正如google文档所说,singTask模式活动始终是堆栈上的根活动,因此我没有像您所说的那样添加标志。@lgw150就我的经验而言,singleTask不适合于正常的应用程序,因为它们有点像r表示,如果从其他活动中重新调用它们,应该会给您一个很好的解释,尽管我不确定。。。