Android 知识点整理01--Activity

1、Activity的生命周期

activity的生命周期方法有:

  • onCreate,表示activity正在被创建,是生命周期的第一个方法,在这个方法中,我们可以做一些初始化操作,比如调用setContentView方法去加载界面布局,或初始化activity的数据等。
  • onStart,表示activity正在被启动,这是activity已经可见了,但是没有出现在前台,还无法与用户进行交互。
  • onResume,表示activity已经可见了,并且出现在前台并开始活动。从别的activity回到当前的activity时,也会调用这个方法。
  • onPause,表示activity暂停活动,正常情况下,紧接着onStop()方法就会被调用,onpause里面可以做一些数据保存工作,但是这些工作不能是耗时的。从activity跳转到其他activity时,当前activity的onPause方法会调用之后,才会调用新的activity的onResume方法。
  • onStop,表示activity即将停止,可以做一些稍微重量级的回收工作,但是也不能是耗时操作。
  • onDestory,表示activity即将被销毁,这是activity最后一个生命周期方法,在这里,我们可以做一些回收工作和最终的资源释放。
  • onRestart,表示activity即将重新开始活动,从别的activity回退到当前的activity时,会先调用onRestart,然后调用onStart,再然后调用onResume,activity恢复活动。
  • onSaveInstanceState,当资源相关的系统配置发生变化,系统想要杀死activity,或者activity异常终止时,系统会在调用onStop之前调用onSaveInstanceState,可以在这个方法中保存数据。
  • onRestoreInstanceState,当activity被系统重新创建时,会被调用,可以在该方法中做数据的恢复工作,值得注意的是,View的某些数据会被系统自动在杀死时保存,在重新创建时恢复,比如EditText中输入的文字,ListView的滚动位置等。
  • onConfigurationChanged ,当activity进行横竖屏切换时,如果activity的configChanges属性被添加了orientation这个值时,activity不会被重新创建,也就不会调用onSaveInstanceState和onSaveInstanceState,而会调用onConfigurationChanged 方法。

1.1、正常情况下的生命周期

  • activity从创建到显示:onCreate => onStart => onResume
  • activity从显示到销毁:onPause => onStop => onDestory
  • 从activityA跳转acitivtyB:A.onPause => B.onCreate => B.onStart => B.onResume => A.onStop
  • 从activityB退回activityA:B.onPause => A.onRestart => A.onStart => A.onResume => B.onStop => B.onDestory
  • app进入后台,如按home键:onPause=>onStop
  • app回到前台:onRestart=>onStart=>onResume
  • activity弹出dialog:dialog属于Activity的一部分,所以activity主界面只是失去焦点,回调onWindowFocusChanged方法
  • activity被通知栏遮挡:和弹出dialog一样,也会失去焦点,回调onWindowFocusChanged,对activity的正常的生命周期没有影响

另:activity在onResume和onPause之后,焦点会发生变化,所以都会回调onWindowFocusChanged。

1.2、异常情况下的生命周期

  • 资源相关的系统配置变化导致的activity重建:
  • 被用户从最近任务列表移除导致的activity被杀死:
  • 系统内存不足导致activity被杀死:
  • 被系统杀死的activity被重新启动:

2、activity的启动模式

在默认的情况下,我们多次启动一个activity,系统会创建多个这个activity的对象,并把这些对象一一放入任务栈中,有时候我们希望不要创建这么多个activity的对象,那么这时候就需要设置activity的启动模式。activity的启动模式有四种:

  • standard:标准模式,也是系统默认的启动模式。每次启动activity都会创建一个这个activity的实例,不管是否存在这个activity的实例。生命周期方法onCreate、onStart、onResume都会被调用。
  • singleTop:栈顶服用模式。在这种模式下,如果要启动的activity已经位于目标任务栈的栈顶,那么activity不会被重新创建,而是会调用activity的onNewIntent方法。
  • singleTask:栈顶复用模式。在这种模式下,只要目标任务栈中已经有一个activity的实例,不管activity的实例位于栈中的那个位置,都不会创建新的实例,而是将实例上面的activity全部出栈,再调用activity的onNewIntent方法。如果目标任务栈在后台,目标任务栈会被切换到前台。
  • singleInstance:单例模式。这种模式的activity只能单独存在于一个任务栈中,如果已经有一个实例,那么被启动时会将所在的任务栈切换到前台,并调用activity的onNewInstance方法。

