Android开发艺术探索之Activity篇总结

本文内容来自《Android开发艺术探索》第一章,个人学习提炼总结,欢迎指正。

 

1.1典型情况下的生命周期

  • onCreate():表示Activity正在被创建,初始化布局资源+Activity所需要数据等。
  • onStart():表示Activity正在启动,Activity已经可见,但是未出现在前台(正在显示),不可与用户交互。
  • onResume():表示Activity获得焦点,已经可见,并在前台开始活动。

手动分割线

  • onPause():表示Activity正在停止,正常情况下调用onStop,若快速返回到当前Activity,则先执行完onPause,再调用onResume。
  • onStop():表示Activity即将停止,可做稍微重量级回收工作,如取消网络连接、注销广播接收器。
  • onDestory():表示Activity即将销毁,回收工作+资源释放。
  • onRestart():表示Activity正在重启,此时Activity从后台到前台,由不可见到可见。

 

onStart()和onResume()、onPause()和onStop()的区别: 

  • onStart与onStop是从Activity是否可见这个角度调用的。
  • onResume和onPause是从Activity是否显示在前台这个角度来回调的。
  • 在实际使用没其他明显区别。

 

生命周期的切换过程:

用-连接的表示在用一个Activity中进行。

(1)启动新Activity:onCreate-onStart-onResume。

(2)打开新Activity/切换到桌面:旧onPause,新onCreate-onStart-onResume,旧onStop。

  • (↑若新Activity采用透明主题,那么当前Activity不会回调onStop)
  • (↑android:theme=”@android:style/Theme.Translucent”)

(3)回到原来Activity:当前Activity的onPause,原Activity的onRestart-onStart-onResume,当前Activity的onStop-onDestory。

(4)用户按下back键回退:onPause-onStop-onDestory。

(5)Activity1上弹出对话框Activity2:1的onPause,2的onCreate-onStart-onResume。【与(2)对应比较】

(6)关闭对话框Activity2,显示Activity1:2的onPause(),1的onResume(),2的onStop()-onDestroy()。【与(3)对应比较】

 

异常情况下生命周期分析

(1)系统资源配置发生改变导致Activity被杀死并重新创建

  • 系统会调用onSaveInstanceState保存数据,调用onPause,onStop,onDestory销毁Activity,onSaveInstanceState会在onStop前调用,不一定在onPause的前面或后面调用。
  • 创建新Activity后用onRestoreInstanceState恢复数据,onRestoreInstanceState中的onCreate的参数是onSaveInstanceState方法保存的Bundle对象。
  • (可真长呢这句话...简单点说新Activity的参数是旧Activity传递来的对象)

(2)资源内存不足导致低优先级的Activity被杀死

  • 一个进程如果没有四大组件在执行很快会被系统杀死,因此后台工作不适宜脱离四大组件独自运行在后台中,解决方法:将后台工作放入Service中从而保证进程有一定优先级,不会被轻易杀死。
  • (果然四大组件才是老大,那会被艰难的杀死吗???)

 

 

1.2Activity的启动模式

1.2.1设置Activity启动模式的方法

(1)在AndroidManifest.xml中给对应的Activity设定属性

        ndroid:launchMode="standard|singleInstance|single Task|singleTop"。

(2)通过标记位设定,方法是intent.addFlags(Intent.xxx)。

 

1.2.2Activity的四种LaunchMode

(1)standard:标准模式、默认模式

  • 每次启动一个Activity就会创建一个新的实例。
  • 注意:使用ApplicationContext去启动standard模式Activity就会报错。因为standard模式的Activity会默认进入启动它所属的任务栈,但是由于非Activity的Context没有所谓的任务栈。

(2)singleTop:栈顶复用模式

  • 如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调onNewIntent(intent)方法。

(3)singleTask:栈内复用模式

  • 只要该Activity在一个任务栈中存在,都不会重新创建,并回调onNewIntent(intent)方法。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,并把该Activity放进去;如果存在,就会创建到已经存在的栈中。

(4)singleInstance:单实例模式

  • 具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例。

 

标识Activity任务栈名称的属性:android:taskAffinity,默认为应用包名。

 

1.2.3常用的可设定Activity启动模式的标记位

FLAG_ACTIVITY_SINGLE_TOP:对应singleTop启动模式。
FLAG_ACTIVITY_NEW_TASK :对应singleTask模式。

 

 

1.3IntentFilter匹配规则

1.3.1匹配原则

(1)一个intent只有同时匹配某个Activity的intent-filter中的action、category、data才算完全匹配,才能启动该Activity。
(2)一个Activity可以有多个 intent-filter,一个 intent只要成功匹配任意一组 intent-filter,就可以启动该Activity。

1.3.2匹配规则

(1)action匹配规则:

  • 要求intent中的action 存在且必须和intent-filter中的其中一个 action相同。
  • 区分大小写。

(2)category匹配规则:

  • intent中的category可以不存在,这是因为此时系统给该Activity 默认加上了< category android:name="android.intent.category.DEAFAULT" />属性值。
  • 除上述情况外,有其他category,则要求intent中的category和intent-filter中的所有category 相同。

(3)data匹配规则:

  • 如果intent-filter中有定义data,那么Intent中也必须也要定义date。
  • data主要由mimeType(媒体类型)和URI组成。在匹配时通过intent.setDataAndType(Uri data, String type)方法对date进行设置。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值