Android——Intent简介

<p>Intent简介</p><p>本篇仅是个人学习笔记,内容为个人理解,如有错误还请提醒。</p><p>Intent可以用来启动Activity(startActivity(Intent))、Serveice(startService(Intent))等组件,可以用来绑定Activity和Service以建立它们之间的通信(bindServiceConnaction(Intent,ServiceConnection,int)),可以作为Broadcast Intent发送给广播接收器(sendBroadcast(Intent))。</p><p>Intent的属性:</p><p>主要属性</p><p>Action</p><p>执行的动作类型。在定义自定义action时,需要包含app的包名,例如:</p><p>static final String ACTION_TIMEREVEL = &quot;com.exmple.action.TIMERAVEL&quot;</p><p>1</p><p>Activity Actions</p><p>动作名称<span class="Apple-tab-span" > </span>作用</p><p>ACTION_MAIN<span class="Apple-tab-span" > </span>表示程序入口</p><p>ACTION_VIEW<span class="Apple-tab-span" > </span>自动以最合适的方式显示Data</p><p>ACTION_EDIT<span class="Apple-tab-span" > </span>提供可以编辑的</p><p>ACTION_PICK<span class="Apple-tab-span" > </span>选择一个一条Data,并且返回它</p><p>ACTION_DAIL<span class="Apple-tab-span" > </span>显示Data指向的号码在拨号界面Dailer上</p><p>ACTION_CALL<span class="Apple-tab-span" > </span>拨打Data指向的号码</p><p>ACTION_SEND<span class="Apple-tab-span" > </span>发送Data到指定的地方</p><p>ACTION_SENDTO<span class="Apple-tab-span" > </span>发送多组Data到指定的地方</p><p>ACTION_RUN<span class="Apple-tab-span" > </span>运行Data,不管Data是什么</p><p>ACTION_SEARCH<span class="Apple-tab-span" > </span>执行搜索</p><p>ACTION_WEB_SEARCH<span class="Apple-tab-span" > </span>执行网上搜索</p><p>ACRION_SYNC<span class="Apple-tab-span" > </span>执同步一个Data</p><p>ACTION_INSERT<span class="Apple-tab-span" > </span>添加一个空的项到容器中</p><p>* Broadcast Actions</p><p>动作名称<span class="Apple-tab-span" > </span>作用</p><p>ACTION_TIME_TICK<span class="Apple-tab-span" > </span>当前时间改变,并即时发送时间,只能通过系统发送。调用格式&quot;android.intent.action.TIME_TICK&quot;</p><p>ACTION_TIME_CHENGED<span class="Apple-tab-span" > </span>设置时间。调用格式&quot;android.intent.action.TIME_SET&quot;</p><p>Data</p><p>操作数据,包括了Uri类型数据和MIME Type类型数据。数据域应该和action要匹配。</p><p>次要属性</p><p>category(类别)</p><p>这是Action的附加信息,它可以进一步的明确一个Intent。</p><p>类别名称<span class="Apple-tab-span" > </span>作用</p><p>CATEGORY_DEFAULT<span class="Apple-tab-span" > </span>把一个组件Component设为可被implicit启动的。</p><p>CATEGORY_LAUNCHER<span class="Apple-tab-span" > </span>把一个action设置为在顶级执行。并且包含这个属性的Activity所定义的icon将取代application中定义的icon。</p><p>CATEGORY_BROWSABLE<span class="Apple-tab-span" > </span>当Intent指向网络相关时,必须要添加这个类别</p><p>CATEGORY_HOME<span class="Apple-tab-span" > </span>使Intent指向Home界面</p><p>CATEGORY_PREFERENCE<span class="Apple-tab-span" > </span>定义的Activity是一个偏好面板Preference Panel。</p><p>Type(数据类型)</p><p>**显示的指定Intent的数据类型,而跳过了通过Uri进行推导判断的步骤。</p><p>如:Vedio、Image、Voice等。**</p><p>component(组件)</p><p>指定Intent的目标组件名称,当指定了这个属性后,系统将跳过匹配其他属性,而直接匹配这个属性来启动对应的组件。</p><p>extras(附加信息)</p><p>可以附加一些数据在Intent中。</p><p>IntentFilter意图过滤器要匹配Intent,需要在Manifest.xml文件中指明相应的Action、Categroy、Type(这是一种Data的属性)来过滤匹配,如果一个Intent包涵多个Category属性,那么想要匹配它的组件就需要在&lt;intent-filter&gt;标签中也同样指明这些属性。</p><p>如果没有明确的指定Intent的指向Data数据的Uri,那么可以给他指定Uri的属性,包括:scheme、host、port、path。一条Uri的结构是这样的:&lt;scheme&gt;://&lt;host&gt;:&lt;port&gt;/&lt;path&gt;</p><pre class="brush:java;toolbar:false">&lt;dataandroid:scheme=&quot;content&quot; android:host=&quot;com.icechen.mydemo&quot; android:port=&quot;200&quot; android:path=&quot;/folder/subfolder/etc&quot;/&gt;</pre><p>Uri的这几个属性是线性关系,上一级未指定,那么下一级就会失效。</p><p>当一个意图过滤器IntentFilter包含Uri其中一个或多个属性时,拥有这些属性的Intent将都能通过过滤器。</p><p>Flag</p><p>通过setFlags(int)或者addFlags(int)可以把标签flags用在Intent中。</p><p>类型<span class="Apple-tab-span" > </span>作用</p><p>FLAG_ACTIVITY_CLEAR_TOP<span class="Apple-tab-span" > </span>相当于Single_Task</p><p>FLAGE_ACTIVITY_SINGLE_TOP<span class="Apple-tab-span" > </span>相当于Single_Top</p><p>FLAG_ACTIVITY_NEW_TASK<span class="Apple-tab-span" > </span>类似于Single_Instance</p><p>FLAG_ACTIVITY_NO_HISTORY<span class="Apple-tab-span" > </span>当离开该Activity后,该Activity将被从任务栈中移除</p><p>构造方法:</p><pre class="brush:java;toolbar:false">Intent(Intentintent);//通过复制一个Intent来创建一个新的Intent Intent(Stringaction);//构造一个指定action的Intent对象 Intent(Stringaction,Uriuri);//构造一个指定action,并且有指向数据的uri的Intent对象 Intent(ContextpackageContext,Clsaa&lt;?&gt;class);//构造一个有指定Component属性的Intent</pre><p>常用方法:</p><pre class="brush:java;toolbar:false">addCategory(StringCategory);//添加一条Category属性 addFlags(intFlags);//添加一条Flag标签 clone();//复制一个Object类型的对象 getExtras();//获得一个Bundle对象 getSourceBounds();//获得发送Intent的组件的边界坐标 makeMainActivity(ComponentNamemainActivity);//创建一个Category属性为luancher的Intent去启动mainActivity parseUri(Stringuri,intflags)//通过解析一个uri获得一个Intent对象 setComponent();//添加component属性 setClass();//相当于添加component属性 setClassName();//相当于添加component属性 resolveActivity(PackageManager);//解析Intent启动的Activity,返回ComponentName对象 createChooser(Intenttarget,CharSequencetitle);//创建一个有选择对话框的Intent getData();setType(); getData();getType();</pre><p>设置/获得Data/Type类型的数据</p><p>Intent的两种主要形式:</p><p>显示意图Explicit Intent:</p><p>直接指定了Intent的Component属性。</p><p>如果不想app中的组件被其他app启动,在manifest.xml中将组件的android:exported属性设置为false。</p><p>Intent i = new Intent(Context,Activity.class); //注意,此处名字必须与java文件完全一致。</p><p>1</p><p>隐式意图Implicit Intent:</p><p>没有指定Component属性,所以它必须包含足够的信息去告诉System应该去匹配运行哪一个组件。</p><p>启动Service只能使用Explicit显示意图,否则在Android5.0以后会报错。因此,在&lt;service&gt;标签中,不要添加意图过滤器,即&lt;intent-filter&gt;标签。</p><p>当需要同时设置Intent的Type类别和Uri类别时,只能使用setDataAndType(Uri data,String type)方法,分开设置是无效的。</p><p>当使用implicit隐式意图去启动一个app时,应该调用Intent对象的resolveActivity(getPackageManager())来获取所启动的类,并判断是否存在,如果不存在需要程序会崩溃;所以需要判断返回的对象不为空后才能调用startActivity(Intent)。</p><p>使用createChooser(Intent,charSequence)方法创建Intent,然后调用startActivity(),当有多个匹配时,会弹出选择对话框供用户选择。</p><p>PackageManager提供了一系列查询可以响应Intent的组件的方法:queryIntentActivity()、queryIntentServices()、queryBroadcastReceiver()。</p><p>Pending Intent</p><p>PendingIntent是一种未定意图,它可以停留在系统中,直到有接收它的组件出现。获得它的实例的方法:</p><pre class="brush:java;toolbar:false">PendingIntent.getActivity(), PendingIntent.getService(), PendingIntent.getBroadcast(), taskStackBuilder.getPendingIntent()。</pre><p>使用Intent的Extral属性传递数据:</p><pre class="brush:java;toolbar:false">intent.putExtral(键,值);/*在意图中绑定一个数据,参数说明: 第一个参数是第二个参数的键; 第二个参数是要传递的值。*/ startActivity(i);//启动一个Activity。 intent=getIntent();//获得启动该活动的Intent对象。 intent.getObjexctExtra(键);/*获得Intent对象中的指定数据。参数说明:该参数就是之前定义的键,通过该方法来获得其对应的数据。*/ /*使用Bundle类(一个数据包)传递数据: 传出时:*/ Boudlebundle1=newBundle();//创建一个Bundle对象。 bundle1.put(键1,值1);//把一个键值数据对添加到Bundle对象中。 bundle1.put(键2,值2); Bundlebundle2=newBundle(); bundle1.put(bundle2);//bundle中可以装Bundle对象。 intent.putExtras(bundle1);//把数据包附加在Intent对象上。 intent.purExtra(键,bundle1);//把Bundle对象作为键值对附加在Intent对象上。 //接收时: Bundleb=intent.getExtras();//从Intent对象中获取Bundle对象(数据包)。 bundle.getObject(键);//获得数据包中,该键的值。 bundle.getObject(键,默认值);//当值不存在时,则设置为默认值。 Bundleb2=i.getExtraBundle();//获得键值对中的Bundle对象。可以传递复杂数据。 /*使用Serializable(流.note)和Pacelable接口序列化对象来传递对象:*/ classAimplemerntsSerializable{ };//这种方法传输A类对象时,效率较低,但无需重写其方法。 //传递/获得对象的方法: intent.putSerializableExtra(键,值)); intent.getSerializableExtra(键); bundle1.putSerializable(键-值); bundle1.getSerizlizable(键); classAimplementsParcelable{ };//这种方法效率较高,但是要重写2个方法: publicintdescribeContents(){ return0;//这个方法这样些就行了 } publicvoidwriteToParcel(Parceldest,intflage){ dest.writeObject1(Object的Object1类型参数); dest.writeObject2(Object的Object2类型参数);//写出该类的对象的参数(通过该类的getExmple()方法获得数据) }</pre><p>还需要添加一个对象:</p><pre class="brush:java;toolbar:false">publicstaticfinalParcelable.Creator&lt;Object&gt;CREATOR=newCreator&lt;Object&gt;(){ publicObjectcreateFromParcel(Parcelsource){ returnnewObject(source.readObject1,source.readObject2);//这里是用实现Parcalable接口的对象的参数来新建一个对象,把它作为返回值。相当于从parcel中取出对象。 } publicObject[]newArray(intsize){ returnnewObject[size]; }</pre><p>/*注意:上面的红色部分一定要大写,否则会报错!writeToParcel()和createFromParcel()的先后顺序需要对应。implements的对象不适用于存盘操作。</p><p>传递/获得对象的方法:*/</p><pre class="brush:java;toolbar:false">intent.putParcelableExtra(键,值); intent.getParcelableExtra(键); bundle1.putParcelable(键,值); bundle1.getParcelable(键);</pre><p>由A启动B,再由B返回一个数据给A的操作:</p><pre class="brush:xml;toolbar:false">//B这边: Intentinetnt=getIntent(); intent.putExtra(键,值); setResult(1,i);//由这个方法返回一个数据给A //A这边: Intentintent=newIntent(); startActivityForResult(i,0);//使用这种方法才能接收B返回的数据。 /** *@paramrequstCode对应A中的请求码 *@paramresultCode对应B中的返回码 *@paramdataB中的Intent对象 */ @Override protectedvoidonActivityResult(intrequstCode,intresultCode,Intentdata){ super.onActivityResult(requestCode,resultCode,data); }</pre>
RangeTime:0.006846s
RangeMem:215.55 KB
返回顶部 留言