Intent简介

本篇仅是个人学习笔记,内容为个人理解,如有错误还请提醒。

Intent可以用来启动Activity(startActivity(Intent))Serveice(startService(Intent))等组件,可以用来绑定Activity和Service以建立它们之间的通信(bindServiceConnaction(Intent,ServiceConnection,int)),可以作为Broadcast Intent发送给广播接收器(sendBroadcast(Intent))。

Intent的属性:

主要属性

Action

执行的动作类型。在定义自定义action时,需要包含app的包名,例如:

static final String ACTION_TIMEREVEL = "com.exmple.action.TIMERAVEL"
  • Activity Actions
动作名称 作用
ACTION_MAIN 表示程序入口
ACTION_VIEW 自动以最合适的方式显示Data
ACTION_EDIT 提供可以编辑的
ACTION_PICK 选择一个一条Data,并且返回它
ACTION_DAIL 显示Data指向的号码在拨号界面Dailer上
ACTION_CALL 拨打Data指向的号码
ACTION_SEND 发送Data到指定的地方
ACTION_SENDTO 发送多组Data到指定的地方
ACTION_RUN 运行Data,不管Data是什么
ACTION_SEARCH 执行搜索
ACTION_WEB_SEARCH 执行网上搜索
ACRION_SYNC 执同步一个Data
ACTION_INSERT 添加一个空的项到容器中

* Broadcast Actions

动作名称 作用
ACTION_TIME_TICK 当前时间改变,并即时发送时间,只能通过系统发送。调用格式"android.intent.action.TIME_TICK"
ACTION_TIME_CHENGED 设置时间。调用格式"android.intent.action.TIME_SET"

Data

操作数据,包括了Uri类型数据和MIME Type类型数据。数据域应该和action要匹配。

次要属性

  • category(类别)
    这是Action的附加信息,它可以进一步的明确一个Intent。
类别名称 作用
CATEGORY_DEFAULT 把一个组件Component设为可被implicit启动的。
CATEGORY_LAUNCHER 把一个action设置为在顶级执行。并且包含这个属性的Activity所定义的icon将取代application中定义的icon。
CATEGORY_BROWSABLE 当Intent指向网络相关时,必须要添加这个类别
CATEGORY_HOME 使Intent指向Home界面
CATEGORY_PREFERENCE 定义的Activity是一个偏好面板Preference Panel。

  • Type(数据类型)

**显示的指定Intent的数据类型,而跳过了通过Uri进行推导判断的步骤。
如:Vedio、Image、Voice等。**

  • component(组件)
    指定Intent的目标组件名称,当指定了这个属性后,系统将跳过匹配其他属性,而直接匹配这个属性来启动对应的组件。

  • extras(附加信息)
    可以附加一些数据在Intent中。

IntentFilter意图过滤器要匹配Intent,需要在Manifest.xml文件中指明相应的Action、Categroy、Type(这是一种Data的属性)来过滤匹配,如果一个Intent包涵多个Category属性,那么想要匹配它的组件就需要在标签中也同样指明这些属性。
如果没有明确的指定Intent的指向Data数据的Uri,那么可以给他指定Uri的属性,包括:scheme、host、port、path。一条Uri的结构是这样的://:/

<data android:scheme="content"      android:host="com.icechen.mydemo"      android:port="200"      android:path="/folder/subfolder/etc"/>

Uri的这几个属性是线性关系,上一级未指定,那么下一级就会失效。
当一个意图过滤器IntentFilter包含Uri其中一个或多个属性时,拥有这些属性的Intent将都能通过过滤器。

  • Flag
    通过setFlags(int)或者addFlags(int)可以把标签flags用在Intent中。
类型 作用
FLAG_ACTIVITY_CLEAR_TOP 相当于Single_Task
FLAGE_ACTIVITY_SINGLE_TOP 相当于Single_Top
FLAG_ACTIVITY_NEW_TASK 类似于Single_Instance
FLAG_ACTIVITY_NO_HISTORY 当离开该Activity后,该Activity将被从任务栈中移除

构造方法:

Intent(Intent intent);  //通过复制一个Intent来创建一个新的IntentIntent(String action);  //构造一个指定action的Intent对象Intent(String action,Uri uri); //构造一个指定action,并且有指向数据的uri的Intent对象Intent(Context packageContext,Clsaa<?>class); //构造一个有指定Component属性的Intent

常用方法:

addCategory(String Category); //添加一条Category属性addFlags(int Flags); //添加一条Flag标签clone();  //复制一个Object类型的对象getExtras(); //获得一个Bundle对象getSourceBounds(); //获得发送Intent的组件的边界坐标makeMainActivity(ComponentName mainActivity); //创建一个Category属性为luancher的Intent去启动mainActivityparseUri(String uri,int flags) //通过解析一个uri获得一个Intent对象setComponent();  //添加component属性setClass();  //相当于添加component属性setClassName();  //相当于添加component属性resolveActivity(PackageManager);  //解析Intent启动的Activity,返回ComponentName对象createChooser(Intent target,CharSequence title);//  创建一个有选择对话框的IntentgetData();setType();getData();getType();设置/获得Data/Type类型的数据

Intent的两种主要形式:

显示意图Explicit Intent:

直接指定了Intent的Component属性。
如果不想app中的组件被其他app启动,在manifest.xml中将组件的android:exported属性设置为false。

Intent i = new Intent(Context,Activity.class);    //注意,此处名字必须与java文件完全一致。

隐式意图Implicit Intent:

