移动应用开发intent的简单使用

安卓开发中的intent

本博客主要是对intent的使用做一个简要的说明,最后通过intent实现一个简单的app,使用户输入一个url后点击按钮跳转到自己编写的第三方浏览器(WebView实现)中。

Intent简介

Intent的使用说明

  1. Intent在由以下几个部分组成:动作(action),数据(data),分类(Category),类型(Type),组件(Component),和扩展信息(Extra)
  2. 创建一个Intent,根据具体的使用要求,采用显示或者隐式的方式来启动一个程序或是跳转到另一个页面,通过startActivity(Intent)的方式启动。

Intent显式与隐式调用

对于显式调用如果了解过JAVA中的反射机制就不难理解其使用方式了,你需要知道所要调用的组件的完整类名(包名及类名),使用显式Intent最典型的情形是在你自己的App中启动一个组件,因为调用自己app内部可以知道对应组件的类名。比如,为了响应用户操作通过显式的Intent在你的App中启动一个Activity或启动一个Service下载文件。
隐式调用的例子也很常见,比如在手机上打开一个文本文件的时候,如果手机没有设置默认的打开程序,可能会跳出多个程序(手机自带的文本浏览器、wps等等)供使用者选择的情况,这种情况就是隐式调用,隐式调用相比显式调用不需要知道所要调用组件的完整类名,只需要在intent中设置上文提到的intent中的一些属性即可,如action属性,比如拨号为ACITON_CALL,用于显示用户的数据为ACITON_VIEW等等,具体的使用可以根据实际情况了解其对应的action属性

Intent与IntentFilters

IntentFileters介绍
在androidManifast.xml文件中通常可以看到以下代码
此处的andorid:name就是android studio中左边对应的JAVA类
action android:name="android.intent.action.MAIN说明该JAVA类是作为一个入口,通俗来说就是你运行这个App以后最先执行的那个类。
category android:name="android.intent.category.LAUNCHER
这里,作为一个MAIN修饰的类,必须要有一个LAUNCHER的属性,否则会报错
就如同开发过程中整个配置文件下没有intent.action.MAIN一样,程序会找不到入口从而无法运行

<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
  </activity>

了解了这些以后,我们可以为自己的app添加上intent-filter标签,假如我们现在的app中有一个类希望他可以响应某些请求,比如作为浏览器打开一个网页的隐式调用,我们应该怎么做呢?

<activity android:name=".xxx"
           android:exported="true">
           <intent-filter>
               <action android:name="android.intent.action.VIEW" />
               <category android:name="android.intent.category.BROWSABLE" />
               <category android:name="android.intent.category.DEFAULT" />
               <data android:scheme="http"/>
               <data android:scheme="https"/>
           </intent-filter>
       </activity>

.xxx为对应要启动的JAVA类的名字
action标签,代表了这个应用可以被哪一种action响应来隐式调用,上面已经有详细介绍过,所以不在重复了
category标签,当category未在intent中设置时的默认参数为DEFAULT,且category属性只需要满足一个即可隐式调用,也就是说在写入category标签的时候,只需要传递过来的intent内部的category属于我们写入的标签中的一个即算满足条件
data标签
根据setData中的uri来确定哪些应用程序符合要求,前面有说到andorid.intent.action.View说明了应用的行为是用于显示用户的数据的,那么拨号与打开浏览器都是属于action.View,但是数据的传输内容显然是不一样,data标签中的http与https就说明了这个应用是打开一个http或者https协议的,因此当数据传输进来的时候,通过uri中的scheme部分就可以自动的调用对应的应用
图中是action与data的具体工作方式
需要了解到一个manifest配置文件中可以含有多个intent-filter标签
在这里插入图片描述

 <activity android:name=".MainActivity"
           android:exported="true">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.DEFAULT" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
       <activity android:name=".OtherOpen"
           android:exported="true">
           <intent-filter>
               <action android:name="android.intent.action.VIEW" />
               <category android:name="android.intent.category.BROWSABLE" />
               <category android:name="android.intent.category.DEFAULT" />
               <data android:scheme="http"/>
               <data android:scheme="https"/>
           </intent-filter>

当app直接运行的时候使用MainActivity类作为入口
当第三方调用action.View且数据满足http或者https协议的时候调用OtherOpen类打开网页

Intent隐式调用的实际使用

了解了以上内容以后
假设我们现在需要编写一个app,由用户输入一个url后点击按钮跳转到对应网页,如何通过隐式调用一个浏览器类的应用。
此处的uri中的url是通过editText得到的

// An highlighted block
Intent it = new Intent();
it.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.parse(url.getText().toString().trim());
it.setData(uri);
startActivity(it);

上述代码就实现了这样一个需求,创建一个Intent意图类,对该意图的动作属性进行设置,这边需要打开一个url的网页,设置用于显示用户的数据的ACTION_VIEW,为了传送这个uri我们向Data属性中添加由EditText中得到的url,此处说明:意图的Data中统一都使用安卓包内提供的Uri类传送数据,如果需要传送其他类型的数据可以使用putExtra方法,通过输入数据名称与其值的方式传送数据

在这里插入图片描述
点击浏览该网页隐式调用应用程序
可以看到手机上常见的多个功能类似app的选择界面,这就是intent隐式调用

在这里插入图片描述
通过调用自己编写的app打开网页

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值