安卓开发中intent的简单使用
安卓开发中的intent
本博客主要是对intent的使用做一个简要的说明,最后通过intent实现一个简单的app,使用户输入一个url后点击按钮跳转到自己编写的第三方浏览器(WebView实现)中。
Intent简介
Intent的使用说明
- Intent在由以下几个部分组成:动作(action),数据(data),分类(Category),类型(Type),组件(Component),和扩展信息(Extra)
- 创建一个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部分就可以自动的调用对应的应用
需要了解到一个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打开网页