Intent简介

来源:互联网 发布:易建联nba数据虎扑 编辑:程序博客网 时间:2024/05/01 04:25
  • Intent可以用来启动Activity(startActivity(Intent))、Serveice(startService(Intent))等组件,可以用作绑定Activity和Service以建立它们之间的通信(bindServiceConnaction(Intent,ServiceConnection,int)),可以作为broadcastIntent发送给广播接收器(sendBroadcast(Intent))。
Intent的属性:
主要属性
Action
执行的动作类型。在定义自定义action时,需要包含app的包名,例如:
staticfinalString ACTION_TIMETRAVEL ="com.example.action.TIMETRAVEL";
Activity Actions
ACTION_MAIN
程序的入口
ACTION_VIEW
自动以最合适的方式显示Data
ACTION_EDIT
提供编辑Data的权限
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
执同步一个DataACTION_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-filter>标签中也同样指明这些属性。
  • 如果没有明确的指定Intent的指向Data数据的Uri,那么可以给他指定Uri的属性,包括:scheme、host、port、path。一条Uri的结构是这样的:<scheme>://<host>:<port>/<path>
    <data android:scheme="content"
    android:host="com.icechen.mydemo"
    android:port="200"
    android:path="/folder/subfolder/etc"/>
    Uri的这几个属性是线性关系,上一级未指定,那么下一级就会失效。
    当一个意图过滤器IntentFilter包含Uri其中一个或多个属性时,拥有这些属性的Intent将都能通过过滤器。
  • 通过setFlags(int)或者addFlags(int)可以把标签flags用在Intent中。
构造方法:
Intent(Intent o)
通过复制一个Intent来构造
Intent(String action)
构造一个指定action的Intent对象
Intent(String action,Uri uri)
构造一个指定action,并且有指向数据的uri的Intent对象
Intent(Context packageContext,Clsaa<?>class)
构造一个有指定Component属性的Intent
Intent(String action,Uri uri,Context packageContext,Class<?>class)
构造一个有指定的Conponent属性,并且有指定action和指定data的uri的Intent
常用方法:
addCategory(String Category)
添加一条Category属性
addFlags(int Flags)
添加一条Flag标签
clone()
复制一个Object类型的对象
getExtras()
获得一个Bundle对象
getSourceBounds()
获得发送Intent的组件的边界坐标
makeMainActivity(ComponentName mainActivity)
创建一个Category属性为luancher的Intent去启动mainActivity
parseUri(String uri,int flags)
通过解析一个uri获得一个Intent对象
setComponent()
添加component属性
setClass()
相当于添加component属性
setClassName()
相当于添加component属性
resolveActivity(PackageManager)
解析Intent启动的Activity,返回ComponentName对象
createChooser(Intent target,CharSequence title)创建一个有选择对话框的Intent
getData()、setType()
getData()、getType()
设置/获得Data/Type类型的数据
Intent的两种主要形式:
显示意图Explicit Intent:
直接指定了Intent的Component属性。
如果不想app中的组件被其他app启动,在manifest.xml中将组件的android:explicit属性设置为false。
Intent i = new Intent(Context,Activity.class);   //注意,此处名字必须与java文件完全一致。
隐式意图Implicit Intent:
没有指定Component属性,所以它必须包含足够的信息去告诉System应该去匹配运行哪一个组件。



  • 启动Service只能使用Explicit显示意图,否则在Android5.0以后会报错。在<service>标签中,不要添加意图过滤器,即<intent-filter>标签。
  • 当需要同时设置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()。
  • Panding Intent?


使用Intent的Extral属性传递数据:
i.putExtral(键,值);//在意图中绑定一个数据,参数说明:
      第一个参数是第二个参数的标签;
      第二个参数是要传递的值。
startActivity(i);//启动一个Activity。  

i =  getIntent();//获得启动该活动的Intent对象。
i.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对象。
i.putExtras(bundle1);//把数据包附加在Intent对象上。

i.purExtra(键-bundle1);//把Bundle对象作为键值对附加在Intent对象上。
接收时:
Bundle b = i.getExtras();//从Intent对象中获取Bundle对象(数据包)。
b.getObject(键);//获得数据包中,该键的值。
b.getObject(键,默认值);//当值不存在时,则设置为默认值。

Bundle b2 = i.getExtraBundle();//获得键值对中的Bundle对象。可以传递复杂数据。

使用Serializable(流.note )和Pacelable接口序列化对象来传递对象:
class A implemernts Serializable{};//这种方法传输A类对象时,效率较低,但无需重写其方法。
传递/获得对象的方法:
i.putSerializableExtra(键-值));
i.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<Object> CREATOR = new Creator<Object>(){
  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的对象不适用于存盘操作。
传递/获得对象的方法:
i.putParcelableExtra(键-值);
i.getParcelableExtra(键);

bundle1.putParcelable(键-值);
bundle1.getParcelable(键);

由A启动B,再由B返回一个数据给A的操作:
B这边:
Intent i = getIntent();
i.putExtra(键-值);
setResult(1,i);    //由这个方法返回一个数据给A
A这边:
Intent i = new Intent();
startActivityForResult(i,0);   //使用这种方法才能接收B返回的数据。
重写方法:
protected void onActivityResult(int requstCode,int resultCode,Intent data){
    super.onActivityResult(requestCode,resultCode,data);
   }
参数说明:
第一个参数是A中的请求码,对应0;
第二个参数是B中的返回码,对应1;
第三个参数为B中的Intent对象。

Intent相关的一些方法:
getIntent():获得启动这个Activity的意图。

0 0
原创粉丝点击