Android进阶-Activity

Activity 启动模式

standard(标准模式) 系统不会在乎这个活动是否已经在返回栈中存在,而是每次启动活动都会创建该活动的一个新的实例。

singleTop (栈顶复用) 在启动活动时,如果发现该返回栈的栈顶已经是该活动时,则认为可以直接使用它,不会在创建新的活动实例

singleTask (栈内单例) 每次启动该活动时,首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在就直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

singleInstance (堆内单例) 会启用一个新的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,解决了共享活动实例的问题。

在 singleTop、singleTask、singleInstance 中如果在应用内存在Activity 实例,并且再次发生 startActivity(Intent intent)回到 Activity后,由于并不是重新创建 Activity 而是复用栈中的实例,因此 Activity再 获 取 焦 点 后 并 没 调 用 onCreate 、 onStart , 而是直接调用了onNewIntent(Intent intent)函数;

taskAffinity属性
taskAffinity 是 Activity 在 mainfest 中配置的一个属性,暂时可以理解为:taskAffinity为宿主 Activity指定了存放的任务栈 不同于 App中其他的 Activity的栈 为 activity 设置 taskAffinity 属性时不能和包名相同,因为 Android 团队为 taskAffinity 默认设置为包名任务栈。

taskAffinity 只有和 SingleTask 启动模式匹配使用时,启动的 Activity 才会运行在名字和 taskAffinity 相同的任务栈中

Intent 中标志位设置启动模式

在上文中的四种模式都是在 mainfest 的 xml 文件中进行配置的,GoogleAndroid 团队同时提供另种级别更高的设置方式,即通过
Intent.setFlags(int flags)设置启动模式;

  1. FLAG_ACTIVITY_CLEAR_TOP : 等 同 于 mainfest 中 配 置 的singleTask,没啥好讲的;
  2. FLAG_ACTIVITY_SINGLE_TOP: 同 样 等 同 于 mainfest 中 配 置 的singleTop;
  3. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 其 对 应 在AndroidManifest 中的属性为 android:excludeFromRecents=“true”,
    当用户按了“最近任务列表”时候,该 Task 不会出现在最近任务列表中,可达到隐藏应用的目的。
  4. FLAG_ACTIVITY_NO_HISTORY: 对应在 AndroidManifest 中的属性为:android:noHistory=“true”,这个 FLAG 启动的 Activity,一旦退出,它不会存在于栈中。
  5. FLAG_ACTIVITY_NEW_TASK: 这个属性需要在被 start 的目标 Activity 在AndroidManifest.xml 文件配置 taskAffinity 的值【必须和 startActivity发起者 Activity 的包名不一样,如果是跳转另一个 App 的话可以taskAffinity 可以省略】,则会在新标记的 Affinity 所存在的 taskAffinity中压入这个 Activity
LauchModeInstance
standard邮件、mainfest中没有配置就默认标准模式
singleTop登录页面、WXPayEntryActivity、WXEntryActivity、推送通知栏
singleTask程序模块逻辑入口主页面(Fragment的containerActivity)、WebView页面、扫一扫页面、电商中;购物界面,确认
Singlfask
订单界面,付款界面
singlenstance系统Launcher、锁屏键、来电显示等系统应用

Intent 的基本应用

Intent 属性

1.Intent 属性

Intent 的属性有:component(组件)、action、category、data、extras、flags;所有的属性也是各显神通,满足开发者的各种需要满足不同场景;category是系统的配置,action中的name是自己随便定义的,定义好以后name的值就是activity的动作,隐式启动activity时,意图中的配置必须和这里的action的name是一致的。data是跳转的过程中携带的参数,mimeType是携带的数据的类型,

component: 显然就是设置四大组件的,将直接使用它指定的组件,借助这一属性可以实现不同应用组件之间通讯;

action: 是一个可以指定目标组件行为的字符串,开发人员可以自定义 action通过匹配 action 实现组件之间的隐士跳转,当然 Android 系统也已经预定部分String 作为系统应用 Action,例如打开系统设置页面等等;

data: 通常是 URI 类型或者 MIME 类型格式定义的操作数据;表示与动作要操纵的数据

Category: 属性用于指定当前动作(Action)被执行的环境;
extras 和 flags 这两个太熟悉了就不在重复;

Intent 与 IntentFilter 匹配规则

Intent 与 IntentFilter 匹配规则

横竖屏切换等引起的 Activity 生命周期的变化

这里的系统配置改变是指由于横竖屏切换等引起的 Activity 生命周期的变化,进
而引发的资源的变化。在 Android 中系统配置改变是会引起 Activity 销毁重建
的,例如横竖屏切换,只是切换时间差太小,用户眼睛不能察觉而已。activity
重建的时候就在之前 Activity 销毁前,系统会先调用
onSaveInstanceState(Bundle outState)存储当时各种状态,在新建 Activity
中 Android 会通过 onRestoreInstanceState(Bundle savedInstanceState)
取数据并自动恢复到之前 Activity 的 View。

触发onSaveInstanceState(Bundle outState)的条件

  • Activity 被销毁的时候调用, 也可能没有销毁就调用了;

  • 按下Home键 : Activity 进入了后台, 此时会调用该方法;

  • 按下电源键 : 屏幕关闭, Activity 进入后台;

  • 启动其它 Activity : Activity 被压入了任务栈的栈底;

  • 横竖屏切换 : 会销毁当前 Activity 并重新创建;

onSaveInstanceState方法调用注意事项

  • 用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法;
  • 调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用;
  • 布局中组件状态存储 : 每个组件都 实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意,只有有 id 的组件才会保存;
  • 关于默认的 super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的;

onRestoreInstanceState(Bundle outState)

  • 方法回调时机 : 在 Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用,
    如果内存充足, 系统没有销毁这个 Activity, 就不需要调用;
  • Bundle 对象传递 : 该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate()方法中;

横竖屏切换时Activity的生命周期变化?

1.如果自己没有配置android:ConfigChanges,这时默认让系统处理,就会重建Activity,此时Activity的生命周期会走一遍。

2.如果设置android:configChanges=“orientation|keyboardHidden|screenSize”>,此时Activity的生命周期不会重走一遍,Activity不会重建,只会回调onConfigurationChanged方法。

configChanges属性总结:

mcc移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
mnc移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
locale所在地区发生变化。
touchscreen触摸屏已经改变。(这不应该常发生。)
keyboard键盘模式发生变化,例如:用户接入外部键盘输入。
keyboardHidden用户打开手机硬件键盘
navigation导航型发生了变化。(这不应该常发生。)
orientation设备旋转,横向显示和竖向显示模式切换。
fontScale全局字体大小缩放发生改变
onConfigurationChanged方法

在 Activity、View(ViewGroup)、Fragment、Service、Content Provider
等等在设备的配置发生变化的时候,会回调 onConfigurationChanged 的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值