Activity

今天开始写随笔。

今天回忆一下有关Activity的知识。

Activity的正常生命周期:

顺序:onCreate  - onStart - onResume- onPause - onStop - onDestory

在这几个过程中onStart onResume onPause是可见的,这之中的onPause又比较的特殊当出现其他透明的Activity或Dialog在本Activity之上时本Activity就会失去焦点但是可见。

onPause从新变为可见是进入onResume方法

而onStop后从新进入前台可见时就会调用另一个onRestart的周期方法,在进入onStart后继续生命周期。

还有Activity的异常生命周期:系统资源相关配置的变化(横竖屏切换,键盘可用性,语言) , 后台Activity因为优先级被销毁。

  • 对于系统资源相关配置变化引起的异常生命周期是会在销毁Activity之前调用onSaveInstanceState() 保存之前的状态数据,然后重启Activity并将之前的状态数据传给onCreate和onRestoreInstanceState()方法,onRestoreInstanceState方法的调用时机是在onCreate之后onStart之前。对于这种变化我们可以通过配置manifest.xml中的参数告诉系统不用在有变化的时候销毁Activity重新启动,而是只要在Activity的属性项加上android:configChanges="orientation|screenSize",然后在在有变化时就不行重启Activity而是进入Activity中可以重写的方法onConfigurationChanged(),那么在有变化时就可以在这个重写的方法中处理部分逻辑了。
  • 而对于Activity因为优先级被销毁同样会调用onSaveInstanceState()保存数据,而onRestoreInstanceState()也会可以获取到之前保存的数据。

Activity的四种启动模式 Standard , SingleTop  , SingleTask, SingleInstance  

  • Standard模式 : 就是标准的启动模式, 每次启动都重新创建一个新的Activity。
  • SingleTop模式: 就是保持启动的Activity保持在活动栈的顶部, 当之前有Activity在栈中时就会将这个Activity上面的所有Activity退出栈,使其从新到栈顶恢复到前台,如果本身就在栈顶就直接用这个Activity, 并且会调用onNewIntent()。
  • SingleTask模式:这个是当需要的任务栈中已经有了,那么就和SingleTop模式一样操作, 如果不存在任务栈,那么就重新新建一个任务栈并将其放到栈顶,而这个需要什么栈的判断是由一个taskAffinity的属性决定的。
  • SingleInstance模式: 这个就是SingleTask模式的加强版,这个模式下规定了Activity只能单独的存在于一个栈中。每次重新的启动都是重新新建一个栈并将其放到栈顶。

对于Activity的调用有两种方式: 显式调用和隐式调用。显式调用就是指定被启动对象的组件信息,包括包名和类名,比较简单。而隐式调用Intent能够匹配目标组件的IntentFilter中所设置的过滤信息。

当在一个Activity中有多个IntentFilter时,一个Intent只要能匹配任何一组IntentFilter即可成功启动对于的Activity。

  • action的匹配规则:当Intent中没有指定action时,匹配失败。 action的匹配要求Intent中的action存在且必须和过滤规则中的其中一个action相同(当Intent中有多个action时,可以只有一个action能匹配上IntentFilter中的过滤规则)。
  • category的匹配规则:当Intent中没有指定的category时,也可以匹配成功,因为系统调用startActivity或startActivityforResult时会默认为Intent加上“android.intent.category.DEFAULT”,那么这个同时也就要求我们的所有Activity都添加上“android.intent.category.DEFAULT”这个Category否则我们的Activity就无法接收到隐式调用。而一旦有了Category,那么不管有多少个,每个都要求能够和过滤规则中的任何一个Category相同。
  • data的匹配规则:这个的匹配规则和action类似,data由两个部分组成,mimeType和URI.在IntentFilter中设置data如果没有URI那么就要求Intent中的URI部分的schema必须为content或file才能匹配。

在使用隐式调用前最好判断一下是否有Activity能够匹配我们的Intent,可以使用PackageManager的resolveActivity或者Intent的resolveActivity进行判断如果找不到就会返回null。

public abstract ResolveInfo resolveActivity(Intent intent , int flags);

这个方法的第一个参数就是我们要使用的Intent,而第二个参数是MATCH_DEFAULT_ONLY,这样找到的Activity才是含有“android.intent.category.DEFAULT”这个Category的Activity。

另外在action和category中有一类特殊的组合:

<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>

这个就是APP的入口Activity的配置参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值