我要做 Android 之 Activity

简介: 1 说下 Activity 的生命周期为了巩固所学知识点,为自己找工作做准备,一是为了能分享给更多的人,所以从已经拿了6家 offer 的小姐姐 https://www.jianshu.com/u/203b606b956c 博客里抓来了这些面试题目赶紧复(预)习一下。

1 说下 Activity 的生命周期

为了巩固所学知识点,为自己找工作做准备,一是为了能分享给更多的人,所以从已经拿了6家 offer 的小姐姐 https://www.jianshu.com/u/203b606b956c 博客里抓来了这些面试题目赶紧复(预)习一下。

首先说下 Activity 生命周期的回掉方法

·//创建Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    //Activity快要变成可见的
    @Override
    protected void onStart() {
        super.onStart();
    }
    //Activity变成可见的,处于运行状态
    @Override
    protected void onResume() {
        super.onResume();
    }
    //其他Activity获得用户焦点,(Activity快要暂停了)
    @Override
    protected void onPause() {
        super.onPause();
    }
    //Activity不再可见,处于停止状态
    @Override
    protected void onStop() {
        super.onStop();
    }
    //Activity快要被销毁了
    @Override
    protected void onDestroy() {
        super.onDestroy();
   }

相信很多小伙伴对这些方法都比较熟悉,只是如果问的再详细一点呢?更详细一点呢?你还会比较熟悉吗?我的答案是不熟悉,相信很多小伙伴都有感觉,忘记的时候直接去查不就好了,但是面试官可不管啊童鞋们。面试大佬们一看这都不会,回去等通知吧。。。

这里我们可以看到 Activity 生命周期中的三个嵌套循环:(什么,三个,我怎么只看到一个,,,)

一:Activity 的 全部生命周期 发生在调用 onCreate() 和 调用 onDestory() 之间。在 onCreate() 方法中执行全局状态的建立(例如定义布局),在 onDestroy() 方法中释放所有保存的资源。

二:Activity 的 可见生命周期 发生在调用 onStart() 和 onStop() 之间。在这个期间,用户能在屏幕上看见 Activity,和它进行交互。系统在 Activity 的完整寿命中可能多次调用 onStart() 和 onStop(), 正如 Activity 交替地对用户可见或隐藏。

三:Activity 的 前台生命期 发生在调用 onResume() 和 onPause() 之间。在这期间,Activity 在屏幕上所有其他 Activity 的前面,有用户输入焦点。一个 Activity 能频繁的在前台进入和出去之间转变。

看下图(其实估计很多同学都看过,看烂了,没办法,图片虐我千百遍,我待图片如初恋)


img_cbc3e7ec8c9e0638f3388ab89e9e135d.png
andr01.png

我们书写两个 Activity,只有简单的显示功能

public class MainActivity extends AppCompatActivity {

    private Button btn_Second;
    private static final String TAG = "ActivityTest";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "MainActivity onCreate");

        btn_Second = findViewById(R.id.btn_second);

        btn_Second.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onStart() {
        Log.d(TAG, "MainActivity onStart");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.d(TAG, "MainActivity onResume");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.d(TAG, "MainActivity onPause");
        super.onPause();
    }


    @Override
    protected void onStop() {
        Log.d(TAG, "MainActivity onStop");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        Log.d(TAG, "MainActivity onDestroy");
        super.onDestroy();
    }


}

SecondActivity

public class SecondActivity extends AppCompatActivity {

    private static final String TAG = "SecondActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.d(TAG, "SecondActivity onCreate");
    }

    @Override
    protected void onStart() {
        Log.d(TAG, "MainActivity onStart");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.d(TAG, "MainActivity onResume");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.d(TAG, "MainActivity onPause");
        super.onPause();
    }


    @Override
    protected void onStop() {
        Log.d(TAG, "MainActivity onStop");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        Log.d(TAG, "MainActivity onDestroy");
        super.onDestroy();
    }
}

1 运行后的打印结果


img_676fbafde279d134db5f1aa295bc2993.png
andr02.png

点击按钮之后的截图


img_912c1d099497edcb4459343d9a9dc389.png
andr03.png

大家可以看到,生命周期的执行顺序,首先调用 MainActivity 的 pause 方法,之后是 SecondActivity 的正常创建显示,和上一个图顺序相同。等 SecondActivity 完全显示之后,会调用 MainActivity 的 stop 方法,表示该 Activity 停止活动。 ps:这是正常的活动跳转调用。

