Android开发艺术探索第一章笔记

Android开发艺术探索第一章笔记

1.1 Activity的生命周期

1.1.1 Activity的调用流程

对于一个ActivityA调用到ActivityB的正常流程,ActivityB的onResume会等待ActivityA的oPause执行后才会继续。这也意味着,尽量把操作放到onStop而不是onPause中执行

1.1.2 Activity的数据存储与恢复

对于Activity异常终止的情况,会调用onSaveInstanceState与onRestoreInstanceState方法。其中onSaveInstanceState方法会在onStop之前调用,可能在onPause之前,也可能在onPause之后。而onRestoreInstanceState则是在onStart之后调用

正常情况下,是不会调用这两个方法的。而异常情况也包括系统配置发生改变的时候(如旋转屏幕的时候)。

若想要在系统配置未改变的情况下不重启Activity,则需要在AndroidMenifest中为Activity加android:configChanges的属性,如

android:configChanges="orientation|keyboardHidden"

该选项会导致发生屏幕旋转或者键盘的可访问性发生了改变(如用户调出了键盘)时,系统不重启Activity,而是去调用Activity里的onConfigurationChanged方法。

1.2 Activity的启动模式

1.2.1 LaunchMode

有四种launchmode:standard、singleTop、singleTask、singleInstance

若Activity不会被重新创建,则都会调用到onNewIntent之后,再调用onResume

singleTask自带clearTop的效果,singleInstance相当于在singleTask的基础上,新增了该activity只单独存在于一个栈中

TaskAffinity属性,也是在Androidmanifest中的activity声明的,用于标识了一个Activity所需的任务栈的名字,默认情况下为自己的包名

allowTaskReparenting属性,用于表示该activity是否可以变换任务栈,如应用A启动到应用B中的ActivityC,且应用B的ActivityC中声明了allowTaskReparenting为true。启动了ActivityC后,此时它们会在同一个任务栈中。此时按Home键回到首页之后,再进入应用B,此时应该会有一个新的任务栈,C从应用A的栈中移到了应用B的栈中

有两种方式声明launchMode,分别是在AndroidMenifest中声明(无法设置clearTop),和在intent中addFlags(无法设置成singleInstance),两种同时存在时,intent的方法会优先级高于AndroidMenifest

1.2.2 Activity的Flags

  1. FLAG_ACTIVITY_NEW_TASK对应singleTASK
  2. FLAG_ACTIVITY_SINGLE_TOP对应singleTop
  3. FLAG_ACTIVITY_CLEAR_TOP 注意连同Activity自己也会出栈,并重新创建自己,因此加上singleTop属性就可以不会让自己也出栈
  4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 在xml中也有同样的属性android:excludeFromRecents=”true”,不会出现在历史的Activity列表中(暂时没有碰到过)

1.3 IntentFilter的匹配规则

在隐式调用中设置的过滤信息,Intent调用时,需要同时匹配其中的action、category、data才能够启动该activity

同时一个Activity可以同时有多个IntentFilter,只需要匹配上一个IntentFilter即可

其中action只需要匹配上一种即可,category则是需要Intent中的所有category都在IntentFilter中存在才可以,且startActivity或者startActivityForResult调用时,默认Intent都会有android.intent.category.DEFAULT这个category

而data的匹配方式则与action类似
data由mimeType和URI组成,mimeType是媒体类型,如“video/*”或者”image/jpeg”
而URI结构如下:

content://com.example.project:200/folder/subfolder/etc

SCHEME:URI的模式,如content,默认为content和file,即若Intent没有指定URI,则Intent中的URI部分需要为content或者file才可以匹配

HOST:如com.example.project,主机名

PORT:如200,端口号

PATH、pathPattern、pathPrefix表示路径信息

注意Intent中的setData和setType方法均会导致另一个方法设下去的值为null,所以一般都用setDataAndType来设置

intent.setDataAndType(Uri.parse("file://abs"),"image/png");

最后是隐式调用的tips,为了防止没有对应的activity导致程序崩溃,可以在startActivity之前调用PackageManager的relolveActivity方法或者intent的resolveActivity方法,若不为null,则表示识别到了匹配过滤的优先级最高的Activity

猜你喜欢

转载自blog.csdn.net/wangzici/article/details/78451879