生命周期与程序的健壮性有着密不可分的关系
- Activity的生命周期
- Fragment的生命周期
- Service的生命周期
1.Activity的生命周期
这张经典图大家一定不陌生,图中包含了两层含义
三个状态,分别是活动生存期,可见生存期,以及完整生存期
onStart→onResume→onPause→onSaveInstanceState→onStop 这段生命期称之可见生存期
onResume→onPause这段生命期称之活动状态生存期
onCreate→onDestroy这段生命期称之完整生存期各个生存期在什么情况下被调用
我们配合代码来验证一下官方图,毕竟动手实践过后才能更好的领悟,测试机型:Sumsung S6 edge+
public class MainActivity extends AppCompatActivity {
private static final String TAG = "LifeCycle";
private Button mybtnButton;
/**
* 在完整生存期开始时调用
*
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "Activity-----onCreate is call.......");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mybtnButton = (Button) findViewById(R.id.btn);
mybtnButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
/**
* 在onCreate方法后调用,用于恢复UI状态
* 从savedInstanceState恢复UI状态
* 这个savedInstanceState也被传递给了onCreate
* 自Activity上次可见之后,只有当系统终止了该Activity时,才会被调用
* 在随后的Activity进程的可见生存期之前被调用
*
* @see android.app.Activity#onRestoreInstanceState(android.os.Bundle)
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.i(TAG, "Activity-----onRestoreInstanceState is call start.......");
super.onRestoreInstanceState(savedInstanceState);
}
/**
* 在可见生存期开始时调用
*
* @see android.app.Activity#onStart()
*/
@Override
protected void onStart() {
Log.i(TAG, "Activity-----onStart is call start.......");
super.onStart();
}
/**
* 在Activity活动状态生存期开始时调用
*
* @see android.app.Activity#onResume()
*/
@Override
protected void onResume() {
Log.i(TAG, "Activity-----onResume is call start.......");
super.onResume();
}
/*
* 把UI状态保存到outState中
* 如果进程被运行时终止并重启,那么这个Bundle会被传递给onCreate和onRestoreInstanceState
* @see android.app.Activity#onSaveInstanceState(android.os.Bundle)
*/
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
Log.i(TAG, "Activity-----onSaveInstanceState is call start.......");
super.onSaveInstanceState(savedInstanceState);
}
/**
* 在Activity活动状态生存期结束时被调用
* 挂起UI更新,线程或者CPU密集的进程
*/
@Override
protected void onPause() {
Log.i(TAG, "Activity-----onPause is call start.......");
super.onPause();
}
/**
* 挂起UI更新,线程或者处理
* 当Activity不可见时,保存所有的编辑或者状态改变
* 调用这个方法后,进程可能会被终止
*/
@Override
protected void onStop() {
Log.i(TAG, "Activity-----onStop is call start.......");
super.onStop();
}
/**
* 清理所有的资源,包括结束线程,关闭数据库连接等
*/
@Override
protected void onDestroy() {
Log.i(TAG, "Activity-----onDestroy is call start.......");
super.onDestroy();
}
/**
* 当Activity由不可见到可见时调用
*/
@Override
protected void onRestart() {
Log.i(TAG, "Activity-----onRestart is call start.......");
super.onRestart();
}
}
首次打开Activity,程序运行日志:
com.example.administrator.lifecycle I/LifeCycle: Activity-----onCreate is call.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStart is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onResume is call start.......
Activity切换到后台不可见时,例如按下Home键,锁屏,跳转至另外一个activity,程序运行日志:
com.example.administrator.lifecycle I/LifeCycle: Activity-----onPause is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onSaveInstanceState is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStop is call start.......
Activity后台切换到前台,程序运行日志:
com.example.administrator.lifecycle I/LifeCycle: Activity-----onRestart is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStart is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onResume is call start.......
Activity处于可见状态但失去焦点时,例如栈顶的Activity是透明的或者栈顶Activity并不是铺满整个手机屏幕,需要注意的是Dialog并不会影响Activity的生命周期,程序运行日志:
com.example.administrator.lifecycle I/LifeCycle: Activity-----onPause is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onSaveInstanceState is call start.......
Activity由可见状态但失去焦点切换到可见并且有焦点,程序运行日志:
com.example.administrator.lifecycle I/LifeCycle: Activity-----onResume is call start.......
Activity退出销毁时,程序运行日志:
com.example.administrator.lifecycle I/LifeCycle: Activity-----onPause is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStop is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onDestroy is call start.......
Activity横竖屏切换时,程序运行日志:
com.example.administrator.lifecycle I/LifeCycle: Activity-----onPause is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onSaveInstanceState is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStop is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onDestroy is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onCreate is call.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStart is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onRestoreInstanceState is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onResume is call start.......
如何避免横竖屏切换重走生命周期?在AndroidManifest文件中的对应Activity中配置
android:configChanges="keyboardHidden|orientation|screenSize"
值得注意的是应用切换到后台,系统有可能会销毁这个后台进程,再次点击桌面APP,程序运行日志 :
com.example.administrator.lifecycle I/LifeCycle: Activity-----onDestroy is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onCreate is call.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onStart is call start.......
com.example.administrator.lifecycle I/LifeCycle: Activity-----onResume is call start.......
另外我们可以在onSaveInstanceState 中保存UI的状态,在onRestoreInstanceState中恢复UI的状态
2.Fragment的生命周期
Fragment不能单独存在需要依存Activity,Activity的生命周期会直接影响Fragment的生命周期。他们的生命周期大致是一致的,只是Fragment多了几个生命周期回调方法
实践验证
public class StateFragment extends Fragment {
private static final String TAG = "LifeCycle";
/**
* 调用该方法时,Fragment会被连接到它的父Activity上
*/
@Override
public void onAttach(Context context) {
Log.i(TAG, "Fragment-----onAttach is call start.......");
super.onAttach(context);
}
/**
* 调用该方法来进行Fragment的初始创建
*/
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "Fragment-----onCreate is call start.......");
super.onCreate(savedInstanceState);
}
/**
* 一旦Fragment已被创建,要创建它自己的用户界面时调用该方法
* 创建,或者填充Fragment的UI,并返回它
* 如果这个Fragment没有UI,那么返回null
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.i(TAG, "Fragment-----onCreateView is call start.......");
View view = inflater.inflate(R.layout.my_state_fragment, container, false);
return view;
}
/**
* 一旦父Activity和Fragment的UI已经被创建,则调用该方法
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Log.i(TAG, "Fragment-----onActivityCreated is call start.......");
super.onActivityCreated(savedInstanceState);
}
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
Log.i(TAG, "Fragment-----onViewStateRestored is call start.......");
super.onViewStateRestored(savedInstanceState);
}
/**
* 在可见生命周期的开始时被调用
*/
@Override
public void onStart() {
Log.i(TAG, "Fragment-----onStart is call start.......");
super.onStart();
}
/**
* 在活动生命周期开始时被调用
*/
@Override
public void onResume() {
Log.i(TAG, "Fragment-----onResume is call start.......");
super.onResume();
}
/**
* 在活动生命周期结束时被调用
*/
@Override
public void onPause() {
Log.i(TAG, "Fragment-----onPause is call start.......");
super.onPause();
}
/**
* 在活动生命周期结束时被调用,保存UI的状态变化
* 将UI的变化信息保存到savedInstanceState中
* 这个savedInstanceState会被传递到onCreate,onCreateView和onActivityCreated,onViewStateRestored(如果它的父Activity被终止并且重新启动)方法中
*/
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
Log.i(TAG, "Fragment-----onSaveInstanceState is call start.......");
super.onSaveInstanceState(savedInstanceState);
}
/**
* 在可见生命周期结束时调用该方法
*/
@Override
public void onStop() {
Log.i(TAG, "Fragment-----onStop is call start.......");
super.onStop();
}
/**
* 当Fragment的view被分离时,调用该方法
* 清除资源相关的view
*/
@Override
public void onDestroyView() {
Log.i(TAG, "Fragment-----onDestroyView is call start.......");
super.onDestroyView();
}
/**
* 在整个生命周期结束的时候调用
* 清除所有的资源,包括线程和关闭数据库连接等
*/
@Override
public void onDestroy() {
Log.i(TAG, "Fragment-----onDestroy is call start.......");
super.onDestroy();
}
/**
* 当Fragment从它的父Activity上分离时调用
*/
@Override
public void onDetach() {
Log.i(TAG, "Fragment-----onDetach is call start.......");
super.onDetach();
}
}
输出日志我就不贴了和Activity大致差不多,对照官方图以及对比图应该很好理解。
3.Service的生命周期
这张图说明了两种不同开启Service方式的生命周期,下面对这两种方式的区别和联系做一下说明
startService 如果Service已经开启过那么会直接调用onStartCommand(),这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它,当Service被停止时,系统会销毁它。
bindService 不允许多次绑定同一个组件(客户),但是可以绑定多个组件(客户),可以显示的调用unbindService来关闭这种连接,当多个客户都解除绑定之后也就是没有客户与Service有绑定关系了,系统会销毁Service。
一个被开启的service仍然可能被绑定,也就是startService后仍然可以bindService ,但是此时调用stopSelf()方法或者其他组件调用stopService()方法并不会停止Service,除非Service没有绑定关系了。