说到Activity 的生命周期,就不得不提这个经典Activity周期图:
从下面四点来说明Activity 的生命周期
1,Activity 的7种状态
(1)onCreate() : Activity 已经开启,但是对用户还不可见 。使用场景:初始化一些数据和View ,绑定Adapter 等等。
(2)onStart() :这个时候Activity 已经可见了,但是还不能和User 交互。使用场景:注册广播响应UI,这个生命周期用的并不太多。
(3)onResume() :这个时候Activity 代表在前台,并且可以和用户交互。使用场景:启动动画,打开相机等。
(4)onPause ():与onResume() 成对,这个状态不能与用户交互了。使用场景:释放一些onResume占用资源和保存一些数据,比如聊天界面保存草稿。
(5)onStop() :与onStart() 成对,这个状态已经不可见了。使用场景:释放一些onStart 占用的资源。
(6)onDestroy() :与onCreate 成对,Activity 销毁。使用场景:释放这个Activity 占用的资源。
(7)onRestart() :onStop() 后背重新唤起调用。使用场景:一些刷新操作。
这7种状态可以总结为四种状态
2,Activity 四种状态
(1)Running : 可见状态 (onCreate(),onStart(),onResume()),并且可以和用户交互。
(2)Paused : 可见但不是不能喝用户交互(onPause())。
(3)Stoped: 不可见(onStop())。
(4)Killed : Activity 被销毁。
3,onStart()和onResume()/onPause()和onStop()的区别?
onStart() 与onResume() 最大的区别 是 onResume 表明可以和用户交互,而onStart只是可见,并不能交互。
onPause() 与onStop() 最大的区别是 onPause 是可见的,但是不可见交互,但是onStop 是完全不可见的。
onStart()与onStop() 和 onResume() 与onPause() 总是成对出现。
4,Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?
这是MainActivity (A)
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG,"onCreate-----------");
findViewById(R.id.sec_activity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG,"onStart-----------");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG,"onResume-----------");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG,"onPause-----------");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG,"onStop-----------");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG,"onDestroy-----------");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG,"onRestart-----------");
}
}
MainActivity 启动后日志:
09-11 19:20:47.031 9204-9204/com.fiberhome.activitylifecycle E/MainActivity: onCreate-----------
09-11 19:20:47.031 9204-9204/com.fiberhome.activitylifecycle E/MainActivity: onStart-----------
09-11 19:20:47.033 9204-9204/com.fiberhome.activitylifecycle E/MainActivity: onResume-----------
启动SecActivity (B)后日志:
09-11 19:21:42.359 9204-9204/com.fiberhome.activitylifecycle E/MainActivity: onPause-----------
09-11 19:21:42.791 9204-9204/com.fiberhome.activitylifecycle E/MainActivity: onStop-----------
这说明:
A 启动B ,A会回调 onPause(),onStop()。
设置SecActivity(B) 透明
<style name="Theme.AppCompat.Translucent" parent="Theme.AppCompat.NoActionBar">
<item name="android:background">#33000000</item> <!-- Or any transparency or color you need -->
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>
<activity
android:name=".SecActivity"
android:theme="@style/Theme.AppCompat.Translucent"
></activity>
启动后日志:
09-11 19:24:16.220 9618-9618/com.fiberhome.activitylifecycle E/MainActivity: onPause-----------
这说明:
A启动B之后,A仍然可见,A回调onPause(),不会回调onStop()。对比 1 中的 onPause() 和onStop()。
如果启动一个Dialog ,结果又会怎么样呢?
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG,"onCreate-----------");
findViewById(R.id.sec_activity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/* Intent intent = new Intent(MainActivity.this,SecActivity.class);
startActivity(intent);*/
AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
alertDialog.setTitle("test").setMessage("test").setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
/* alertDialog.show();
ProgressDialog loadingDialog = ProgressDialog.show(MainActivity.this, null, "test");
loadingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
loadingDialog.show();// 设置圆形旋转进度条*/
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG,"onStart-----------");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG,"onResume-----------");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG,"onPause-----------");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG,"onStop-----------");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG,"onDestroy-----------");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG,"onRestart-----------");
}
}
点击后发现并没有回调任何生命周期,
由此看出,启动一个Dialog 不会回调上面的7种方法。