Android基础知识点(1)--Activity

让人想犯罪 __ 提交于 2020-01-11 13:46:20

一、信息

整理:yoyiyi(soleil雪寂)

创建时间:2019 年 6 月 25 日

修改时间:2020 年 1 月 11 日

校对:yoyiyi(soleil雪寂)

状态:更新中

字数:2875 字

仓库:Soleil-Notes

二、目录

三、正文

1、Activity 生命周期

Activity 生命周期一共七个方法:

  1. onCreate():Activity 正在被创建,可以做些初始化工作,比如 setContentView 加载界面布局文件、初始化 Activity 所需数据等。
  2. onStart(): 表示 Activity 正在被启动,Activity 可见,处于前台,但是无法和用户交互。
  3. onRestart():表示 Activity 正在重新启动,当 Activity 不可见变为可见状。
  4. onResume(): 表示 Activity 可见,出现在前台,可以和用户交互。
  5. onPause(): 表示 Activity 正在停止,正常情况下,会调用 onStop() 。
  6. onStop():表示 Activity 即将停止。
  7. onDestroy():表示 Activity 即将被销毁,常常做回收工作、资源释放。

注:参考《Android开发艺术探索》

Activity生命周期

2、Activity 状态

  1. 激活状态:Activity 位于屏幕前端,可以与用户交互,也称为运行状态。
  2. 暂停状态:Activity 被遮挡,但是依旧可见。
  3. 停止状态:Activity 完全被遮挡,不可见。
  4. 销毁状态:Activity 被销毁了。

3、Activity 四种启动模式以及使用场景

  1. standard 标准模式:每次启动创建一个 新 Activity。
  2. singleTop 栈顶复用模式:判断 Activity 是不是栈顶,是则调用 onNewIntent(),否则创建新 Activity。常常用于通知启动界面(新闻类 App 通知,点击跳转到内容界面)。
  3. singTask 栈内复用模式:只要 Activity 在栈中存在,多次启动,不会创建新实例,会调用onNewIntent(),并且还有 clearTop 功能,把上面的 Activity 清理掉。常常用于程序入口(浏览器主界面)。
  4. singInstance 单实例模式:创建一个单独任务栈,只有一个 Activity 实例,例如闹铃、呼叫来电界面。

4、Activity、View、Window 之间的关系

  1. Activity 创建时候调用 attach(),创建一个 Window(子类 PhoneWindow);
  2. Activity 调用 setContentView(R.layout.xxx)实际上调用 getWindow().setContentView()(PhoneWindow中的setContentView()),将 view 设置到 PhoneWindow 中,PhoneView 持有一个 DecorView,DecorView 是一个FrameLayout,有 ActionBar + ContentParent(LayoutInfalte 解析 xml 赋值给 mContentParent(本质 ViewGroup))组成,ContentParent就是我们布局文件。
  3. PhoneWindow 内部通过 WindowManager 的 addView()、removeView()、updateViewLayout()这三个方法来管理 View 的。
  4. 总结
    Activity 中包含一个 PhoneWindow(继承 Window),Activity 通过 setContentView 将 View 设置到了 PhoneWindow 上,PhoneWindow 通过 WM 来管理 View。

TODO:详解

5、Activity 之间的通讯方式

  1. Intent
  2. 类静态变量
  3. Application 中设置全局变量
  4. SharedPreference、SQLite、文件
  5. 接口回调
  6. EventBus、RxBus等

6、描述一下 Activity 栈

简单来说就是用来存放 Activity,遵循先先进后出原则。

TODO:待完善

7、横竖屏切换时候 Activity 的生命周期

与 android:configChanges 设置有关

  1. 不设置 android:configChanges :销毁当前 Activity ,重新调用生命周期,切横屏一次,切竖屏两次。
  2. 设置 android:configChanges=“orientation”
  3. 在Android5.1 即 API 23级以下:切屏会重新调用生命周期,切横、竖屏都一次。
  4. 在Android9 即 API 28级以下:不会调用各个生命周期,只会执行 onConfigurationChanged()。
  5. 设置 android:configChanges=“orientation|keyboardHidden|screenSize”:不会重新调用生命周期,调用 onConfigurationChanged()。
  6. 解决
    1. 强制横屏:android:screenOrientation=“landscape”
    2. 强制竖屏:android:screenOrientation=“portrait”

8、Activity 与 Fragment 之间的生命周期

在这里插入图片描述

9、Activity 上有 Dialog 时候按 Home 键时生命周期

有 Dialog 和没有 Dialog 按 HOME 键效果一样

  1. 正常启动:onCreate、onStart、onResume
  2. 按HOME键:onPause、onStop
  3. 再次启动: onRestart、onStart、onResume

10、当 Activity 设置为透明主题时,按 Home 键,Dialog 闪烁如何解决

  1. 原因
    因为 Activity 设置成透明主题,没有正常的退出动画,而 Dialog 主要退出动画,造成闪烁。
  2. 解决
    提升 Dialog 的窗口层级,设置为系统级别的悬浮窗。
mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

11、两个 Activity 跳转必然会执行那几个方法

ActivityA、B

  1. A:onPause
  2. B:onCreate、onStart、onResume (假如 B 已存在栈中,B 不调 onCreate 调用,调 onRestart)
  3. A:onStop(假如 B 为透明窗口或对话框,A 不调 onStop)

12、如何启动其他应用的 Activity

  1. 通过隐式 intent 调用方法实现
//1.被调用activity添加
<intent-filter>
	<action android:name="com.example.project.SHOW_ACTIVITY" />
	<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
