Intent及intent-filter总结与使用

Android中提供了Intent机制来协助应用间的交互与通讯, Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意图”。

Intent是一种运行时绑定(runtimebinding)机制,它能在程序运行的过程中连接两个不同的组件。

1、使用startActivity() 或startActivityForResult(),传入一个intent来启动一个activity。setResult(),传入一个intent来从activity中返回结果。

public voidback(View view) {

                  Intentintent = getIntent();

//              Intentinten = new Intent();

                          intent.putExtra("message","这是回传");

                          setResult(101,intent);

                          finish();//必须销毁

         }

2、将intent对象传给startService()来启动一个service或者传消息给一个运行的service。将intent对象传给bindService()来绑定一个service。

3、将intent对象传给sendBroadcast(), sendOrderedBroadcast(),或者sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver。

 

intent中包含的属性:Component,Action,Category,Date,Type,Extra,Flag这7个属性

Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。

分为显式意图和隐式意图:

一、显式意图:明确指定Intent的目标组件。 一般用于同一应用程序之间的跳转。

1)Component :意图所要启动的组件

   ComponentName有三种构造器:

   (1)ComponentName(Context,Class)

  (2)ComponentName(Context,String)

   (3)ComponentName(Stringpackage,String clz)

          其中用来表示类名的字符串必须使用全类名.

            包名只是用来区分android应用程序的。

            也可以启动不同android应用程序的activity

   intent.setComponent(component);

2)intent.setClass()

3)new Intent(Context,Class)

缺点:不能调用其他应用中的Activity。

/*****************************显示意图 *******************************/

 

                  //显式意图,即指定了要跳转的组件

                  //Intent intent = new Intent();

                  //ComponentName component = new ComponentName(this,

                  //MyActivity.class);//①

                  //intent.setClass(this, MyActivity.class);//②

                  //intent.setComponent(component);

                  //Intent i = new Intent(this, MyActivity.class);//③

                  //startActivity(intent);

 

二、隐式意图:没有明确指定组件名的Intent为隐式意图,

Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。一般用于不同应用程序之间的跳转。

Android系统使用IntentFilter来寻找与隐式相关的组件。

(1)Action动作

用于描述一个 Android 应用程序组件,一个 Intent Filter 可以包含多个 Action。在AndroidManifest.xml 的Activity 定义时,可以在其 <intent-filter >节点指定一个 Action列表用于标识 Activity 所能接受的“动作”。

(2)Category

为Action增加额外的附加条件(用来表现动作的类别),一般将action和category结合使用

Intent:只能包含一个Action,可以有多个Category在java代码中有多个action后者会覆盖前者,因此是没意义的

Activity:可以配置多种Action,可以配置多个Category,类别越多,动作越具体,意图越明确

a)每一个通过 startActivity() 方法发出的隐式Intent都至少有一个 category,就是 "android.intent.category.DEFAULT",所以只要是想接收一个隐式Intent的 Activity 都应该包括"android.intent.category.DEFAULT"category,不然将导致 Intent 匹配失败

b)一个<intent-filter>至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。若Intent请求的Action和<intent-filter>中的某一个<action>匹配,那么该Intent就通过这条<intent-filter>的动作测试。

c)如<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这个<intent-filter>匹配

e)当Intent请求中包含并所有的Category与组件中某个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试

(3)Data  向Action属性提供操作的数据,Data属性接受一个Uri对象。

URI  通用资源标识符:在网络中或者本地如何找到一个唯一的资源的标识符

URL   统一资源定位符:把一个地址作为唯一的资源的标识符,

URN           统一资源命名符

格式:协议://地址:端口号/资源路径

 

一般情况下Activty可以有多个action,多个category,但是只能有一个data.

并且配置data之前需要先有action.

(4)Type 为Action属性提供操作的数据的数据类型

注意:在java代码中

1)Intent中不能单独设置Type,需要结合Action和Data一起使用

2)默认Data与Type不可以同时使用,后设置的属性会覆盖前设置的属性,可以使用setDataAndType()同时设置两个属性。

 

代码及常用action用法:

/***************************** 隐式意图 ************************************/

 

                  Intentintent = new Intent();

                  //是actvity的动作,配合意图过滤器AndroidManifest.xml

                  //<intent-filter>

                  //<action android:name="banwxf" />//可以有多个

                  //<category android:name="android.intent.category.DEFAULT" />//必须存在

                  //</intent-filter>

 

                  //如果配置了相同action的activity不止一个则会让你选择一个activity(可以设置优先级priority)

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

 

                  intent.setAction("banwxf");//如果多条则,后者覆盖前者。没有意义

                  intent.addCategory("banwxf");//是action的附加条件,可以有多条该语句,但是只要满足其中的一个就可以

                  //intent只能包含一个action但是可以有多个category,但至少要有一个category

 

                  //<data android:scheme="banwxf"

                  //android:host="127.0.0.1"

                  //android:port="8888"

                  //android:path="/sa"/>

                  //data属性不需要写全,只能有一个data。用之前必须要有action

                  //如何将字符串转换为uri对象

                  Uriuri = Uri.parse("banwxf://127.0.0.1:8888/sa");// 此uri一定需要写全"scheme://host:port:path"

 

                  //intent.setData(uri);

 

                  //intent.setType("***/***");

                  //注意:data和type不能分开设置

                  intent.setDataAndType(uri,"abc/def");

 

                  startActivity(intent);

         }

 

         publicvoid myWeb(View view) {

                  //通过action掉用系统程序

                  Intentintent = new Intent();

                  intent.setAction(Intent.ACTION_VIEW);//ACTION_VIEW是一个引用,显示指定的对象

                  intent.setData(Uri.parse("http://www.baidu.com"));

                  startActivity(intent);

         }

 

         //播放音乐

         publicvoid myMusic(View view) {

                  //通过action掉用系统程序

                  Intentintent = new Intent();

                  intent.setAction(Intent.ACTION_VIEW);//ACTION_VIEW是一个引用,显示指定的对象

                  //intent.setData(Uri.parse("file:///sdcard/muc.mp3"));

                  intent.setDataAndType(Uri.parse("file:///sdcard/muc.mp3"),"audio/mp3");

                  startActivity(intent);

         }

 

         //打电话

         publicvoid call(View view) {

                  //通过action掉用系统程序

                  Intentintent = new Intent();

                  //intent.setAction(Intent.ACTION_CALL);//直接拨号

                  intent.setAction(Intent.ACTION_DIAL);//跳转到拨号界面

                  intent.setData(Uri.parse("tel:10086"));

                  startActivity(intent);

         }

 

         //写在程序

         publicvoid delete(View view) {

                  //通过action掉用系统程序

                  Intentintent = new Intent();

                  intent.setAction(Intent.ACTION_DELETE);//删除程序

                  intent.setData(Uri.parse("package:com.example.mycompont"));//指定要卸载的应用

                  startActivity(intent);

         }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值