我想研究Acitvity,然后我有两个活动,名为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,日志文件如下所示:
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()方法?谁来帮帮我?
发布于 2013-10-22 07:19:27
我尝试了您的代码,但是我的onDestroy()方法没有被调用。在本例中,我猜是因为系统希望在Step4之后清除一些内存,所以会调用onDestroy。backStack如下所示
方法4之后的后堆栈如下所示
SecondActivity Step 4
MainActivity Step 3
SecondActivity Step 2
MainActivity Step 1
根据developer website的说法
调用的onDestroy方法
在您的活动被销毁之前,您收到的最后一个呼叫。这可能是因为活动正在结束(有人对其调用finish() ),也可能是因为系统临时销毁了该活动的此实例以节省空间。您可以使用isFinishing()方法区分这两个场景。
发布于 2013-10-22 07:24:51
在系统调用stop方法之后,将为活动调用destroy方法,何时调用destroy方法由设备决定。
stop方法不会删除设备上活动的内存,但该活动不再工作,但一旦调用destroy方法,该活动的所有内存分配都会被销毁。
发布于 2013-10-22 08:46:07
它完全依赖于正在运行的应用程序的设备和数量。如果您有一个高端设备(内存大于1 1GB;您可能不会看到调用onDestroyed()。这是因为Android可以在更多的内存中运行更多的应用程序。
同样,您可以通过终止来自TaskManager的任务来强制调用onDestroy()。或者,您可以在ICS+设备上设置开发人员选项“不保留活动”。每当你离开你的应用程序时,这总是会毁掉它。
onStop()和onDestroy()之间的主要区别是onStop()只挂起您的活动(UI和UI线程),但它不会触及您正在运行的线程(如网络线程、服务、接收者e、g)。因此,即使调用了onStop(),您的应用程序仍然可以在后台工作(播放音乐或下载内容)。
onDestroy()被安卓系统调用来占用内存空间(用于新的活动调用或自身),它将销毁位于ActivityStack底部的活动。您可以将onDestroy()视为来自系统的正常关闭请求。如果调用了onDestroyed(),则应该停止所有操作。在这个调用之后,你的每个线程都将被终止。
希望这能有所帮助,致敬。
https://stackoverflow.com/questions/19510695
复制