隐式意图的使用

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


显示意图一般是打开本应用自己的界面使用;而隐式意图则是打开其他应用的界面,例如分享,打开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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值