-
生命周期
-
基本生命周期
-
(1)onCreate: 当页面第一次启动时调用, 只调用一次, 一般进行UI的初始化工作
-
(2)onStart: 页面正在启动, 但是位于后台, 不可见
-
(3)onResume: 页面启动了, 位于前台. 用户可见
-
(4)onPause: 页面正在退出, 仍然位于前台, 用户可见但是不可操作
-
(5)onStop: 页面退出了, 位于后台, 用户不可见
-
(6)onDestroy: 页面销毁, 回收Activity实例对象
-
(7)onRestart: 页面因为回到主页面退出到后台再重新返回时执行
-
-
执行顺序
-
页面启动过程
- onCreate -> onStart -> onResume
-
点击Home键/点击跳转到其他页面
- onPause -> onStop
-
系统内存不足/手动关闭页面/点击返回按钮(调用父类的onBacKPressed方法)
- (onPause -> onStop ->) onDestroy
-
点击Home键/点击跳转到其他页面退出后台之后页面重新返回
- onRestart -> onStart -> onResume
-
横竖屏切换的生命周期
-
不配置configChanges=“orientation|screenSize”, 执行横竖屏操作页面会销毁重建
- onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume
-
配置configChanges=“orientation|screenSize”: 执行横竖屏操作页面不会销毁重建
- 不会执行基本生命周期的方法
-
-
页面跳转后的生命周期
-
页面1启动
- onCreate(页面1) -> onStart(页面1) -> onResume(页面1)
-
页面1跳转到页面2
- onPause(页面1) -> onCreate(页面2) -> onStart(页面2) -> onResume(页面2) -> onStop(页面1)
-
不要在onPause中执行耗时操作(比如读取数据库等), 因为会阻塞下一个页面的启动, 一般只进行资源的释放.注意: 整个生命周期的方法都运行在UI主线程, 都不要进行耗时操作, 否则产生ANR.
-
-
页面返回后的生命周期
-
不重写onBackPressed方法: 当前页面销毁
- onBackPressed -> onPause -> onStop -> onDestroy
-
重写onBackPressed方法, 不调用父类的该方法: 当前页面是否销毁由自定义逻辑决定
- onBackPressed -> 自定义重写的逻辑
-
-
-
-
Activity的通信:
-
通过Intent对象封装动作行为(目标组件), 以及要传递的数据, 来实现页面之间的跳转通信.
-
一对一通信
-
发送
-
(1)创建Intent对象: Intent intent = new Intent();
-
(2)指定动作行为:
-
显式(3种)
-
指定目标组件名称: intent.setComponent(new ComponentName(“目标组件所在应用包名”, “目标组件的全限定名”));
-
指定目标组件的class类名: intent.setClass(this, 目标组件类名.class);
-
构造Intent:Intent intent = new Intent(当前组件类名.class,目标组件类名.class)
-
-
隐示实现方式
-
自定义action:
-
intent.setAction(“自定义action”);
-
目标组件配置action标签在AndroidManifest.xml中来响应动作.
- 调用setAction方法时如果没有指定category类型, 会自动调用addCategory方法加入一个默认的类别, 所以在AndroidManifest.xml的目标组件的中要配置类别标签, 对应默认类别
-
-
-
(3)绑定要传输的数据(2种)
-
直接调用intent.putExtra(k,v)方法传递kv键值对, key的类型可以是基本数据类型,数组以及可序列化对象.
-
使用Bundle保存数据并传给Intent:bundle.putCharSequence((k,v));intent.putExtra(bundle)
-
-
(4)正式启动跳转页面::startActivity(intent);
-
-
Bundle
- 保存要携带的数据包
-
响应
-
(1)接收Intent请求对象:Intent intent = getIntent();
-
(2)解析Intent传输的数据
-
变量名 = getXXXExtra(key); // 部分数据类型还需要提供默认值
-
使用Bundle获取并保存数据bundle = intent.getExtras();bundle.getString()
-
-
(3)根据解析的数据进行一些逻辑处理
-
-
-
一对多的通信
-
通过指定action的形式来指定跳转的动作行为, 即通过隐式跳转来实现
-
(1)发起跳转者:
Intent intent = new Intent();
intent.setAction(“自定义action”); // 自定义action规范命名: android.intent.action.XXXX
startActivity(intent); -
(2)多个组件响应Intent请求:
- 在AndroidManifest.xml中为需要被启动的每个组件的配置标签, 并且采用自定义的action, 要完全匹配.
-
-
-
多对一的通信
-
(1)正常情况下多个页面和一个页面进行通信为什么失败
-
正常情况我们使用getIntent方法进行Intent请求的获取, 但是只有在页面的第一次启动执行onCreate方法时会执行
-
一次setIntent方法来进行页面Intent请求的存储更新, 后续在任何其他基本生命周期中调用setIntent方法都无法更新
-
Intent请求, 导致页面中缓存的Intent对象仍然是第一次传进来的, 所以多对一的通信失败.
-
-
(2)如何实现多对一的通信, 让setIntent方法更新生效
- 重写onNewIntent方法, 然后调用setIntent方法传入新的Intent对象来实现多对一的通信, 也就是说只有onNewIntent方法可以成功更新Activity中的Intent缓存对象.
-
-
-
-
Activity的启动模式
-
任务栈
- Android系统管理Activity时采用任务栈, 每一个Activity相当于一个任务放到任务栈中.
-
启动模式
-
(1)standard:默认模式
- 每一次启动Activity都会创建一个新的Activity实例,置于任务栈栈顶; 默认模式下的所有Activity都在同一个任务栈中.
-
(2)singleTop: 栈顶唯一模式
- 当启动Activity时, 如果该活动已经位于栈顶, 则不实例化新的Activity; 如果该活动不位于栈顶,则实例化新的Activity并置于栈顶. 当前模式下的所有Activity也都在同一个任务栈中, 同默认模式.
-
(3)singleTask: 任务唯一模式
- 当启动Activity时, 如果任务栈中存在该任务, 则不会创建新的实例; 如果新活动不位于栈顶, 复用时会把该活动在任务栈前面的Activity全部弹出任务栈. 当前模式下的所有Activity也都在同一个任务栈中, 同以上两种方式.
-
(4)singleInstance: 实例唯一模式
- 每一个新的Activity都独立位于一个任务栈, 当重复启动同一个Activity时,就是重启原来的任务栈中的活动, 不会创建新的实例. 当前模式会为新的页面创建新的任务栈
-
-
-
Activity的常用方法
-
\1. getIntent:
-
作用
- 获取跳转传递的Intent请求信息
-
应用
- 页面之间进行通信时, 接收Intent请求进行响应
-
-
\2. onNewIntent:
-
作用
- 更新Activity的Intent缓存对象, 从而实现多对一的通信. 前提是被多次启动的Activity不会创建新的实例对象.
-
应用
- 页面多对一的通信, 保证一个页面与多个页面进行通信时, 可以得到正确的Intent对象, 进行正确的数据解析
-
执行顺序
- onNewIntent -> onReStart -> onStart-> onResume
-
-
\3. onBackPressed:
-
作用
-
当点击页面的返回键时, 执行该方法, 默认情况下, 调用父类的该方法, 返回上一级页面或Home, 然后调用finish方法对当前页面进行销毁.
-
返回上一级含义
- 当前页面所在的任务栈中如果存在其他页面, 就返回当前任务栈栈顶的另一个页面; 如果当前页面所在的任务栈中没有任何页面时, 就返回上一次显示的任务栈中的页面.
-
举例:页面1设置为默认模式, 页面2设置为singleInstance模式, 页面3设置为默认模式.
- A. 页面1启动页面2, 页面2启动页面3: 此时系统存在两个任务栈, 三个Activity实例, 默认模式的任务栈在前.结果:在页面3点击返回键: 回到页面1.
-
应用
-
重写该方法, 不使用父类的该方法
-
退出Fragment而不是退出Activity: Activity上使用Fragment时, 如果不重写该方法, 点击返回键直接退出了activity, 而我们实际上要退出Fragment, 此时需要重写该方法, 不使用父类的该方法.
-
传递返回值: 当页面返回到上一级时, 我们如果需要得到相应的数据, 我们可以重写该方法, 然后利用setResult方法实现
-
-
-
-
-
\4. startActivityForResult, onActivityResult, setResult
-
(1)发起跳转告知要求返回值:
-
startActivityForResult(Intent intent, int requestCode);
-
第一个参数: 发起跳转的Intent请求
-
第二个参数: 标识发起跳转想要返回结果的页面
-
-
-
(2)返回页面设置返回结果:
-
setResult(int resultCode, Intent data);
-
第一个参数: RESULT_OK和RESULT_CANCELLED
-
第二个参数: 要返回给跳转界面的Intent数据信息
-
-
-
(3)发起跳转的页面接收返回结果:
- onActivityResult(int requestCode, int resultCode, Intent data);
- onActivityResult -> onRestart -> onStart -> onResume
- onActivityResult(int requestCode, int resultCode, Intent data);
-
-
\5. finish:
-
作用
- 返回上一级页面, 并将当前页面从当前任务栈中销毁踢出, finish方法最终会调用onDestroy来进行销毁, 但是调用onDestroy的时机不固定, 不是立刻执行.
-
应用
-
传递返回结果值时, 利用该方法和setResult来实现
-
当页面不需要再次返回时, 可以在跳转到下个页面时直接使用finish方法, 回收该页面
-
-
-
-
Fragment(碎片)
-
生命周期
-
Fragment生命周期直接收其宿主Activity的影响。但Activity在运行中可以对Fragment进行增删
-
onAttach:碎片与活动建立关联
-
onCreate
-
onCreateView:创建碎片视图
-
onActivityCreated:与碎片相关联的活动调用完毕
-
onStart
-
onResume
-
onPause
-
onStop
-
onDestroyView:与碎片相关联视图被移除
-
onDestroy
-
onDetach:碎片与活动解除关联
-
-
执行顺序
-
启动
- onAttach ->onCreate->onCreateView->onActivityCreated->onStart->onResume
-
替换
-
replace方法
-
addToBackStack
- onPause->onStop->onDestroyView
-
没有addToBackStack
- onPause->onStop->onDestroyView->onDestroy->onDetach
-
-
add
- 无
-
-
back
-
addToBackStack
-
按第一次
- onCreate->onCreateView->onActivityCreated->onStart->onResume
-
按第二次
- onPause->onStop->onDestroyView->onDestroy->onDetach
-
-
没有addToBackStack
- onPause->onStop->onDestroyView->onDestroy->onDetach
-
-
-
四种状态
-
运行
-
暂停
-
停止
-
销毁
-
-
-
创建Fragment
- 创建Fragment子类继承Fragment重写onCreateView方法
-
在Activity添加Fragment
-
xml中添加
-
(name属性添加指定fragment):
-
android:name = “全路径类名”,
-
android:id
-
-
-
在Activity运行时添加Fragment
-
方法
-
实例化Fragment子类
-
new MyFragment()
- 销毁后,容易爆空指针
-
MyFragment.newInstance()
- 使用静态工厂方法,将外部传入的参数可以通过Fragment.setArgument保存在它自己身上
-
-
创建Fragment的管理对象fragmentManager。
- getSupportFragmentManager
-
获得FragmentTransaction实例
- fragmentManager.beginTransaction
-
动态创建Fragment
-
两种方式
-
beginTransaction.replace();
- 这种方法每次切换fragment时都会重新初始化
-
beginTransaction.add();
- 隐藏,不销毁
-
-
beginTransaction.addToBackStack(null);
- 加入栈中,退回返回上一个Fragment
-
-
提交
- beginTransaction.commit();
-
-
-
-
Activity
最新推荐文章于 2024-11-12 17:21:52 发布