美文网首页Android开发Android知识
Activity_如何打开Activity

Activity_如何打开Activity

作者: 难得糊涂与君勉 | 来源:发表于2017-10-17 15:10 被阅读29次

    打开Activitya的方式

    打开Activity可以分为显式和隐式两种,显式调用需要明确地指定被启动对象的组件信息,比如包名和类名。

    隐式调用的规则

    1
    隐式调用的核心:Intent可以匹配目标组件的IntentFilter中设置的过滤信息。
    这里,目标组件就是要启动的Activity,IntentFilter表示意图过滤,也被称为
    过滤列表。
    2
    匹配过滤列表,就是匹配IntentFilter中定义的规则。这些规则中包含action、category、data、
    3
    一个IntentFilter为一个过滤列表,一个过滤列表中可以有多个过滤信息(action、catagory、data),
    一个Activity(目标组件)可以有多个过滤列表。

    IntentFilter_action

    action 就是字符串,系统预定义了一些action,同时我们也快成在应用中定义自己的action。
    action的匹配规则:
    1
    一个过滤规则中可以有多个action,那么只要Intent中的action能和过滤列表中任何一个action相同就算是匹配
    成功。
    2
    要求Intent中action存在且必须和过滤规则中的其中一个action相同,那么action就算是匹配成功。
    3
    action 区分大小写,大小写不同字符串相同的action也会匹配失败。

    IntentFilter_category

    category也是字符串,系统也预定义了一些category,同时也可以自己定义category。
    category匹配规则:
    1
    Intent可以没有category,如果一旦有category,那么每一个都要和过滤规则中任何一个category相同,
    这个是intent占主动,和action不同,action是过滤列表提供几个,让Intent选择一个,这个则是Intent
    有几个,那么IntentFilter中也要有,但是并没有限制IntentFilter中category的数目多少,这个可以随意
    只需要满足intent中需要的category就可以了。
    2
    如果Intent中没有category,那么在startActivity或者startActivityForResult的时候都会默认的为Intent
    加上"android.intent.category.DEFAULT",那么也就要就在IntentFilter的category中添加上
    <category android:name="android.intent.category.DEFAULT">

    IntentFilter_data

    和action一样,是过滤规则占据主动。
    1
    data 的结构:
    data 由两部分组成,mimeType和URI。
    mimeType指的是媒体类型,比如image/jpeg、audio/mpeg4-generic、video/*等
    URI比较复杂结构如下:

    <scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
    对比来看:
    http://www.baidu.com:80/search/info
    或者
    content://com.example.project:200/folder/subfolder/etc
    
     (1)Scheme:URI的模式,比如:http、file、content等如果URI中没有指定这个,那么整个URI的其它参数无效
     (2)host:URI的主机名,如果host未指定,那么整个URI中的其它参数无效。
     (3)port:URI中的端口号,仅当URI中指定了scheme和host参数的时候port参数才有意义。
     (4)path、pathPrefix、pathPattern这三个参数可选,都表示路径,path 表示完整路径信息,
     pathPrefix表示可以包含*在内(*写成\\,\\写成\\\\)的完整路径信息。
     pathPrefix表示路径的前缀信息。
    

    2
    data的匹配规则:
    data中的URI部分可以不写,但是却有默认值,URI的默认值是content和file,
    3
    如果IntentFilter中定义 了<data>,那么Intent中必须要有一个可以匹配的,这就是IntentFilter占主动。
    4
    要为Intent指定完整的data,必须调用setDataAndType方法才可以哦,如果采用默认的URI,那么就要:
    intent.setDataAndType(Uri.parse("file://abc"),"video/*");

    例子展示

    过滤列表
    1

    <intent-filter>
             <action android:name="xlj.xlj.m"/>
              <action android:name="xlj.xlj.m.s"/>
               <category android:name="android.intent.category.DEFAULT"/>
               <category android:name="xlj.ccccc.sss"/>
     </intent-filter>
    

    Intent

    Intent intent = new Intent("xlj.xlj.m");
    startActivity(intent);
    

    2
    过滤列表

     <intent-filter>
                    <action android:name="xlj.xlj.m"/>
                    <action android:name="xlj.xlj.m.z"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                    <category android:name="xlj.ccccc.sss"/>
                    <data android:mimeType="video/*"/>
     </intent-filter>
    

    Intent

      Intent intent = new Intent("xlj.xlj.m");
      intent.setDataAndType(Uri.parse("file://abc"),"video/*");
      startActivity(intent);
    

    观察可知道,如果IntentFilter中三个匹配规则都有,那么Intent的中都要涉及才可以哦。

    如果真的找不目标Activity咋办

    如果真的没有Activity,那么执行startActivity,就会出现ActivityNotFindException
    所以在隐式启动Activity中,提供了一个判断:
    1
    PacageManager中的resolveActivity方法

     PackageManager packageManager = getPackageManager();
            if (packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY)!= null){
                     startActivity(intent);
            }else {
                Toast.makeText(MainActivity.this,"找不到你想要的activity",Toast.LENGTH_SHORT).show();
            }
    

    因为如果找不到所需Activity,那么就会返回一个null。
    2
    Intent 中的resolveActivity方法

    if ( intent.resolveActivity(packageManager) != null){
                //这个分支表示找到了目标Activity
           }else {
               
           }
    

    3
    如果有多个Activity满足了条件,那么系统就会默认的弹出提示框,效果如下:

    系统默认弹出框
    但是咱们可以修改
            Intent intent = new Intent("xlj.xlj.m");
            Intent chooser = Intent.createChooser(intent, "看你喜欢那个");
            startActivity(chooser);
    

    可以把“下次不在询问”去掉,效果如图:


    device-2017-10-17-150738.png

    相关文章

      网友评论

        本文标题:Activity_如何打开Activity

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