出处:2019年字节跳动秋招题
问题链接:https://www.nowcoder.com/discuss/208452?type=post&order=time&pos=&page=1&subType=2
参考文章:https://www.cnblogs.com/zgqys1980/p/5088590.html
问题:两个Activity A与B,A切到B,然后按返回键,B再切回A,请问两个Activity都经历了生命周期的哪几步?
------------------------- 我的理解 -------------------------
对Activity生命周期不了解的建议去参考文章补补课,博主讲得很详细,这里我直接上我的测试代码,再根据log进行解释。
Activity1代码:
import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "chenmougou";
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "activity1-onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "activity1-onResume");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "activity1-onRestart");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button b = this.findViewById(R.id.bt);
Log.d(TAG, "activity1-onCreate");
final Intent intent = new Intent(this, Activity2.class);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent);
}
});
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "activity1-onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "activity1-onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "activity1-onDestroy");
}
}
Activity2代码:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class Activity2 extends AppCompatActivity {
private static final String TAG = "chenmougou";
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "activity2-onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "activity2-onResume");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "activity2-onRestart");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_2);
Log.d(TAG, "activity2-onCreate");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "activity2-onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "activity2-onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "activity2-onDestroy");
}
}
1. 启动Activity1(即MainActivity):
2. 点击按钮,有Activity1 跳转到 Activity2:
点击按钮从Activity1跳转到Activity2时,Activity1先执行onPause(),此时未从前台消失;而Activity2经过onCreate(),onStart()创建完成后,执行onResume()后便显示在前台;而此时Activity1在执行onStop(),从前台消失。
3. 点击返回按钮,返回到Activity1:
当按下返回键后,Activity先执行onPause()暂停活动,由于Activity1前面已经创建过,且在栈中,此时Activity1不执行OnCreate(),而是执行onRestart()和onStart(),再执行onResume()出现在前台,此时Activity2,由于是被排出栈,所以执行完onStop()消失后,会执行onDestroy(),等待被回收。
总结:
(1)onResume()让界面显示在前台,onStop()让界面退出前台;
(2)Activity执行onPause()不一定会执行onStop(),因为新创建的Activity2不一会覆盖完原先的Activity1,所以此时Activity不会消失,也就没执行onStop();
拓展:
(1)音乐播放时,在跳转界面时,一般把音乐的开关放在哪两个生命周期函数呢?(答案:音乐关闭一般放在onPause(),才不用等到界面消失才关闭;而音乐开始一般放在onResume(),才能保证音乐跟随界面一块出现。)
(2)APP在退出登录后返回登录界面,怎么保证按返回键不会返回到原来的界面而是返回到桌面呢?
(答案:可参考我以前的一篇博客:https://blog.youkuaiyun.com/weixin_39071173/article/details/89335433)