浅谈Intent——消息信使

Intent——安卓系统里的信使

 学习笔记,欢迎指教。

概述

     △安卓系统不允许直接访问四大应用程序组件,Intent作为一个可以访问四大应用程序的机制存在,Intent可以在四大应用程序之间传递信息,或者说,四大组件通过他来传递信息。

 

    △本文主要对Intent对象做基本简介,同时介绍其常用的各个属性。

Intent分类

    △显式Intent(在Intent里指定想启动的组件名字)

   △隐式Intent(没有指定要启动的组件名字)

使用案例(显式方式)

△使用Intent启动一个窗体:

→单纯启动一个窗体:     

 Intent intent = new Intent(A.this, D.class);//设置要请动的窗体
 startActivity(intent);//启动

→当被启动窗体结束以后希望他能返回信息:

Intent intent = new Intent(A.this, D.class);
startActivityForResult(intent, requestCode);


△使用Intent启动一个服务:

→启动一个只执行一次操作的服务:      

  Intent intent = new Intent(A.this, D.class);
  startService(intent);

      

→将服务与另外一个应用上的服务绑定:

  Intent intent = new Intent(A.this, D.class);
  bindService(intent);


  △使用Intent发送广播

  sendBroadcast(intent);
  sendOrderedBroadcast(intent);
  sendStickyBroadcast(intent);

  注意:为了安全,不要使用隐式Intent启动一个服务,也不要为你的应用中的某个服务组件设置<intent-filter>,因为你不知道什么样的服务会被启动,而且用户也不知道什么服务被打开了(因为服务没有界面)


Intent对象可以封装和传递的信息

     △组件名(component name

    △动作(Action

    △种类(Category

    △数据(Data

    △附加信息(Extra

    △标志(Flags

 

各属性的相关介绍

 △组件名字(component  name

这个没什么可说的,就是组件类名而已。

 

  △在Intent里设置要启动的组件名字

    →在Intent构造方法里面指定:

      Intent myIntent = new Intent(this, 要访问的组件名字.class);

 

    →使用相关方法指定:

    intent.setComponent();

    setClass(this,Class<?>);//与构造方法的使用没有什么区别

    setClassName(Context, String className);

    setClassName(String packageName, String className);

  注:最后面的两个方法,类名是以字符串的形式传入,而且使用完整类名:包名+类名


Action介绍

    △他是隐式启动的属性

    △Action很大程度上决定了Intent做些什么,你可以定义自己的Action内容,但你应当经常使用Intent类已定义的内容。

    △你可以这样理解,Intent就是告诉被启动的组件:“你给我听好了我要你做…………Action

    △几个系统已定义的Intent举例

        →ACTION_VIEW:当你有某些信息需要某个窗体展示给用户,你将使用这个Action,比如一个需要地图软件来展示的地址。

        →ACTION_SEND:当你有某些数据可以让用户通过其他应用分享出去,你将使用这个Action,比如你要分享某些数据通过一个邮件应用,或者一个社交应用。

    注:Action的值是一个字符串,系统指定那些其实也是字符串的常量。

    △为Intent指定Action的方式:

        →构造函数

        →intent.setAction()方法

    注:又该方法可以看出,一个Intent对象只能指定一个Action

    △当你自定义了一个Action,请确定他以你自己应用包名作为前缀,这样可以防止与系统的重复,比如:

    static final String ACTION_MYACTUON = “包名.MYACTION”;

 

Category介绍

    △概述:本质上与Action一样,也是一个字符串,ActionCategory都描述了要访问的组件(隐式访问)做些什么,你可以将他理解成对Action的补充说明,使Intent对其与访问的组件描述更加详细。可以为一个Intent添加任意数量的Category。(比如你要对别的组件说:“我要你做…………Action,详细地说就是要你…………Category”)

    △同样,你可以定义自己的Category,系统也为你提供了一些已定义的Category

    △一些常用Category

  →CATEGORY_BROWSABLE:表示该窗体可以被网页浏览器应用启动,该窗体可以展示由网页上某个链接所指示的数据。

  →CATEGORY_LAUCHER:该窗体是某个应用被启动时所显示的首个窗体,而且该窗体将被显示在系统应用程序列表。

△设置(增加)CategoryaddCategory方法。每次调用这个方法,都为Intent对象增加一个新的Category

 

Data

    △概述:他与ActionCategory并称安卓三大事件过滤机制,Data不是简单地通过字符串对比进行匹配,而是按着一定规则进行匹配:Data根据两个属性进行匹配:MIME TypeURI

        →URI通过Intent传递资源(比如一个文本文件或者一个图片文件),不是直接将资源给发出去的,发送那方通过一个URI来指定资源,接收方则通过这个URI来访问那个资源,安卓上的任何资源都可以以URI的形式表示。

        →MIME Type:他描述了资源类型(通过字符串的形式描述)。比如:”image/*”,”text/plain”,这些都是合法的

    △如何设置两个方式:

        →纯粹的设置URIintent.setData();

        →纯粹的设置Typeintent.setType();

        →同时设置上述两个:intent.setDataAndType();

        →注意:当你使用前面两个方法,他在设置其中一个那时会将另外一个清空(即将另外一个设置为null

 

    上述所说四个属性(组件名字,ActionCategoryData都是用来描述一个Intent,系统通过他们知道应当启用哪个组件处理Intent)。

 

Extras介绍

    △概述:

        →里面存放着键值对。

        →这些键值对就是被启动那个窗体要处理的数据。

        →说白了就是他可以带着你的数据去给被启动的那个窗体。

    △如何向里面增加数据

        →直接将数据放进去:putExtra(“键”,”值”);

        →创建Bundle包,将所有的数据放进Bundle包里,将Bundle发出去:putExtras(bundle);

    △注意:

      →里面的“键”可以是系统已定义好的,Intent类已经定义了很多的“键”他们总是这样子的常量:EXTRA_*;如果你要定义你自己的Extra,你应该将你的包名作为前缀,比如:

stativ ginal String EXTRA_MYEXTEA = “包名.EXTRA_MYEXTRA”;

          同样,这样做是为了能够和系统的不会重复。

    →其实即使你不创建Bundle包,在你往里面放数据那时,系统也会自动给你创建Bundle的。

 

Flags

    △他可以控制被启动组件的行为,比如,被启动的那个组件隶属哪个任务,当被启动那个窗体关闭之后,是否放入最近启动的列表里。

 

 

附:

    注意:你的隐式Intent可能会找不到能被启动的那个组件(如果设备里面没有能处理你所指示的任务的应用,此时如果执行启动,你的应用将会崩溃,所以,你应该在启动之前进行判定)。调用方法:

intent.resolveActivity(getPackagemanager())!==null;

    如果该方法返回值不是空的,表示当前设备里面有应用能处理你的Intent

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值