Android面试题-----一个关于AndroidActivity的小例子

出处: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.csdn.net/weixin_39071173/article/details/89335433

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值