Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> android組件通訊 Intent Filter隱式實現Intent

android組件通訊 Intent Filter隱式實現Intent

編輯:Android開發實例

Intent Filter是android裡非常有特色的一個概念。他的用戶體驗和windows下的文件管理器的彈出菜單裡的“打開方式”非常相似。在windows中,當用戶選擇了打開方式菜單後,系統讓用戶選擇應用來打開所選擇的文件。而在android中的文件已經被uri資源代替了。

Intent Filter在android中的應用非常普遍,尤其在資源共享中。例如,當用戶選擇了一個圖片,選擇了共享,我們常常會發現一個選擇列表。這個選擇列表是動態生成的,不是一成不變的。假如你新安裝了facebook應用,那麼facebook就會出現在這個列表裡面。從這個例子可以發現,intent filter的設計使得android系統顯得更加靈活了。

要實現一個Intent Filter, 我們要在AndroidManifest.xml中加入必要的設置,以通知系統某個activity都能夠處理什麼類型的URI資源,然後要在activity的onCreate中加入必要的代碼以處理系統傳遞過來rui資源。

 

一個Service、 Activity 或者 Brodcast Reciever 的Intent Filter , 的事件過濾器, 我們用著大家都很了然的說法來描述之吧, 實際上描述了擁有這些過濾器組建在系統中所具有能力。

Filter 的創建都是通過 manifest.xml 文件, 但是對於 Broadcast Reciever 用 Context.registerReceiver() 來創建。Filter 可以包含三種類型的過濾條件 <action> <category> <data>

一個Intent 是否能夠通過一個過濾器到達對應的處理器取決於, Intent 所包含的 所有Categroy 是夠都在 過濾器中的catergory 列表裡出現。 換句話說, 沒有 catergory字段的Inteng 可以通過任何過濾器, 而一個過濾器, 必須至少要有一個可以通過的限定,Category 或者 Action。 對於Action 也一樣, 能夠通過Filter 的Itent的 Action 必須被列與 Category中。同樣, 沒有Action 的Intent 也可以通過所有的Filter。

對於 <data> 過濾條件稍微復雜點,   但是總的原則還是, 只有Intent 能夠通過 Filter, 那麼Intent 中的信息,必須出現在Filter中。 <data> 需要指定 scheme://host:port/path , 條件順序的優先級隨著范圍縮小而降低,相當於,看作目錄,在子目錄下匹配。 比如, Filter指定了 scheme, 那麼所有具有這個 scheme 的 Intent 都能通過,這個Filter, 類似的通配符的情況也是允許的。

這裡翻譯文檔中的四個例子情況:

a.如果沒有定義URI 和數據類型, 則,該Intent只能通過沒有定義URI和 數據類型的 過濾器。

b.只定義了URI的 Intent 只能通過只定義了 URI 的過濾器。

c.只定義了 數據類型的 Intent 也只能通過只定義了 數據類型的過濾器。

d. 如果一個Intent同事定義了URI和 數據類型, 或者數據類型可以由URI推定, 則只有具備了對應的數據類型,或者 content: 或者 file: 類型,並且沒有定義URI的過濾器。(這種情況, 你自己代碼一下就明白了, 在寫下去,我也不鳥鳥了。)

如果通向Activities 的Intent 引起了多個響應, 就會出現需要用戶指定的提示, 或者是異常。

 

差不多就是這樣的情況了, android 的這種機制非常適合移動設備之間的應用相互調用, 以便在更大的粒度上達成復用。很強大。

 

/Chapter06_Intent_Filter/src/com/amaker/ch06/app/MainActivity.java

  

package com.amaker.ch06.app;

import com.amaker.ch06.app.R;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
*
* Intent Filter 測試
*/
public class MainActivity extends Activity {
// 聲明Button
private Button btn;
private static final String ACTION1 = "com.amaker.ch06.app.TEST_ACTION1";
private static final String ACTION2 = "com.amaker.ch06.app.TEST_ACTION2";
private static final String ACTION3 = "com.amaker.ch06.app.TEST_ACTION3";

private static final String CATEGORY1 = "com.amaker.ch06.app.CATEGORY1";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 設置內容布局
setContentView(R.layout.main);
//實例化按鈕
btn = (Button)findViewById(R.id.Button01);

String a = Intent.ACTION_VIEW;
// 添加單擊監聽器
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
//intent.setAction(ACTION1);
//Uri data = Uri.parse("content://com.amaker.ch07.app/abc");
//intent.setData(data);

intent.addCategory(CATEGORY1);

intent.setAction("android.intent.action.VIEW");
intent.setData(Uri.parse("http://www.google.com"));

startActivity(intent);
}
});
}
}

 

/Chapter06_Intent_Filter/src/com/amaker/ch06/app/TestActivity.java

 

 
package com.amaker.ch06.app;

import com.amaker.ch06.app.R;

import android.app.Activity;
import android.os.Bundle;
/**
* 測試Intent Filter
*/
public class TestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
}
}

 

 

/Chapter06_Intent_Filter/res/layout/main.xml

 

 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:text="測試Intent Filter"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
</LinearLayout>

 

/Chapter06_Intent_Filter/res/layout/main1.xml

 

 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<TextView
android:text="測試Intent Filter"
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>

</LinearLayout>

 

/Chapter06_Intent_Filter/AndroidManifest.xml

 

 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amaker.ch06.app"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android: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>

<activity android:name="TestActivity" >
<intent-filter>
<action android:name="com.amaker.ch06.app.TEST_ACTION1"/>
<action android:name="com.amaker.ch06.app.TEST_ACTION2"/>
<action android:name="com.amaker.ch06.app.TEST_ACTION3"/>

<action android:name="android.intent.action.VIEW"/>


<data android:scheme="content" android:path="com.amaker.ch07.app/abc"/>
<data android:scheme="http" android:path="www.google.com" />

<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="com.amaker.ch07.app.CATEGORY1"/>

</intent-filter>
</activity>

</application>
<uses-sdk android:minSdkVersion="3" />

</manifest>
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved