Intent对象详解(一)
Intent的定義:
Android中提供了Intent機制來協(xié)助應用間的交互與通訊,或者采用更準確的說法是,Intent不僅可用于應用程序之間,也可用于應用程序內部的activity, service和broadcast receiver之間的交互。Intent這個英語單詞的本意是“目的、意向、意圖”。
使用Intent啟動系統(tǒng)組件:
三種應用程序基本組件——activity, service和broadcast receiver——是使用稱為intent的消息來激活的。Intent消息傳遞是一種組件間運行時綁定的機制. intent是Intent對象, 它包含了需要做的操作的描述, 或者, 對于廣播來說, 包含了正在通知的消息內容. 對于向這三種組件發(fā)送intent有不同的機制:
使用Context.startActivity() 或 Activity.startActivityForResult(), 傳入一個intent來啟動一個activity. 使用 Activity.setResult(), 傳入一個intent來從activity中返回結果.將intent對象傳給Context.startService()來啟動一個service或者傳消息給一個運行的service. 將intent對象傳給 Context.bindService()來綁定一個service.
將intent對象傳給 Context.sendBroadcast(), Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等廣播方法,則它們被 傳給 broadcast receiver.
在上述三種情況下, android系統(tǒng)會自己找到合適的activity, service, 或者 broadcast receivers來響應intent. 三者的intent相互獨立互不干擾.
Intent的屬性:
component(組件):目的組件
action(動作):用來表現(xiàn)意圖的行動
category(類別):用來表現(xiàn)動作的類別
data(數(shù)據(jù)):表示與動作要操縱的數(shù)據(jù)
type(數(shù)據(jù)類型):對于data范例的描寫
extras(擴展信息):擴展信息
Flags(標志位):期望這個意圖的運行模式
1,component(組件):目的組件
Component屬性明確指定Intent的目標組件的類名稱。(屬于直接Intent)
ComponentName對象包含的構造器:
ComponentName(String pkg,String cls)創(chuàng)建在pkg所在報下的cls類所對應的組件
ComponentName(Context pkg,String cls)創(chuàng)建在pkg所在報下的cls類所對應的組件
ComponentName(Context?pkg,Class<?> cls)創(chuàng)建在pkg所在報下的cls類所對應的組件
一個ComponentName需要指定包名和類名--這就可以唯一確定一個組件類
另外Intent可以根據(jù)給定的組件類去啟動特定的組件,Intent有下面的方法:
setClass(Context packageContext,Class<?> cls):設置該Intent將要啟動的組件對應的類
setClassName(Context packageContext,String className):設置該Intent將要啟動的組件對應的類
setClassName(String packageContext,String className):設置該Intent將要啟動的組件對應的類
以上方法中的兩個參數(shù)其實就確定了一個Component組件
Intent類型分為顯式Intent(直接類型)、隱式Intent(間接類型)。官方建議使用隱式Intent。上述屬性中,component屬性為直接類型,其他均為間接類型。
啟動第二個Activity時:
// 為bn按鈕綁定事件監(jiān)聽器bn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0){// 創(chuàng)建一個ComponentName對象ComponentName comp = new ComponentName(ComponentAttr.this,SecondActivity.class);Intent intent = new Intent();// 為Intent設置Component屬性intent.setComponent(comp); // Intent intent = new Intent(ComponentAttr.this, // SecondActivity.class);startActivity(intent);}});可以這樣寫:
Intent intent = new Intent();//setClass函數(shù)的第一個參數(shù)是一個Context對象//Context是一個類,Activity是Context類的子類,也就是說,所有的Activity對象,都可以向上轉型為Context對象//setClass函數(shù)的第二個參數(shù)是一個Class對象,在當前場景下,應該傳入需要被啟動的Activity類的class對象intent.setClass(MainActivity.this, SecondActivity.class);startActivity(intent);還可以這樣寫:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);
Action 是一個用戶定義的普通字符串,代表該Intent索要完成的一個抽象“動作”。用于描述一個 Android 應用程序組件,一個 Intent Filter 可以包含多個 Action。在 AndroidManifest.xml 的Activity 定義時,可以在其 <intent-filter >節(jié)點指定一個 Action列表用于標識 Activity 所能接受的“動作”
? ? Action要完成的知識一個抽象的動作,這個動作具體由哪個組件(Activity,Service,BroadcastReceiver)來完成,Action這個字符不管。比如Android提供的標準Action:Intent.ACTION_VIEW,它值表示一個抽象的查看動作,但具體什么,啟動哪個Activity來看,Intent.ACTION_VIEW并不知道---這取決于Activity的<intent-filter...>配置,只要某個Activity的<intent-filter...>配置中包含了該ACTION_VIEW,該Activity就有可能被啟動。
一句話總就是說,哪個Activity的intent-filter...>配置中有Intent設置的Action屬性,就可能被啟動。
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能響應Action為指定字符串的Intent --><action android:name="com.hust.actiontest" /> <!-- 指定該Action能響應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對應的Intent的Action屬性String action = getIntent().getAction();// 顯示Action屬性show.setText("Action為:" + action);} 因為SeclondActivity的<intent-filter>的action有com.hust.actiontest所以就可能被MainActivity啟動
使用Intent的Action屬性啟動組件的過程大概是:主Activity的Intent的Action屬性設置為一個字符串str比如“com.hust.edu”,然后再去Manifest.xml中查找各個Activity組件的<intent-filter>的action是否有這個字符串str=com.hust.edu,如果有,這個Activity可能被啟動。
總結
以上是生活随笔為你收集整理的Intent对象详解(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过 Intent 传递类对象
- 下一篇: Intent对象详解(二)