另外,执行adb shell dumpsys activity 指令可以查看任务栈的信息。

示例:

	<activity 
		 android:name=".Activity01"
		 android:launchMode="singleTask"
		 />

3、activity的常用标记位(flags)

activity的标记为有很多,有些标记为是专门为系统准备的,我们不应该去使用它们。以下是开发中常用的一些标记位。

  • FLAG_ACTIVITY_NEW_TASK:这个标记位的作用是指定activity的启动模式为singleTask,效果和在清单文件配置相同。
  • FLAG_ACTIVITY_SINGLE_TOP:这个标记位的作用是指定activity的启动模式为singleTop,效果与在清单文件中配置相同。
  • FLAG_ACTIVITY_CLEAR_TOP:具有此标记位的activity启动时,同一个栈中在它上面的activity都要出栈,一般和singleTask启动模式一起使用。如果配置FLAG_ACTIVITY_CLEAR_TOP的activity的启动模式位standard,那么它和它之上的所有activity都要出栈,系统会重新创建新的实例放入栈中。singleTask启动模式的activity默认会有这个标记位的效果。
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记位的activity的不会出现在系统的最近任务列表中,相当于在清单文件里制动activity的属性android:excludeFromRecents=“true”。
    示例:
	Intent intent = new Intent(this, Activity01.class);
	//通过设置flag设置创建一个ActivityTask作为activity的目标栈
	intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
	//通过设置flag设置启动模式
	intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
	startActivity(intent);

4、intentFilter的匹配规则

当对Activity、Service、BroadcastReceiver进行隐式调用时,需要指定IntentFilter,这里记录一下IntentFilter的匹配规则。
IntentFilter中的过滤信息有action、category、data,系统预定义了一些action、category、data,同时我们也可以在应用中自己定义。下面对它们的匹配规则做一个介绍。

4.1、action的匹配规则

action是一个字符串,action给的匹配规则是intent中的action必须能够和过滤规则中的action匹配,这里说的匹配是指action的字符串值完全一样。一个过滤规则中可以有一个或多个action,那么只要intent中的action能够和过滤规则中的任何一个action一样即可匹配成功。如果intent中没有指定action,那么匹配失败。
注:action区分大小写。

4.2、category的匹配规则

category也是一个字符串,它的匹配规则要求,如果intent中含有category,那么所有的category必须可以在IntentFilter中找到一样的的category。与action不同的是,intent中可以没有category。如果intent中没有category,系统自动给intent添加(android.intent.category.DEFAULT)这个category。如果IntentFilter里面没有指定其他的category,那么必须指定(android.intent.category.DEFAULT)这个category才能接收隐式调用。

4.3、data的匹配规则

data的匹配规则跟action类似,如果过滤规则中定义了data,那么intent中必须也要设置至少一个data与intentFilter中的data匹配。
data的语法:

<data android:scheme="string"
		android:host="string"
		android:port="string"
		android:path="string"
		android:pathPattern="string"
		android:pathPrefix="string"
		android:mimeType="string" />

data由mimeType和URI两部分组成。mimeType指媒体类型,比如image/jpeg、audio/mpeg4-generic、video/* 等,可以表示图片、文本、视频等不同的媒体格式,而URI中包含的数据就比较多了,下面是URI的结构:

<scheme>://<host>:<post>/<path>|<pathPrefix>|<pathPattern>

其中,

  • scheme,表示URI的模式,一个完整的URI必须包含scheme才能生效。
  • host,URI的主机名,一个完整的URI必须包含host才能生效。
  • port,URI的端口号
  • path、pathPattern、pathPrefix,表示路径信息,其中path表示完整的路劲信息;pathPattern也表示完整的路径信息,区别是在pathPattern中可以包含通配符"*",通配符表示0个或多个任意字符;pathPrefix表示路径的前缀信息。

以下是示例:

content://com.example.projiect:200/folder/subfolder/etc
http://www.baidu.com:80/search/info

值得注意的是,intent的setType方法和setData方法是冲突的,只能设置一个,如果要同时设置,需要使用setDataAndType方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值