Intent对象详解(一)
Intent的定義:
Android中提供了Intent機(jī)制來協(xié)助應(yīng)用間的交互與通訊,或者采用更準(zhǔn)確的說法是,Intent不僅可用于應(yīng)用程序之間,也可用于應(yīng)用程序內(nèi)部的activity, service和broadcast receiver之間的交互。Intent這個(gè)英語(yǔ)單詞的本意是“目的、意向、意圖”。
使用Intent啟動(dòng)系統(tǒng)組件:
三種應(yīng)用程序基本組件——activity, service和broadcast receiver——是使用稱為intent的消息來激活的。Intent消息傳遞是一種組件間運(yùn)行時(shí)綁定的機(jī)制. intent是Intent對(duì)象, 它包含了需要做的操作的描述, 或者, 對(duì)于廣播來說, 包含了正在通知的消息內(nèi)容. 對(duì)于向這三種組件發(fā)送intent有不同的機(jī)制:
使用Context.startActivity() 或 Activity.startActivityForResult(), 傳入一個(gè)intent來啟動(dòng)一個(gè)activity. 使用 Activity.setResult(), 傳入一個(gè)intent來從activity中返回結(jié)果.將intent對(duì)象傳給Context.startService()來啟動(dòng)一個(gè)service或者傳消息給一個(gè)運(yùn)行的service. 將intent對(duì)象傳給 Context.bindService()來綁定一個(gè)service.
將intent對(duì)象傳給 Context.sendBroadcast(), Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等廣播方法,則它們被 傳給 broadcast receiver.
在上述三種情況下, android系統(tǒng)會(huì)自己找到合適的activity, service, 或者 broadcast receivers來響應(yīng)intent. 三者的intent相互獨(dú)立互不干擾.
Intent的屬性:
component(組件):目的組件
action(動(dòng)作):用來表現(xiàn)意圖的行動(dòng)
category(類別):用來表現(xiàn)動(dòng)作的類別
data(數(shù)據(jù)):表示與動(dòng)作要操縱的數(shù)據(jù)
type(數(shù)據(jù)類型):對(duì)于data范例的描寫
extras(擴(kuò)展信息):擴(kuò)展信息
Flags(標(biāo)志位):期望這個(gè)意圖的運(yùn)行模式
1,component(組件):目的組件
Component屬性明確指定Intent的目標(biāo)組件的類名稱。(屬于直接Intent)
ComponentName對(duì)象包含的構(gòu)造器:
ComponentName(String pkg,String cls)創(chuàng)建在pkg所在報(bào)下的cls類所對(duì)應(yīng)的組件
ComponentName(Context pkg,String cls)創(chuàng)建在pkg所在報(bào)下的cls類所對(duì)應(yīng)的組件
ComponentName(Context?pkg,Class<?> cls)創(chuàng)建在pkg所在報(bào)下的cls類所對(duì)應(yīng)的組件
一個(gè)ComponentName需要指定包名和類名--這就可以唯一確定一個(gè)組件類
另外Intent可以根據(jù)給定的組件類去啟動(dòng)特定的組件,Intent有下面的方法:
setClass(Context packageContext,Class<?> cls):設(shè)置該Intent將要啟動(dòng)的組件對(duì)應(yīng)的類
setClassName(Context packageContext,String className):設(shè)置該Intent將要啟動(dòng)的組件對(duì)應(yīng)的類
setClassName(String packageContext,String className):設(shè)置該Intent將要啟動(dòng)的組件對(duì)應(yīng)的類
以上方法中的兩個(gè)參數(shù)其實(shí)就確定了一個(gè)Component組件
Intent類型分為顯式Intent(直接類型)、隱式Intent(間接類型)。官方建議使用隱式Intent。上述屬性中,component屬性為直接類型,其他均為間接類型。
啟動(dòng)第二個(gè)Activity時(shí):
// 為bn按鈕綁定事件監(jiān)聽器bn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0){// 創(chuàng)建一個(gè)ComponentName對(duì)象ComponentName comp = new ComponentName(ComponentAttr.this,SecondActivity.class);Intent intent = new Intent();// 為Intent設(shè)置Component屬性intent.setComponent(comp); // Intent intent = new Intent(ComponentAttr.this, // SecondActivity.class);startActivity(intent);}});可以這樣寫:
Intent intent = new Intent();//setClass函數(shù)的第一個(gè)參數(shù)是一個(gè)Context對(duì)象//Context是一個(gè)類,Activity是Context類的子類,也就是說,所有的Activity對(duì)象,都可以向上轉(zhuǎn)型為Context對(duì)象//setClass函數(shù)的第二個(gè)參數(shù)是一個(gè)Class對(duì)象,在當(dāng)前場(chǎng)景下,應(yīng)該傳入需要被啟動(dòng)的Activity類的class對(duì)象intent.setClass(MainActivity.this, SecondActivity.class);startActivity(intent);還可以這樣寫:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);
Action 是一個(gè)用戶定義的普通字符串,代表該Intent索要完成的一個(gè)抽象“動(dòng)作”。用于描述一個(gè) Android 應(yīng)用程序組件,一個(gè) Intent Filter 可以包含多個(gè) Action。在 AndroidManifest.xml 的Activity 定義時(shí),可以在其 <intent-filter >節(jié)點(diǎn)指定一個(gè) Action列表用于標(biāo)識(shí) Activity 所能接受的“動(dòng)作”
? ? Action要完成的知識(shí)一個(gè)抽象的動(dòng)作,這個(gè)動(dòng)作具體由哪個(gè)組件(Activity,Service,BroadcastReceiver)來完成,Action這個(gè)字符不管。比如Android提供的標(biāo)準(zhǔn)Action:Intent.ACTION_VIEW,它值表示一個(gè)抽象的查看動(dòng)作,但具體什么,啟動(dòng)哪個(gè)Activity來看,Intent.ACTION_VIEW并不知道---這取決于Activity的<intent-filter...>配置,只要某個(gè)Activity的<intent-filter...>配置中包含了該ACTION_VIEW,該Activity就有可能被啟動(dòng)。
一句話總就是說,哪個(gè)Activity的intent-filter...>配置中有Intent設(shè)置的Action屬性,就可能被啟動(dòng)。
MainActivity .java
public class MainActivity extends Activity {public final static String ACTION="com.hust.actiontest";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn=(Button) findViewById(R.id.button1);btn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent=new Intent();intent.setAction(MainActivity.ACTION);startActivity(intent);}});} <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.hust.actionattrtest"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="20"android:targetSdkVersion="22" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".SeclondActivity"android:label="@string/title_activity_seclond" ><intent-filter><!-- 指定該Activity能響應(yīng)Action為指定字符串的Intent --><action android:name="com.hust.actiontest" /> <!-- 指定該Action能響應(yīng)Category屬性為指定字符串的Intent --><category android:name="android.intent.category.DEFAULT" /> </intent-filter></activity></application></manifest> SecondActivity.java
public class SeclondActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_seclond);TextView show = (TextView) findViewById(R.id.show);// 獲取該Activity對(duì)應(yīng)的Intent的Action屬性String action = getIntent().getAction();// 顯示Action屬性show.setText("Action為:" + action);} 因?yàn)镾eclondActivity的<intent-filter>的action有com.hust.actiontest所以就可能被MainActivity啟動(dòng)
使用Intent的Action屬性啟動(dòng)組件的過程大概是:主Activity的Intent的Action屬性設(shè)置為一個(gè)字符串str比如“com.hust.edu”,然后再去Manifest.xml中查找各個(gè)Activity組件的<intent-filter>的action是否有這個(gè)字符串str=com.hust.edu,如果有,這個(gè)Activity可能被啟動(dòng)。
總結(jié)
以上是生活随笔為你收集整理的Intent对象详解(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过 Intent 传递类对象
- 下一篇: Intent对象详解(二)