Intent

3、category(类别):用来表现动作的类别

Category属性也是作为<intent-filter>子元素来声明的。例如:

<intent-filter>

  <action android:name="com.vince.intent.MY_ACTION"></action>

  <category android:name="com.vince.intent.MY_CATEGORY"></category> 

  <category android:name="android.intent.category.DEFAULT"></category> 

</intent-filter>   

Action 和category通常是放在一起用的,所以这里一起介绍一下。我们来先来举一个例子:

新建一个工程文件smyh006_Intent01,在默认文件的基础之上,新建文件SecondActicity.java和activity_second.xml。

紧接着,我们要到清单文件中进行注册,打开AndroidManifest.xml,添加SecondActivity的action和category的过滤器:

复制代码
复制代码
1         <activity 
2 android:name=".SecondActivity"> 3 <intent-filter> 4 <action android:name="com.example.smyh006intent01.MY_ACTION"/> 5 <category android:name="android.intent.category.DEFAULT" /> 6 </intent-filter>  7 </activity>
复制代码
复制代码

上方代码,表示SecondActicity可以匹配第4行的MY_ACTION这个动作,此时,如果在其他的Acticity通过这个action的条件来查找,那SecondActicity就具备了这个条件。类似于相亲时,我要求对方有哪些条件,然后对方这个SecondActicity恰巧满足了这个条件(够通俗了吧)。

注:如果没有指定的category,则必须使用默认的DEFAULT(即上方第5行代码)。

也就是说:只有<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应Intent。如果使用的是DEFAULT这种默认的category,在稍后调用startActivity()方法的时候会自动将这个category添加到Intent中。

现在来修改MainActivity.java中按钮的点击事件,代码如下:

