Activity(中)- 启动模式详解

2017-03-09  本文已影响51人  Lonie233

1. 需求背景

默认的启动activity是每次都会创建新的实例并把他们放入到任务栈中,然后,当你回退的时候,你会发现,一层又一层

2.解决方案:提供了可供选择的启动模式

        Intent intent = new Intent(getApplicationContext(),B.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

3 Activity 的启动方式

感觉并不够一篇文章,正好把启动方式拉过来就差不多了。

  1. 显示调用
    启动一个activity主要分为两种方式,显示调用和隐式调用,其中显示调用简单明了,需要明确指定被启动的activity的类名,如下, intent 显示启动应该是最简单,最熟悉的了
        Intent intent = new Intent(MainActivity.this,Main2Activity.class);
        startActivity(intent);

这是最简单的,但是有一点需要注意,当内部类中调用时,第一个参数需要带上当前activity的类名。

  1. 隐式调用
    隐式调用的好处就是能够解耦合,你只需要按照别人给出的文档进行数据组合,就能启动对应的activity,甚至你都不知道人家activity的类名。
    IntentFilter,这个东西主要是用来过滤匹配你的intent,通过它能够使你的intent找到对应的activity然后启动,他有三个东西
运行结果 1.1 action 配置 1.2

注意,隐式启动的category 必须设置default,不然不会生效, 启动activity除外
why?
因为系统在调用startActivity时,会默认的为我们加上这个,看代码, 而category的匹配规则又要求必须匹配,不写当然就会报错了

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

      android:mimeType="string"
      />

就是这个里面有这么多东西需要设置,但是不用全设置上,我这个顺序是按照实际顺序排列的,实际intent中的data数据格式如下,其中scheme和port 缺少一个就会导致配置的data失效

scheme://host:port/path or pathPrefix or pathPattern

其中mimeType并不在前边,因为这个东西代表的是媒体类型(必须是正式的,不能自己瞎写)。给出一个例子如下

               Intent intent = new Intent("com.test.cn.intent.main2");
               intent.setDataAndType(Uri.parse(""),"image/*");
               startActivity(intent);

配置文件如下

<activity android:name=".Main3Activity">
            <intent-filter>
                <action android:name="com.test.cn.intent.main2" />

                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="image/*"/>
            </intent-filter>

        </activity>

这样就会启动Main3activity,下面在给出一个uri(Universal Resource Identifier 通用资源标识符,定位资源,现在明白为什么会有mimetype了吧,标出资源的类型)的例子。

Intent intent = new Intent("com.test.cn.intent.main2");
                intent.setDataAndType(Uri.parse("123://"),"image/*");
                startActivity(intent);
<intent-filter>
                <action android:name="com.test.cn.intent.main2" />

                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="image/*"/>
                <data android:scheme="123"/>
            </intent-filter>

scheme可以瞎写,但是要注意的是,string里的scheme在转化之前要带://这个东西,不然找不到
host 也可以瞎写,剩下的就更随意了,只要注意格式即可,格式如下

scheme(如果有后面的酒必须有它) ://host(如果有后面的酒必须有它) : port/ path(完整路径)或者pathpattern(通配符,需要注意正则表达式)或者pathPrefix(路径的前缀信息)

后两种我个人基本没用过。差不多就是这个样子了。

-------------------------------未完待续---------------------------------------------

下一节 Activity(下)- 启动过程模式详解

参考资料1

上一篇 下一篇

猜你喜欢

热点阅读