Android隐式启动:Intent的用法

什么是隐式Intent?
Intent是比较重要的组件,用来启动Activity或者Service、广播和在Android组件之间传递数据,四大组件都与Intent有关联,通过Intent来启动Activity或者Service通常有两种方法,一种是显示启动,另一种是隐式启动。
显示启动就是在明确指出要启动的Activity或者Service的类或者包名。例如:    
Intent intent = newIntent(this, TabActivity.class);  
startActivity(intent);
 
Intent intent = new Intent();
intent.setClass(this,TabActivity.class);  
startActivity(intent);  
 
Intent intent = new Intent();
intent.setClassName(“com.duan.MainActivity”,“com.duan.TabActivity”);
startActivity(intent);

隐式启动则是不明确写死启动哪个Activity或者Service,而是通过设置Action、Data、Category,让系统来匹配出合适的目标。最常见的例子,例如拨打电话:
Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse(“tel:18692354125”));
startActivity(intent);
打开浏览器:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com"));
startActivity(intent);
Android系统接收到隐式启动请求后,会在系统中各个Activity在AndroidManifest.xml配置清单文件中声明的<intent-filter>来搜索、比较和判断是否匹配当前的Intent请求的。TabActivity能被隐式启动,则首先需要在配置清单中文件中为该TabActivity添加<intent-filter>。其中最常用的三个是<action>,<category>和<data>。
<action>标签必须加,可以自己定义,也可以使用系统预定义的变量,最常见的时android.intent.action.VIEW,它表示需要启动某个Activity显示指定的数据(包括图片、视频、文档等)。category代表类别,定义了Activity的类别,Activity可以设置一个或者多个category标签。常用的一般有3个:
DEFAULT  默认动作,用的频率最高
HOME     设置为本地桌面应用
LAUNCHER 本APP的启动Activity,一般我们写app时,点击桌面图标启动的第一个activity
以上两个标签配置完后,就是下面的写法
<activityandroid:name="com.duan.TabActivity">
    <intent-filter>
        <actionandroid:name="android.intent.action.VIEW" />        
        <categoryandroid:name="android.intent.category.DEFAULT" />
    </intent-filter>            
</activity>
此时,在别的页面,可以打开它,但是没有数据显示,这时候就牵涉出第三个标签,数据,
data 代表数据源,是<intent-filter>中最复杂的标签,我们知道URI主要分三个部分:scheme, authority and path。其中authority又分为host和port。data和它类似,也有相对应的属性
android:host: 主机名,例如:baidu.com
android:port:  主机端口,例如: 80
android:path:  URL的有效路径值,例如: /index/example
android:mimeType: 组件可以执行的数据类型,图片、音频、视频等:image/jpeg,video/*
android:scheme: 特定的模式,网络、数据库、文件等:content,http
知道各个属性的作用后,就好做了。
首先,要确定数据来源,是来自网络、数据库、本地文件还是都有,这是后根据需求配置 scheme属性
<data android:scheme="file"/>
<data android:scheme="content"/>
<data android:scheme="http"/>
<data android:scheme="rtsp"/>
隐式Intent中的数据来源URL是以“file://”、“content://”、“http://”、“rtsp://”开头的URL资源,都会隐式地启动TabActivity页面,如果只需要网络的,则去掉其他三种即可,只添加<data android:scheme="content"/>
就像上述打开浏览器一样的代码,也会找到我们这个activity。
mimeType 设置数据类型,图像数据(image/png),视频数据(video/mp4),如果支持多种类型,比如jpg gif等,可以写为image/*,视频也是一个道理,只要支持所有格式的视频, 直接用video/*。如果我们这个activity支持打开mp4的视频,这个属性可以写为<data android:mimeType="video/mp4" />,这个属性和上面一样,可以写多个。
当<Intent-filter>已经添加了mimeType之后,隐式Intent时使用setDataAndType方法。    
Intent intent = new Intent(Intent.ACTION_VIEW);        
intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.mp4")),"video/mp4");
startActivity(intent);
这里的"video/mp4"也可以写成:"video/*",但这样可能会匹配到一些不支持mo4的播放器,页面会出错。

配置清单完成,此时看看如何获取隐式Intent传递过来的数据,显示启动通过intent传递数据,隐式启动也是一个原理,Intent提供了方法可以获取相关的参数信息    
public String getAction();
public Uri    getData();
public String getScheme();
public String getType();
可以获取Intent的Action,Data Uri,Scheme和MimeType值。
如此,TabActivity可以配置为
<activityandroid:name="com.duan.TabActivity">
    <intent-filter>
        <actionandroid:name="android.intent.action.VIEW" />        
        <categoryandroid:name="android.intent.category.DEFAULT" />
    <data android:scheme="file"/>
        <data android:scheme="content"/>
        <data android:scheme="http"/>
        <data android:mimeType="video/mp4" />
    </intent-filter>            
</activity>

对于“file://”开头的Uri对象,可以通过字符串截取,也通过Uri.getPath方法得到去除了“file://”前缀文件地址。例如: “file:///sdcard/test.mp4”则可以转换为实际的“/sdcard/test.mp4”。






猜你喜欢

转载自blog.csdn.net/Deaht_Huimie/article/details/52983864