复制代码
复制代码
 1         button1.setOnClickListener(new OnClickListener() {            
 2  @Override  3 public void onClick(View v) {  4 //启动另一个Activity,(通过action属性进行查找)  5 Intent intent = new Intent();  6 //设置动作(实际action属性就是一个字符串标记而已)  7  intent.setAction("com.example.smyh006intent01.MY_ACTION"); //方法:Intent android.content.Intent.setAction(String action)  8  startActivity(intent);  9  } 10 });
复制代码
复制代码

上方代码中,也可以换成下面这种简洁的方式:

复制代码
复制代码
1         button1.setOnClickListener(new OnClickListener() {            
2  @Override 3 public void onClick(View v) { 4 //启动另一个Activity,(通过action属性进行查找) 5 Intent intent = new Intent("com.example.smyh006intent01.MY_ACTION");//方法: android.content.Intent.Intent(String action)  6  startActivity(intent); 7  } 8 });
复制代码
复制代码

上方第5行代码:在这个Intent中,我并没有指定具体哪一个Activity,我只是指定了一个action的常量。所以说,隐式Intent的作用就表现的淋漓尽致了。此时,点击MainActicity中的按钮,就会跳到SecondActicity中去。

上述情况只有SecondActicity匹配成功。如果有多个组件匹配成功,就会以对话框列表的方式让用户进行选择。我们来详细介绍一下:

我们新建文件ThirdActicity.java和activity_third.xml,然后在清单文件AndroidManifest.xml中添加ThirdActivity的action和category的过滤器:

复制代码
复制代码
1         <activity 
2 android:name=".ThirdActivity"> 3 <intent-filter> 4 <action android:name="com.example.smyh006intent01.MY_ACTION"/> 5 <category android:name="android.intent.category.DEFAULT" /> 6 </intent-filter> 7 </activity> 
复制代码
复制代码

此时,运行程序,当点击MainActivity中的按钮时,弹出如下界面:

相信大家看到了这个界面,应该就一目了然了。于是我们可以做出如下总结:

在自定义动作时,使用activity组件时,必须添加一个默认的类别

具体的实现为:

<intent-filter>

               <action android:name="com.example.action.MY_ACTION"/>

               <category android:name="android.intent.category.DEFAULT"/>

</intent-filter>

如果有多个组件被匹配成功,就会以对话框列表的方式让用户进行选择。

每个Intent中只能指定一个action,但却能指定多个category;类别越多,动作越具体,意图越明确(类似于相亲时,给对方提了很多要求)。

目前我们的Intent中只有一个默认的category,现在可以通过intent.addCategory()方法来实现。修改MainActivity中按钮的点击事件,代码如下:

复制代码
复制代码
 1         button1.setOnClickListener(new OnClickListener() {            
 2  @Override  3 public void onClick(View v) {  4 //启动另一个Activity,(通过action属性进行查找)  5 Intent intent = new Intent();  6 //设置动作(实际action属性就是一个字符串标记而已)  7 intent.setAction("com.example.smyh006intent01.MY_ACTION"); //方法:Intent android.content.Intent.setAction(String action)  8 intent.addCategory("com.example.smyh006intent01.MY_CATEGORY");  9  startActivity(intent); 10  } 11 });
复制代码
复制代码

既然在Intent中增加了一个category,那么我们要在清单文件中去声明这个category,不然程序将无法运行。代码如下:

复制代码
复制代码
1             android:name=".SecondActivity">
2             <intent-filter> 3 <action android:name="com.example.smyh006intent01.MY_ACTION"/> 4 <category android:name="android.intent.category.DEFAULT" /> 5 <category android:name="com.example.smyh006intent01.MY_CATEGORY" /> 6 </intent-filter> 7 </activity>
复制代码
复制代码

此时,点击MainActicity中的按钮,就会跳到SecondActicity中去。

总结如下:

自定义类别: 在Intent添加类别可以添加多个类别,那就要求被匹配的组件必须同时满足这多个类别,才能匹配成功。操作Activity的时候,如果没有类别,须加上默认类别

 

4、data(数据):表示与动作要操纵的数据

  • Data属性是Android要访问的数据,和action和Category声明方式相同,也是在<intent-filter>中。
  • 多个组件匹配成功显示优先级高的; 相同显示列表。

Data是用一个uri对象来表示的,uri代表数据的地址,属于一种标识符。通常情况下,我们使用action+data属性的组合来描述一个意图:做什么

使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。比如应用程序中需要展示一个网页,没有必要自己去实现一个浏览器(事实上也不太可能),而是只需要条用系统的浏览器来打开这个网页就行了。

【实例】打开指定网页:

MainActivity.java中,监听器部分的核心代码如下:

复制代码
复制代码
 1         button1.setOnClickListener(new OnClickListener() {            
 2  @Override  3 public void onClick(View v) {  4 Intent intent = new Intent();  5  intent.setAction(Intent.ACTION_VIEW);  6 Uri data = Uri.parse("http://www.baidu.com");  7  intent.setData(data);   8  startActivity(intent);  9  } 10 });
复制代码
复制代码

当然,上方代码也可以简写成:

复制代码
复制代码
1         button1.setOnClickListener(new OnClickListener() {            
2  @Override 3 public void onClick(View v) { 4 Intent intent = new Intent(Intent.ACTION_VIEW); 5 intent.setData(Uri.parse("http://www.baidu.com"));  6  startActivity(intent); 7  } 8 });
复制代码
复制代码

第4行代码:指定了Intent的action是 Intent.ACTION_VIEW,表示查看的意思,这是一个Android系统内置的动作;

第5行代码:通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,再调用intent的setData()方法将这个Uri对象传递进去。

当点击按钮时,将跳到如下界面:

此时, 调用的是系统默认的浏览器,也就是说,只调用了这一个组件。现在如果有多个组件得到了匹配,应该是什么情况呢?

我们修改修改清单文件中对SecondAcivity的声明:

复制代码
复制代码
1         <activity 
2 android:name=".SecondActivity"> 3 <intent-filter> 4 <action android:name="android.intent.action.VIEW" /> 5 <category android:name="android.intent.category.DEFAULT" /> 6 <data android:scheme="http" android:host="www.baidu.com"/>  7 </intent-filter> 8 </activity>
复制代码
复制代码

现在,SecondActivity也匹配成功了,我们运行程序,点击MainActicity的按钮时,弹出如下界面供我们选择:

我们可以总结如下:

  • 当Intent匹配成功的组件有多个时,显示优先级高的组件,如果优先级相同,显示列表让用户自己选择
  • 优先级从-1000至1000,并且其中一个必须为负的才有效

注:系统默认的浏览器并没有做出优先级声明,其优先级默认为正数。

优先级的配置如下:

在清单文件中修改对SecondAcivity的声明,即增加一行代码,通过来android:priority设置优先级,如下:

复制代码
复制代码
1         <activity 
2 android:name=".SecondActivity"> 3 <intent-filter android:priority="-1"> 4 <action android:name="android.intent.action.VIEW" /> 5 <category android:name="android.intent.category.DEFAULT" /> 6 <data android:scheme="http" android:host="www.baidu.com"/> 7 </intent-filter> 8 </activity>
复制代码
复制代码

注:

Data属性的声明中要指定访问数据的Uri和MIME类型。可以在<data>元素中通过一些属性来设置:

android:scheme、android:path、android:port、android:mimeType、android:host等,通过这些属性来对应一个典型的Uri格式scheme://host:port/path。例如:http://www.google.com。

 

5、type(数据类型):对于data范例的描写

如果Intent对象中既包含Uri又包含Type,那么,在<intent-filter>中也必须二者都包含才能通过测试。

Type属性用于明确指定Data属性的数据类型或MIME类型,但是通常来说,当Intent不指定Data属性时,Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,所以无需指定Type属性。

data和type属性一般只需要一个,通过setData方法会把type属性设置为null,相反设置setType方法会把data设置为null,如果想要两个属性同时设置,要使用Intent.setDataAndType()方法。

【任务】:data+type属性的使用 【实例】:播放指定路径的mp3文件。

具体如下:

新建工程文件smyh006_Intent02,MainActivity.java中按钮监听事件部分的代码如下:

复制代码
复制代码
 1         button.setOnClickListener(new OnClickListener(){
 2  @Override  3 public void onClick(View v) {  4 Intent intent = new Intent();  5  intent.setAction(Intent.ACTION_VIEW);  6 Uri data = Uri.parse("file:///storage/sdcard0/平凡之路.mp3");  7 //设置data+type属性  8 intent.setDataAndType(data, "audio/mp3"); //方法:Intent android.content.Intent.setDataAndType(Uri data, String type)  9  startActivity(intent); 10  } 11 });
复制代码
复制代码

代码解释:

第6行:"file://"表示查找文件,后面再加上我的小米手机存储卡的路径:/storage/sdcard0,再加上具体歌曲的路径。

第8行:设置data+type属性  

运行后,当点击按钮时,效果如下:

上方界面中,使用的是小米系统默认的音乐播放器。

 

6、extras(扩展信息):扩展信息

是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个

动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

 

7、Flags(标志位):期望这个意图的运行模式

一个程序启动后系统会为这个程序分配一个task供其使用,另外同一个task里面可以拥有不同应用程序的activity。那么,同一个程序能不能拥有多个task?这就涉及到加载activity的启动模式,这个需要单独讲一下。

注:android中一组逻辑上在一起的activity被叫做task,自己认为可以理解成一个activity堆栈。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值