当前位置:   article > 正文

隐式意图的使用_使用隐式意图

使用隐式意图

提到隐式意图:首先应想到显示意图,也就是我们开发中常用的。


显示意图一般是打开本应用自己的界面使用;而隐式意图则是打开其他应用的界面,例如分享,打开mp3等,隐式意图是对自己代码进行保护。


上代码:

<activity
    android:name="com.example.andong.share.implicitintent.OwnActivity">
    <intent-filter >
        <!--可以定制多个动作  程序中只要有一个匹配就行 -->
        <action android:name="android.andong.second"/>

        <!--自定义的category -->
        <category android:name="android.andong.category" />

        <!--默认的类别,必须有  -->
        <category android:name="android.intent.category.DEFAULT" />

        <!--路径匹配  协议://主机名:端口号/路径 -->
        <data android:scheme="http" android:host="www.andong.com" android:port="8080" android:path="/person"/>

        <!--数据类型匹配 -->
        <data android:mimeType="person/jpeg"/>
    </intent-filter>
</activity>

Intent intent3 = new Intent();
intent3.setAction("android.andong.second");
intent3.addCategory("android.andong.category");
intent3.setDataAndType(Uri.parse("http://www.andong.com:8080/person"), "person/jpeg");
startActivity(intent3);

解读:

action:相当于一个动作,可以有多个,满足一个即可

category:其中android默认的是必须有的,其次自己可以自定义;在startActivity时,会将默认的category加上

data:相当于一个uri,(<scheme>://<host>:<port>/[<path>|<pathprefix>|<pathpattern>],例如:http://www.baidu:80:search/info)

mimeType:表示本页面可处理的类别(能处理什么东西);


这里需要注意一点:setData和setType不能一起使用,因为这两个方法会批次清楚对方的值;要使用setDataAndType方法


如果两个activity的intent-filter完全一样,那么会在页面底部弹出对话框让你选择跳转那个页面,就好比分享弹出来很多一样;

在start时,如果有两个activity,如下:

<activity
    android:name="com.example.andong.share.implicitintent.OwnActivity">
    <intent-filter >
        <!--可以定制多个动作  程序中只要有一个匹配就行 -->
        <action android:name="android.andong.second"/>

        <!--必须指定一个类别  用startActivity启动 -->
        <category android:name="android.andong.category" />

        <!--默认必须指定一个类别 用startActivity启动 -->
        <category android:name="android.intent.category.DEFAULT" />

    </intent-filter>
</activity>
<activity
    android:name="com.example.andong.share.implicitintent.Own1Activity">
    <intent-filter >
        <!--可以定制多个动作  程序中只要有一个匹配就行 -->
        <action android:name="android.andong.second"/>

        <!--默认必须指定一个类别 用startActivity启动 -->
        <category android:name="android.intent.category.DEFAULT" />

    </intent-filter>
</activity>
Intent intent3 = new Intent();
intent3.setAction("android.andong.second");
startActivity(intent3);

那么启动的是Own1Activity;如果Own1Activity不存在,那么启动的是OwnActivity。


最后,当我们通过隐式方式启动一个activity的时候,可以先做一下判断,这样就可规避隐式开启的错误了:

1.采用PackageManager的queryIntentActivity方法

public abstract List<ResolveInfo> queryIntentActivities(Intent intent,int flags);

2.采用PackageManager的resolveActivity方法或者Intent的resolveActivity方法

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

Intent intent3 = new Intent();
intent3.setAction("android.andong.second1");
intent3.addCategory("android.andong.category");
intent3.setDataAndType(Uri.parse("http://www.andong.com:8080/person"), "person/jpeg");
if(null==intent3.resolveActivity(getPackageManager())){
    Toast.makeText(this, "resolveActivity==null", Toast.LENGTH_SHORT).show();
}else{
    startActivity(intent3);
}


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/236152
推荐阅读
相关标签
  

闽ICP备14008679号