本人所有文章,暂时只作为个人闲暇之余的爱好,如偶有客官路过,权当我是打酱油的吧。
描述Activity的生命周期的文章很多,启动过程大致如下:
这里有一个疑问,启动过程的所有函数必然会被调用到吗?顺序一定严格相同吗?
我做了一个试验,主要包括以下几点:
1、分别在一个Activity A的onCreate、onStart、onResume中启动另外一个Activity B,有什么区别吗?
2、如果从Activity B返回,那么Activity的onStart、onResume中又会重新启动Activity B,会是什么样的现象呢?
代码如下:
package com.maxuming.sparrow;
import com.maxuming.sparrow.activity.MyMainActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class SparrowActivity extends Activity {
/*
* 为了演示方便,我们把onResume代码写在最前面
* @see android.app.Activity#onResume()
* @Override
*/
public void onResume(){
super.onResume();
Log.d(TAG, "Enter onResume!");
// start();
// 打开这个start,关闭其它几处start,结果毫无疑问:
// 启动过程为: onCreate onStart onResume -> 新的Activity
// 从新的Activity返回后: onStart onResume -> 新的Activity
}
@Override
public void onStart(){
super.onStart();
Log.d(TAG, "Enter onStart!");
// start();
// 打开这个start,关闭其它几处start
// 发现启动过程和从新的Activity返回后的执行过程,和把start放在onResume中居然是一样的。
// 启动过程为: onCreate onStart onResume -> 新的Activity
// 从新的Activity返回后: onStart onResume -> 新的Activity
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG, "Enter onCreate!");
start();
// 打开这个start,关闭其它几处start
// 发现启动过程和把start放在onResume中居然也是一样的。
// 启动过程为: onCreate onStart onResume -> 新的Activity
// 当然,从新的Activity返回后,结果稍有不同
// 从新的Activity返回后: onStart onResume
}
/*
* 启动一个新的Activity
*/
private void start() {
Intent intent = new Intent(this, MyMainActivity.class);
startActivity(intent);
}
private static final String TAG = "Main";
}
这个试验可以说明:
1、不管什么情况下,正常启动的Activity的调用方法过程必然是:onCreate, onStart, onResume, 这个过程并不会因为在onCreate、onStart方法的行为而改变;
2、如果在Activity A的onCreate或者onStart中启动一个新的Activity,那么这个新的Activity的onCreate也必然会在Activity A的Resume之后被执行。
3、是不是可以猜测一下Android内核的做法呢? 启动一个Activity B只是把Activity B的相关内容放到Stack的最上面,等待之前Activity A的逻辑执行之后,才会去真正的启动Activity B的逻辑呢。
4、这个过程对于习惯于面向过程(尤其是C语言)的朋友来说很容易理解错误。
那么如果在onCreate onStart onResume中调用两次或者三次start,现象又如何呢?
测试发现:
无论调用几次start,最后启动的Activity B只有一个,并且都在Activity A的onResume之后才会启动。
那么如果在一个Activity中启动一个Service,过程又会是什么样的呢?