Android开发-Activity(二)

Intent


Android中组件间都是通过Intent进行交流的,这也使得组件间的耦合度大大减低。Intent分为两种:显式Intent和隐式Intent,Intent类定义了八个重要的成员变量:

private String mAction;
private Uri mData;
private String mType;
private String mPackage;
private ComponentName mComponent;
private int mFlags;
private HashSet<String> mCategories;
private Bundle mExtras;

其中mComponent是用于显式Intent的,它有两个重要的成员变量:

private final String mPackage;
private final String mClass;//注意这个是类全限定名,不是类名!

而mAction、mData和mCategories则是用于隐式Intent,注意它们的匹配优先级:Action>Data>Category
Action:唯一的字符串,表示要执行的动作。
Data:要执行的动作需要的数据。它的类型是Uri,Uri的格式是这样的,scheme://host:port/path,而host:port合在一起叫authority。Uri是一个抽象类,它几个常见的实现类有StringUri、OpaqueUri和HierarchicalUri。
Category:执行动作的“上下文”。

其实这些匹配规则都是人为定的,没必要要很具体的说哪个有什么作用。只要记住常见的就行。

常见的Action:

ACTION_MAIN:表示程序启动的第一个Activity,注意如果有一个以上的Activity带有该Action(不含CATEGORY_LAUNCHER),则启动配置清单第一个含有该Action的Activity。注意如果一个意图过滤器既有ACTION_MAIN又有CATEGORY_LAUNCHER,那么桌面上会有该Activity的图标,点击是进入该Activity,而不是刚才说的第一个含有ACTION_MAIN的Activity。
ACTION_CALL:直接执行打电话操作,注意要设置Data(要打的电话号码)的值。
ACTION_DIAL:调用拨号界面,可以设置也可以不设置Data的值,注意与ACTION_CALL的区别。
ACTION_SEND:发邮件。
ACTION_VIEW:查看操作,如查看网页,查看地图等。

常见Category:

CATEGORY_LAUNCHER:将该Activity的图标显示在Launcher上。注意要有ACTION_MAIN才会起作用。
CATEGORY_HOME:指定为Home程序,不过使用貌似有点问题(或许是第三方ROM的问题)。
CATEGORY_DEFAULT:每个隐式意图都会带有该category,所以如果你的Activity想要可以被category匹配到,至少需要在意图过滤器加上CATEGORY_DEFAULT。

Activity的生命周期


可以说Activity的生命周期是学习Activity最重要的部分。最直接也是最有效的方法就是理解Google安卓官网给出的Activtiy生命周期图:

这里写图片描述

说明:
1.当Activity处于onPause时如果内存极度紧张系统可以销毁该Activity,处于onStop时如果其它地方需要内存但内存不足时可以销毁该Activity,处于onDestroy系统也可以销毁该Activity。其它阶段系统都不会主动销毁该Activity。
2.onPause为可见不可及阶段,该阶段该Activity有关联着WindowManager。onStop为不可见阶段,该阶段该Activity并没有关联WindowManager。
3.对于从Activity A跳转到Activity B,调用的生命周期函数顺序为:
onPause(A) –> onCreate(B) –> onStart(B) –>onResume(B) 如果此时A不可见,此时还会调用onStop(A)。
4.在系统任务列表清理杀死当前进程时,会调用该进程所有仍存在的Activity的onDestroy方法。

Google安卓官网上解释onSaveInstanceState图:

这里写图片描述

说明:
1.好的应用程序都应该考虑到使用onSaveInstanceState方法来保存当前Activity的相关信息,以便在该Activity被回收然后重新创建时恢复到原来的状态。
2.某一Activity在前台时主动调用finish方法时,并不会执行onSaveInstanceState方法。
3.当系统杀死某一Activity所在进程时,并不会执行onSaveInstanceState方法。
4.清单文件的Activity节点有个configChanges属性,如果设置该属性值为”orientation|screeSize”的话,则在切换横竖屏时系统不会销毁当前Activity然后创建新的Activity,而是只调用onConfigurationChanged。而假如没有设置这个属性或者设置的属性值包含”orientation|screeSize”的话,那么横竖屏切换时就会销毁并创建新的Activity,此时会调用Activity的一系列生命周期回调函数(从onPause开始),包括onSaveInstanceState方法和onRestoreInstanceState方法。

Activity其它一些回调函数说明:


1.onSaveInstanceState(Bundle outState):在某个Activity可能会被系统销毁(包括被系统销毁)时会回调该方法。注意在onSaveInstanceState保存的是临时性数据,而onPause保存的是永久化数据。Activity的onSaveInstanceState默认实现会保存那些有id属性的控件状态。
2.onRestoreInstanceState(Bundle savedInstanceState):Activity被系统销毁后再次启动时。
3.onConfigurationChanged(Configuration newConfig):当配置清单为Activity配置属性configChanges为某一配置时且该Activity在运行时该配置发生改变。否则系统会重启Activity。
4.onUserLeaveHint():当用户自己主动选择将当前Activity移到后台时调用,注意它在onPause方法前调用。
5.onLowMemory():系统内存不足时调用。一般是在所有后台进程都被系统杀死时调用。

转载请注明原文地址:http://blog.csdn.net/u012619640/article/details/48449213

本博客已停止更新,转移到微信公众号上写文章,欢迎关注:Android进阶驿站
Android进阶驿站

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章