1.使用自定義 Action A 程式中調用的代碼為: 1 Intent intent = new Intent();
2 intent.setAction("com.test.action.PLAYER");
3 startActivity(intent);
B 程式中的 AndroidManifest.xml 中啟動 Activity 的 intent-filter:
1 <intent-filter> 2 3 4 <action android:name="android.intent.action.MAIN" />
<action android:name="com.test.action.PLAYER" />
<category android:name="android.intent.category.DEFAULT" /><!- -必須,否則無效-->
5 <category android:name="android.intent.category.LAUNCHER" /> 6 </intent-filter>
2.使用包類名 A 程式中調用的代碼為: 1 Intent intent = new Intent();
2 intent.setClassName("com.test", "com.test.Player"); 3 startActivity(intent);
intent.setClassName(arg1,arg2)中的 arg1 是被調用程式 B 的包名,arg2 是 B 程式中目的 activity 的完整類名。
又或者: 1 Intent intent = new Intent();
2 ComponentName comp = new ComponentName("com.test", "com.test.Player " );
3 intent.setComponent(comp); 4 startActivity(intent);
B 程式(被調用)中的 AndroidManifest.xml 中啟動 Activity 的 intent-filter 不需要特别加入其它資訊,如下即可:
1 <intent-filter> 2 3 <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> 4 </intent-filter> 隐式調用 多個 Activity 之間的互相調用:
建立一個類繼承 Activity 類, 在功能清單 AndroidManifest.xml 檔案中添加進上面 Activity 的配置代碼,
打開新的 Activity:startActivity(new Intent(MainActivity.this, NewActivity.class)); 打開新的 Activity,并傳遞若幹個參數給它: Intent intent = new Intent(MainActivity.this, NewActivity.class) Bundle bundle = new Bundle();//該類用作攜帶資料 bundle.putString("name", "姓名"); bundle.putInt("age", 4); intent.putExtras(bundle);//附帶上額外的資料 startActivity(intent); 在另一個 Activity 裡面接收參數: Bundle bundle = this. getIntent(). getExtras(); String name = bundle. getString("name"); int age = bundle. getInt("age"); Bundle 類用作攜帶資料,它類似于 Map,用于存放 key-value 名值對形式的值。相對于 Map,它提供 了各種常用類型的 putXxx()/ getXxx()方法,如:putString()/ getString()和 putInt()/ getInt(),putXxx()用于往 Bundle 對象放入資料, getXxx()方法用于從 Bundle 對象裡擷取資料。Bundle 的内部實際上是使用了 HashMap 類型的變量來存放 putXxx()方法放入的值: 請求碼的作用: 使用 startActivityForResult(Intent intent, int requestCode)方法打開新的 Activity,我們需要為 startActivityForResult()方法傳入一個請求碼(第二個參數)。請求碼的值是根據業務需要由自已設定,用于 辨別請求來源。
例如:一個 Activity 有兩個按鈕,點選這兩個按鈕都會打開同一個 Activity,不管是那個按 鈕打開新 Activity, 當這個新 Activity 關閉後, 系統都會調用前面 Activity 的 onActivityResult(int requestCode, int resultCode, Intent data)方法。在 onActivityResult()方法如果需要知道新 Activity 是由那個按鈕打開的, 并且要做出相應的業務處理。 結果碼的作用: 在一個 Activity 中, 可能會使用 startActivityForResult()方法打開多個不同的 Activity 處理不同的業務, 當這些新 Activity 關閉後,系統都會調用前面 Activity 的 onActivityResult(int requestCode, int resultCode, Intent data)方法。為了知道傳回的資料來自于哪個新 Activity,我們就要用到結果碼。 Intent(意圖): Intent 提供了一種通用的消息系統,它允許在你的應用程式與其它的應用程式間傳遞 Intent 來執行動 作和産生事件。使用 Intent 可以激活 Android 應用的三個核心元件:活動、服務和廣播接收器。 Intent 可以劃分成顯式意圖和隐式意圖。 顯式意圖:調用 Intent.setComponent()或 Intent.setClass()方法明确指定了元件名的 Intent 為顯式意 圖,顯式意圖明确指定了 Intent 應該傳遞給哪個元件。 隐式意圖:沒有明确指定元件名的 Intent 為隐式意圖。 對于隐式意圖,Android 是怎樣尋找到這個最合适的元件呢?記的前面我們在定義活動時,指定了一個 intent-filter,Intent Filter(意圖過濾器)其實就是用來比對隐式 Intent 的,當一個意圖對象被一個意圖過濾器 進行比對測試時,隻有三個方面會被參考到:動作、資料(URI 以及資料類型)和類别。 動作測試(Action test) 一個意圖對象隻能指定一個動作名稱,而一個過濾器可能列舉多個動作名稱。如果意圖對象或過濾器 沒有指定任何動作,結果将如下: ? 如果過濾器沒有指定任何動作,那麼将阻塞所有的意圖,是以所有的意圖都會測試失敗。沒有意圖 能夠通過這個過濾器。 ? 另一方面,隻要過濾器包含至少一個動作,一個沒有指定動作的意圖對象自動通過這個測試 類别測試(Category test) 對于一個能夠通過類别比對測試的意圖,意圖對象中的類别必須比對過濾器中的類别。這個過濾器可 以列舉另外的類别,但它不能遺漏在這個意圖中的任何類别。 原則上一個沒有類别的意圖對象應該總能夠通過比對測試,而不管過濾器裡有什麼。大部分情況下這 個是對的。但有一個例外,Android 把所有傳給 startActivity()的隐式意圖當作他們包含至少一個類别: "android.intent.category.DEFAULT" (CATEGORY_DEFAULT 常量)。 是以, 想要接收隐式意圖的活動必須 在它們的意圖過濾器中包含"android.intent.category.DEFAULT"。(帶"android.intent.action.MAIN" 和 "android.intent.category.LAUNCHER"設定的過濾器是例外) 資料測試(Data test) 當一個意圖對象中的 URI 被用來和一個過濾器中的 URI 比較時,比較的是 URI 的各個組成部分。例 如,如果過濾器僅指定了一個 scheme,所有該 scheme 的 URIs 都能夠和這個過濾器相比對;如果過濾器 指定了一個 scheme、主機名但沒有路經部分,所有具有相同 scheme 和主機名的 URIs 都可以和這個過 濾器相比對, 而不管它們的路經;如果過濾器指定了一個 scheme、 主機名和路經, 隻有具有相同 scheme、 主機名和路經的 URIs 才可以和這個過濾器相比對。當然,一個過濾器中的路徑規格可以包含通配符,這 樣隻需要部分比對即可。 資料測試同時比較意圖對象和過濾器中指定的 URI 和資料類型。規則如下: a. 一個既不包含 URI 也不包含資料類型的意圖對象僅在過濾器也同樣沒有指定任何 URIs 和資料類型 的情況下才能通過測試。 b. 一個包含 URI 但沒有資料類型的意圖對象僅在它的 URI 和一個同樣沒有指定資料類型的過濾器裡 的 URI 比對時才能通過測試。 這通常發生在類似于 mailto:和 tel: 這樣的 URIs 上: 它們并不引用實際資料。 c. 一個包含資料類型但不包含 URI 的意圖對象僅在這個過濾器列舉了同樣的資料類型而且也沒有指 定一個 URI 的情況下才能通過測試。 d. 一個同時包含 URI 和資料類型(或者可從 URI 推斷出資料類型)的意圖對象可以通過測試, 如果它的 類型和過濾器中列舉的類型相比對的話。 如果它的 URI 和這個過濾器中的一個 URI 相比對或者它有一個内 容 content:或者檔案 file: URI 而且這個過濾器沒有指定一個 URI,那麼它也能通過測試。換句話說,一個 元件被假定為支援 content:和 file: 資料如果它的過濾器僅列舉了一個資料類型。