那如果不正常呢?

2 比如点击弹出的不是一个 Activity,二是一个 dialog。把 theme 改成这样:

img_b562cef285d02e9187bffa79c16325b0.png
andr06.png

运行结果是这样:


img_999f45977035dd91d81ca32986d09349.png
andr04.png

可以发现此时 MainActivity 完全可见,所以此时的执行周期是怎样的呢?

img_3bafb8f3e690a7dce1e8ca588eb96cd9.png
andr05.png

点击跳转之后只是执行了 MainActivity 方法,而没有执行 onStop 方法。记住,划重点啊朋友们。

3 若将SecondActivity改为不是Dialog,把上图中的 theme 这一行删掉即可。再点击跳转按钮: 依次调用了它的回调方法: onPause()->onStop()

4 当 Activity 处于运行状态的时候点击返回按钮,

img_d251dcc2d79495eae4b4a503e40980ff.png
andr07.png

点击返回按钮,Activity由运行状态变为死亡状态,依次调用它的回调方法:onPause() -> onStop() -> onDestroy()

5 当 Activity 处于运行状态的时候,点击 home 键直接返回桌面


img_6516e79c64fb73bae73e92341662c7c1.png
andr08.png

Activity由运行状态变为停止状态,依次调用它的回调方法:onPause()->onStop()

6:Activity处于运行状态,旋转屏幕:


img_4e12644df99825359e68f832a4389489.png
andr09.png

可以看出,旋转屏幕是一个销毁Activity然后重新创建Activity的过程。运行->暂停->停止->死亡->运行依次调用回调方法: onPause() -> onStop -> onDestroy() -> onCreate() -> onStart() -> onResume()

  1. Activity处于运行状态,手机此时锁屏。

手机锁屏,此时由于Activity不可见,会进入停止状态。依次调用回调方法:onPause()->onStop()

8.当应用正在运行时,手机锁屏,然后解锁回到应用界面。应用从停止状态恢复到运行状态。依次调用回调方法:onRestart() -> onStart() -> onResume();注意此时是 onRestart 方法

看看我们这篇文章解决了几个问题?

Q:说下Activity的生命周期?

Q:onStart()和onResume()/onPause()和onStop()的区别?

Q:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?

Activity1启动的时候
Activity1(onCreate)--->Activity1(onStart)--->Activity1(onResume)
Activity1跳转到Activity2的时候(2完全覆盖了1)
Activity1 (onPause)---> Activity1(onStop)
Activity2(onCreate)--->Activity2(onStart)--->Activity2(onResume)
特殊:
如果2是透明的窗体或者对话框样式的主题,那么1就不会调用onStop方法;
如果1已经存在该Activity的栈中,则不会调用onCreate方法。

呐,我在最后列出了问题,也给出了总结和补充,欢迎小伙伴们留言。

愿我们成为真实的自己。

目录
相关文章
|
Android开发
Android面试题之Activity的启动模式和flag
Android Activity的四种启动模式:standard(默认,每次启动创建新实例),singleTop(栈顶复用,不走onCreate,调用onNewIntent),singleTask(栈内唯一,清除上方Activity)和singleInstance(单独栈内唯一)。启动模式在AndroidManifest.xml中配置,Intent Flags如FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP可实现类似功能。了解这些对于处理Activity栈管理至关重要。
145 0
|
XML Java Android开发
利用Bundle实现Android Activity间消息的传递
利用Bundle实现Android Activity间消息的传递
123 2
|
11月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
202 6
|
11月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
132 3
|
11月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
133 3
|
XML Android开发 数据格式
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
本文通过案例分析了在Android中当两个Activity都设置了`android.intent.category.LAUNCHER`类别时,会导致它们同时在应用启动器的"所有应用"页面显示为不同的启动入口。
355 2
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
|
12月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
讲解Activity的启动流程了,Activity的启动流程相对复杂一下,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等, 首先介绍一下Activity,这里引用一下Android guide中对Activity的介绍:
204 4
|
11月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
109 0
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
471 12
|
开发工具 Android开发
解决Manifest merger failed : android:exported needs to be explicitly specified for <activity>
解决Manifest merger failed : android:exported needs to be explicitly specified for <activity>
477 1