接上節(jié)繼續(xù)。。版權(quán)所有:飛雪無(wú)情,轉(zhuǎn)載請(qǐng)注明出處:
http://flysnow.iteye.com/blog/978225
Android開(kāi)發(fā)技術(shù)交流群86686524 (已滿(mǎn))請(qǐng)加120059404
Android系列教程目錄:
-
Android教程之一:Window下搭建Android開(kāi)發(fā)環(huán)境
-
Android教程之二:Linux下搭建Android開(kāi)發(fā)環(huán)境
-
Android教程之三:第一個(gè)Android應(yīng)用,HelloWorld
-
Android系列教程之四:Android項(xiàng)目的目錄結(jié)構(gòu)
-
Android系列教程之五:Activity的生命周期
-
Android系列教程之六:TextView小組件的使用--附帶超鏈接和跑馬燈效果
-
Android系列教程之七:EditText使用詳解-包含很多教程上看不到的功能演示
-
Android系列教程之八:ListView組件的使用
-
Android系列教程之九:GridView組件的使用
-
Android系列教程之十:Intents and Intent Filters(一)
-
Android系列教程之十一:Intents and Intent Filters(二)
數(shù)據(jù)(data)檢測(cè)
data標(biāo)記也是在intent-filter中定義的,大致格式如下:
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<data android:mimeType="text/plain"></data>
</intent-filter>
??? ?? 每個(gè)data定義一個(gè)URI和數(shù)據(jù)類(lèi)型(MIME),URI由4個(gè)屬性來(lái)定義,分別是android:scheme,android:host,android:port,android:path..這個(gè)四個(gè)屬性構(gòu)成如下格式的URI: scheme://host:port/path ?? 如:content://com.flysnow.intent:8080/show/view。其中content就是scheme,com.flysnow.intent就是host,8080就是port,show/view就是path...如果有經(jīng)常使用ContentProvider的應(yīng)該熟悉。。我們經(jīng)常定義的authority不就是host+port嗎?還有這幾個(gè)元素都是可選的,但是不是隨便用就可以的,port要依賴(lài)于host,沒(méi)有host,port就會(huì)被忽略,不起作用,同樣,如果要使用host+port(authority)就必須指定scheme。而path則依賴(lài)于scheme和authority。。
?????? 還有一個(gè)很重要的類(lèi)型就是mimeType,這個(gè)屬性用于指定內(nèi)容的類(lèi)型,也就是這個(gè)組件可以處理哪些類(lèi)型的內(nèi)容。。如text/plain表示無(wú)格式文本類(lèi)型,mimeType也支持通配符,使用text/*則表示所有文本類(lèi)型。通過(guò)使用它,你可以很方便的開(kāi)發(fā)出關(guān)聯(lián)打開(kāi)諸如txt文件,pdf文件的應(yīng)用。后面的兩個(gè)自理將會(huì)演示txt文件查看器,圖片查看器的例子。。MIME可以參考http://www.w3school.com.cn/media/media_mimeref.asp。這里有所有的內(nèi)容類(lèi)型的定義。。
開(kāi)發(fā)實(shí)例-撥打電話(huà),text閱讀器和圖片查看器
下面通過(guò)一個(gè)例子來(lái)演示data的檢測(cè),項(xiàng)目名為Intents,應(yīng)用名為Intents and Filters,運(yùn)行在Android2.2版本上.主啟動(dòng)Activity為IntentsTestList。例子包括以下演示:
- 通過(guò)發(fā)送intent的方式“打開(kāi)撥號(hào)界面并輸入電話(huà)123456”。
- 創(chuàng)建一個(gè)Text文件閱讀器
- 創(chuàng)建一個(gè)圖片查看器
首先我們實(shí)現(xiàn)第一項(xiàng),修改IntentsTestList類(lèi)如下:
/**
* Intents測(cè)試列表類(lèi)
* @author 飛雪無(wú)情
* @since 2011-3-14
*/
public class IntentsTestList extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//定義ListAdapter
setListAdapter(new SimpleAdapter(this, getData(),
android.R.layout.simple_list_item_1, new String[] { "title" },new int[] {android.R.id.text1}));
getListView().setTextFilterEnabled(true);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent intent=(Intent)getData().get(position).get("intent");
Boolean isActivity=(Boolean)getData().get(position).get("isActivity");
if(isActivity){
startActivity(intent);
}else{
sendBroadcast(intent);
}
}
/**
* 返回ListView需要的數(shù)據(jù)
* @return ListView需要的數(shù)據(jù)
*/
private List<Map<String,Object>> getData() {
List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
addItem(data, "打開(kāi)撥號(hào)界面并輸入電話(huà)123456", new Intent(Intent.ACTION_DIAL, Uri.parse("tel://123456")), true);
return data;
}
/**
* 給ListView添加數(shù)據(jù)
* @param data 存儲(chǔ)數(shù)據(jù)的List
* @param name 要顯示的Title
* @param intent 單擊某一項(xiàng)時(shí)要啟動(dòng)的Activity
* @param isActivity 啟動(dòng)的是否是Activity,true是,false為廣播
*/
private void addItem(List<Map<String,Object>> data, String name, Intent intent,boolean isActivity) {
Map<String, Object> temp = new HashMap<String, Object>();
temp.put("title", name);
temp.put("intent", intent);
temp.put("isActivity", isActivity);
data.add(temp);
}
}
?這時(shí)我們運(yùn)行程序,單擊“打開(kāi)撥號(hào)界面并輸入電話(huà)123456”就會(huì)打開(kāi)系統(tǒng)的自帶的撥號(hào)界面,并且默認(rèn)已經(jīng)錄入了要撥打的號(hào)碼“123456”。效果圖如下:
?
? 然后我們實(shí)現(xiàn)第二功能-txt文件閱讀器
新建TextWatcherActivity代碼如下:
/**
* 顯示文本的Activity
* @author 飛雪無(wú)情
* @since 2011-3-24
*/
public class TextWatcherActivity extends Activity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextView=new TextView(this);
setContentView(mTextView);
}
@Override
protected void onStart() {
super.onStart();
Intent txtIntent=getIntent();
Uri data=txtIntent.getData();
String txt;
try {
txt = readTxt(data);
} catch (IOException e) {
txt="打開(kāi)txt文件異常";
}
mTextView.setText(txt);
}
/**
* 讀取txt文本
* @param txtUri
* @return
* @throws IOException
*/
private String readTxt(Uri txtUri) throws IOException{
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(getContentResolver().openInputStream(txtUri),Charset.forName("GBK")));
StringBuilder txt=new StringBuilder();
String buf="";
while((buf=bufferedReader.readLine())!=null){
txt.append(buf).append("\n");
}
return txt.toString();
}
}
?然后在AndroidManifest.xml中加入如下定義:
<activity android:name=".TextWatcherActivity"
android:label="查看TXT文件">
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<data android:mimeType="text/plain"></data>
</intent-filter>
</activity>
?
這樣在單擊txt文件的時(shí)候就可以選擇我們的這個(gè)Activity對(duì)txt文件處理,顯示其內(nèi)容.我們新建一個(gè)1.txt文件,寫(xiě)上一些內(nèi)容,放在我們的sd卡中,使用文件管理工具查看這個(gè)txt文件,會(huì)彈出如下圖的提示,看到我們剛剛做的《TXT閱讀器》了吧。
選擇“查看TXT文件”,就可以看到我們的txt內(nèi)容:
最后實(shí)現(xiàn)第三個(gè)功能--圖片查看器
新建ImageWatcherActivity,代碼如下:
/**
* 顯示文本的Activity
* @author 飛雪無(wú)情
* @since 2011-3-24
*/
public class ImageWatcherActivity extends Activity {
private final String IMAGE_URI_KEY="imageUriKey";
private Uri image;
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mImageView=new ImageView(this);
setContentView(mImageView);
}
@Override
protected void onStart() {
super.onStart();
Intent txtIntent=getIntent();
image=txtIntent.getData();
//對(duì)于大圖片未做優(yōu)化處理
mImageView.setImageURI(image);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
image=savedInstanceState.getParcelable(IMAGE_URI_KEY);
mImageView.setImageURI(image);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(IMAGE_URI_KEY,image);
}
}
? 然后在AndroidManifest.xml中加入如下定義:
<activity android:name=".ImageWatcherActivity"
android:label="查看圖片文件">
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<data android:mimeType="image/*"></data>
</intent-filter>
</activity>
?
這樣在單擊圖片文件的時(shí)候就可以選擇我們的這個(gè)Activity對(duì)txt文件處理并且顯示。
?
數(shù)據(jù)(data)檢測(cè)小結(jié)
對(duì)于data的匹配,如果說(shuō)怎么怎么匹配,在什么情況下通過(guò)可能會(huì)比較難以理解,這里以一種簡(jiǎn)單的方式來(lái)解說(shuō)。
假定我們定義的Intent Filter 的data標(biāo)簽為集合A,傳遞的Intent中包含的data為集合B,當(dāng)B是A的子集時(shí)就通過(guò)了(Action和Category也得檢測(cè)通過(guò))。如果B為空(不配置data),那么A也得為空(不配置data)才能通過(guò) 。更詳細(xì)(繁瑣)的介紹請(qǐng)參考doc
?
Intents and Intent Filters總結(jié)
Android提供了以Intent的方式調(diào)用Android設(shè)備的內(nèi)置Google應(yīng)用,比如打電話(huà),調(diào)用Google瀏覽器打開(kāi)網(wǎng)頁(yè),搜索等。關(guān)于這方便的介紹可以參考Android開(kāi)發(fā)文檔《Intents List: Invoking Google Applications on Android Devices》這一節(jié)的介紹,很詳細(xì)。docs/guide/appendix/g-app-intents.html。
Intent是一個(gè)很好的設(shè)計(jì),它提供了一種在各個(gè)組建之間通信的方式,也為我們使用其他的應(yīng)用的功能提供了可能,這樣如果我們想在自己的應(yīng)用打開(kāi)一個(gè)網(wǎng)頁(yè),我們就不用特意遷入一個(gè)webview,我們直接調(diào)用Android內(nèi)的瀏覽器打開(kāi)即可。。
最后值得一提的是PackageManager這個(gè)類(lèi)中為我們提供了一系列的query...()方法,可以讓我們根據(jù)我們定義的Intent查詢(xún)特定的匹配Intent Filter標(biāo)記的所有組件。。有興趣的可以研究一下。。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