//2.启动
Intent intent = new Intent();
intent.setAction("com.example.project.SHOW_ACTIVITY");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);推荐使用
  1. 使用 ComponentName
Intent intent = new Intent();
intent.setComponent(new ComponentName("要调用应用包名","要调用Activity全路径"))startActivity(intent)

13、Activity 状态保存和恢复

  1. onSaveInstanceState

    1. 当 Activity 被异常杀死(系统配置发生改变、系统内存不足等),调用 onSaveInstanceState 保存状态。
    2. 调用在 onStop 之前,与 onPause 顺序不定。
  2. onRestoreInstanceState
    发生1.情况时候,重新创建 Activity 调用 onRestoreInstanceState 来恢复数据

  3. onCreate()里也有 Bundle 参数,可以用来恢复数据,它和 onRestoreInstanceState 有什么区别

    1. 因为 onSaveInstanceState 不一定会被调用,所以 onCreate()里的 Bundle 参数可能为空,如果使用 onCreate()来恢复数据,一定要做非空判断。
    2. onRestoreInstanceState 的 Bundle 参数一定不会是空值。

参考阅读:

onSaveInstanceState()和onRestoreInstanceState()使用详解

14、Activity 和 Service 如何绑定

使用 bindService()来与一个服务进行绑定,一个绑定的服务提供了一个客户端-服务器端接口来允许组件与服务进行交互,发送请求,得到结果甚至通过IPC进程间通信来完成操作。只有当其它组件与服务进行绑定时,服务才会处于绑定状态。多个组件可以同时与服务绑定,但是当他们全部都解除绑定时,服务就会销毁。

15、下拉状态栏是不是影响 Activity 的生命周期

通过实践发现 Android 下拉通知栏不会影响 Activity 的生命周期方法

16、Activity 常用的标记位 Flags

  1. FLAG_ACTIVITY_NEW_TASK :对应 singleTask 启动模式,其效果和在 XM L中指定该启动模式相同;
  2. FLAG_ACTIVITY_SINGLE_TOP : 对应 singleTop 启动模式,其效果和在 XML 中指定该启动模式相同;
  3. FLAG_ACTIVITY_CLEAR_TOP : 具有此标记位的 Activity,当它启动时,在同一个任务栈中所有位于它上面的 Activity 都要出栈。这个标记位一般会和 singleTask 模式一起出现,在这种情况下,被启动 Activity的实例如果已经存在,那么系统就会回调 onNewIntent。如果被启动的 Activity 采用 standard 模式启动,那么它以及连同它之上的 Activity 都要出栈,系统会创建新的 Activity 实例并放入栈中;
  4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : 具有这个标记的 Activity 不会出现在历史 Activity 列表中;

17、如何将一个 Activity 设置成窗口的样式

//1.设置窗口样式
android:theme="@android:style/Theme.Dialog"
//2.设置透明
android:theme="@android:style/Theme.Translucent"    

18、Activity 的 startActivity 和 Context 的 startActivity 区别

  1. 从 Activity 中启动新的 Activity 时可以直接 mContext.startActivity(intent)就好。
  2. context 中 startActivity,intent 必须设置 Flag,否则会出错。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ; 
mContext.startActivity(intent);

19、Android 怎么加速启动 Activity

  1. onCreate 不要启动耗时操作
  2. 将 View 细分,使用 AsyncTask 或者 Handler 逐步加载
  3. 分页加载界面
  4. 优化布局文件
  5. 提高 Adapter 和 AdapterView 的效率
  6. 利用多线程技术,先让用户看到界面,再异步填充数据

20、Activty 和 Fragment 之间怎么通信,Fragment 和 Fragment 怎么通信

  1. Handler
  2. 广播
  3. 接口回调
  4. 事件总线
  5. Bundle 和 setArguments(bundle)
  6. 全局变量/Application

21、ActivityA 跳转 ActivityB 然后 B 按 back 返回 A,各自的生命周期顺序,A 与 B均不透明

1. A -> B
A:onPause
B:onCreate
B:onStart
B:onResume
A:onStop

2. B -> A
B:onPause
A:onRestart
A:onStart
A:onResume
B:onStop
B:onDestroy

22、更新 UI 方式

  1. Activity.runOnUiThread(Runnable)
  2. Handler
  3. AsyncTask
  4. Rxjava
  5. View.post(Runnable),View.postDelay(Runnable, long)
  6. LiveData

23、直接在 Activity 中创建一个 Thread 跟在 Service 中创建一个 Thread 之间的区别

  1. 在 Activity 创建
    该 Thread 的就是为这个 Activity 服务的,完成这个特定的 Activity 交代的任务,主动通知该 Activity 一些消息和事件,Activity 销毁后,该 Thread 也没有存活的意义了,如果使用不当,Activity 销毁, Thread 还在运行,可能造成内存泄露。
  2. 在 Service 创建
    用户执行后台任务,只要 Service 不退出,Thread 可以一直执行。适合执行独立于 APP 任务,例如,在Service 保持长连接。

24、Activity 异常情况下的生命周期

  1. 资源相关的系统配置发生改变导致 Activit 被杀死并重新创建,例如横竖屏切换。
    1. onPause -> onSaveInstanceState() -> onStop -> onDestroy(onPause -> onSaveInstanceState()(onPause 和 OnSaveInstanceState 顺序不一定)
    2. 重建之后,onCreate -> onStart -> onRestoreInstanceState -> onResume
  2. 资源内存不足导致低优先级的 Activity 被杀死
    ​ 同上
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!