Activity那些或许你不太清楚的事

作者: Liuzjdev | 来源:发表于2018-01-07 21:40 被阅读147次

    看了标题也许你会想,也许你会说,activity我天天用,我最了解不过了,没有什么是我不清楚的。你怕是在唬我吧?那下面就看看我说的这些你都了解嘛

    基础知识

    • 正常情况下的生命周期

      • onCreate:表示Activity正在被创建,我们可以做一些初始化工作,没啥子可说的。

      • onRestart:当当前Activity从不可见重新变为可见状态时,该方法会被调用。

      • onStart:这时Activity已经可见的,但是处于后台,无法和用户交互。

      • onResume:这时Activity已经可见的,但是处于前台。

      • onPause:在这个方法可以做一些存储数据,停止动画的操作,但是不能太耗时,因为这会影响到新Activity的显示,onPause必须执行完,新Activity的onResume才会执行。

      • onStop:Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。

      • onDestory:表示Activity即将销毁,我们可以做一些回收工作和资源释放工作。

      Activity第一次启动会调用onCreate-->onStart-->onResume,当用户打开新的Activity或者切换到桌面的时候,会调用onPause-->onStop,如果这个Activity采用透明主题,不会调用onStop,是因为新Activity透明主题我们还能看到下面那个之前Activity,所以不会调用onStop,再回到原Activity时调用onRestart-->onStart-->onResume.

    • 异常情况下的生命周期

      • 资源相关的系统配置发生改变导致Avtivity被杀死并重新创建

      • 资源不足时导致优先级低的Activity被杀死

      • ...

      Activity会调用onSaveInstanceState方法,系统自动为我们做了一定的恢复工作,并且重启为我们恢复这些数据,比如文本框中用户输入的数据,listView滚动位置等,具体的我们可以查看特定View的源码。

    • Activity的启动模式

      1、使用场景

      • standard:当需要每次请求都新开一个实例的时候,比如,浏览器开多个浏览窗口。

      • singleTop:适合作为接受通知的启动界面,比如,客户端收到10条推送,如果是标准模式,分别点击这10个推送,就会启动10个这样的显示内容的界面,而如果是singleTop,则只会打开一个显示界面。

      • singleTask:适合作为程序的入口,不管其他程序打开该界面多少次,都只会在任务栈中存在一份,比如浏览器的启动界面。

      • singleInstance:适合永远都不会变化的界面,比如闹钟的提醒界面,在比如拨号程序的呼叫界面。

    2、它们主要有如下不同:

    • 如何决定所属task
      “standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。
      如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。
      “singleTask”和”singleInstance”总是把activity作为一个task的根元素,他们不会被启动到一个其他task里。
    • 是否允许多个实例
      “standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例;
      “singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。 singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。
    • 是否允许其它activity存在于本task内
      “singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。
      而另外三种模式,则可以和其它activity共存。
    • 是否每次都生成新实例
      “standard”对于没一个启动Intent都会生成一个activity的新实例;
      “singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。
      比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。
      如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D
      如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。
      “singleInstance”是其所在栈的唯一activity,它会每次都被重用。
      “singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。
      当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。
    2、IntentFilter的匹配规则
    - action的匹配规则:要求Intent中的action存在且必须和过滤规则中的其中一个action相同,这个区分大小写,如果相同的字符串,大小写字母不同,action会匹配失败。
    
    - category匹配规则:这个可有可无,如果有,则必须和过滤规则中的其中一个category相同,如果不写的话,在启动Activity时系统会自动加上"android.intent.category.DEFAULT"
    
    - data可进一步分为uri(由scheme、host、port、path | pathPattern | pathPrefix这4部分组成)和mimetype。Intent的uri可通过setData方法设置,mimetype可通过setType方法设置。隐式Intent也必须指定data。同action类似,只要Intent的data只要与Intent Filter中的任一个data声明完全相同,data方面就匹配成功。需要注意的是:若Intent Filter的data声明部分未指定uri,则缺省uri为content或file,Intent中的uri的scheme部分需为content或file才能匹配;若要为Intent指定完整的data,必须用setDataAndType方法,原因请看setData和setType方法的源码:
    
    public Intent setData(Uri data) {
        mData = data;
        mType = null;
        return this;
    }
    
    public Intent setType(String type) {
        mData = null;
        mType = type;
        return this;
    }
    

    从以上代码可以看到,setData会把mimeType置为null,setType会把uri置为null。下面我们来举例说明一下data的匹配。首先我们先来看一下Intent Filter中指定data的语法:

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

    其中scheme、host等各个部分无需全部指定。假如我们为MyActivity的Intent Filter指定了如下data:

    <intent-filter>
        <data android:mimeType="vidoe/mpeg" android:scheme="http" android:host="www.xxx.com" />
        <data android:mimeType="text/plain" android:scheme="http" />
    </intent-filter>
    

    那么我们的Intent想要匹配,mimeType可以为”text/plain"或“video/mpeg",scheme必须为”http“,host则没有限制,因为第二个data没有指定host。

    最后

    这就是我知道的关于activity的一些知识,若有叙述不清晰或是不准确的地方希望大家指出,如果你知道更多知识,欢迎给我评论,大家一起学习进步。谢谢观看

    参考资料 《Android开发艺术探索》

    相关文章

      网友评论

        本文标题:Activity那些或许你不太清楚的事

        本文链接:https://www.haomeiwen.com/subject/dygmnxtx.html