没有指定Component属性,所以它必须包含足够的信息去告诉System应该去匹配运行哪一个组件。

启动Service只能使用Explicit显示意图,否则在Android5.0以后会报错。因此,在标签中,不要添加意图过滤器,即标签。
当需要同时设置Intent的Type类别和Uri类别时,只能使用setDataAndType(Uri data,String type)方法,分开设置是无效的
当使用implicit隐式意图去启动一个app时,应该调用Intent对象的resolveActivity(getPackageManager())来获取所启动的类,并判断是否存在,如果不存在需要程序会崩溃;所以需要判断返回的对象不为空后才能调用startActivity(Intent)
使用createChooser(Intent,charSequence)方法创建Intent,然后调用startActivity(),当有多个匹配时,会弹出选择对话框供用户选择。
PackageManager提供了一系列查询可以响应Intent的组件的方法:queryIntentActivity()、queryIntentServices()、queryBroadcastReceiver()。

Pending Intent

PendingIntent是一种未定意图,它可以停留在系统中,直到有接收它的组件出现。获得它的实例的方法:

PendingIntent.getActivity(),PendingIntent.getService(),PendingIntent.getBroadcast(),taskStackBuilder.getPendingIntent()。

使用Intent的Extral属性传递数据:

intent.putExtral(键,值);   /*在意图中绑定一个数据,参数说明:      第一个参数是第二个参数的键;      第二个参数是要传递的值。*/startActivity(i);  //启动一个Activity。 intent = getIntent();  //获得启动该活动的Intent对象。intent.getObjexctExtra(键);  /*获得Intent对象中的指定数据。参数说明:该参数就是之前定义的键,通过该方法来获得其对应的数据。*//*使用Bundle类(一个数据包)传递数据:传出时:*/Boudle bundle1 = new Bundle();  //创建一个Bundle对象。bundle1.put(键1,值1); //把一个键值数据对添加到Bundle对象中。bundle1.put(键2,值2);Bundle bundle2 = new Bundle();bundle1.put(bundle2);  //bundle中可以装Bundle对象。intent.putExtras(bundle1);  //把数据包附加在Intent对象上。intent.purExtra(键,bundle1);  //把Bundle对象作为键值对附加在Intent对象上。//接收时:Bundle b = intent.getExtras();  //从Intent对象中获取Bundle对象(数据包)。bundle.getObject(键);  //获得数据包中,该键的值。bundle.getObject(键,默认值);  //当值不存在时,则设置为默认值。Bundle b2 = i.getExtraBundle();//获得键值对中的Bundle对象。可以传递复杂数据。/*使用Serializable(流.note )和Pacelable接口序列化对象来传递对象:*/  class A implemernts Serializable{  };  //这种方法传输A类对象时,效率较低,但无需重写其方法。//传递/获得对象的方法:intent.putSerializableExtra(键,值));intent.getSerializableExtra(键);bundle1.putSerializable(键-值);bundle1.getSerizlizable(键);  class A implements Parcelable{};  //这种方法效率较高,但是要重写2个方法:  public int describeContents(){     return 0;  //这个方法这样些就行了   }  public void writeToParcel(Parcel dest,int flage){     dest.writeObject1(Object的Object1类型参数);      dest.writeObject2(Object的Object2类型参数);  //写出该类的对象的参数(通过该类的getExmple()方法获得数据) }还需要添加一个对象:public static final Parcelable.Creator CREATOR = new Creator(){  public Object createFromParcel(Parcel source){     return new Object(source.readObject1,source.readObject2);//这里是用实现Parcalable接口的对象的参数来新建一个对象,把它作为返回值。相当于从parcel中取出对象。  }  public Object[] newArray(int size){    return new Object[size];}/*注意:上面的红色部分一定要大写,否则会报错!writeToParcel()和createFromParcel()的先后顺序需要对应。implements的对象不适用于存盘操作。传递/获得对象的方法:*/intent.putParcelableExtra(键,值);intent.getParcelableExtra(键);bundle1.putParcelable(键,值);bundle1.getParcelable(键);   

由A启动B,再由B返回一个数据给A的操作:

//B这边:Intent inetnt = getIntent();intent.putExtra(键,值);setResult(1,i); //由这个方法返回一个数据给A//A这边:Intent intent = new Intent();startActivityForResult(i,0);   //使用这种方法才能接收B返回的数据。/***@param requstCode 对应A中的请求码*@param resultCode 对应B中的返回码*@param data B中的Intent对象*/@Overrideprotected void onActivityResult(int requstCode,int resultCode,Intent data){    super.onActivityResult(requestCode,resultCode,data);   }

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. android通讯录数据库表解析和添加,访问通讯录
  5. Android(安卓)Audio Debug相关方法
  6. Android(安卓)数据序列化总结
  7. Android中Json数据解析,Thread+Handler ,SimpleAdapter使用小案例
  8. Android(安卓)API : SimpleCursorAdapter()
  9. Android通用Adapter使用例子

随机推荐

  1. MySQL数据操作之多表查询
  2. mysql cluster的常见问题
  3. MYSQL存储过程,函数,光标
  4. mysql转存sql脚本的时候怎么取消外键
  5. ssh项目 com.mchange.v2.c3p0.impl.NewPr
  6. PostgreSQL 高级特性入门篇
  7. [MySQL]1045 - Access denied for user '
  8. Spring 中jdbcTemplate 实现执行多条sql
  9. [求助][CAB][安装包][CF2.0][SQL][setup]
  10. Mysql数据库学习笔记(一)