青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

life02

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks

引言

http://www.oschina.net/question/54100_28547
http://www.apkbus.com/android-18748-1-1.html

上篇我們介紹了Intents和Intent Filters的理論部分,主要是介紹了:activitiesservicesbroadcastreceivers三種組件的Intent機制兩種Intent(顯式和隱式)及它們如何去匹配目的組件、Intent對象包含哪些信息、Intent Filters的action & category & data。

Intent的重要性,我不再著重介紹了,但我還是要說:Intent能夠使應用程序突破沙盒與外界交流,者這使得Android的世界變得豐富多彩!本篇將用實例來介紹,如何應用Intent,而且繼續(xù)用SMS方面的例子來闡述。本文的主要內容如下:

  • 例子(需求)描述
  • STEP1、添加用于顯示通訊錄的布局文件
  • STEP2、添加Button的點擊事件
  • STEP3、添加通訊錄活動
  • STEP4、解析通訊錄返回的數(shù)據(jù)
  • STEP5、在清單文件AndroidManifest.xml中注冊通訊錄活動和讀取Contact數(shù)據(jù)庫的權限
  • 總結

例子(需求)描述

用手機發(fā)過SMS的人都知道:

  • 用戶可以先編輯短信,然后再去通訊錄中選擇相應的人并發(fā)生給他。
  • 用戶可以在短信內容中插入通訊錄中聯(lián)系人的號碼。

我們的這個例子就是要說明如何實現(xiàn)這個功能。要實現(xiàn)這個功能,即是創(chuàng)建一個新的Activity選擇(ACTION_PICK)通訊錄中的數(shù)據(jù),它會顯示通訊錄中的所有聯(lián)系人并讓用戶選擇,然后關閉并返回一個聯(lián)系人的URI給短信程序。下面介紹如何一步一步實現(xiàn)類似的功能,而且是在之前Android 開發(fā)之旅:短信的收發(fā)及在android模擬器之間實踐(一)中發(fā)送SMS的例子(TextMessage)基礎上加上從通訊錄中選擇聯(lián)系人的功能。

STEP1、添加用于顯示通訊錄的布局文件

我們用一個ListView來顯示整個通訊錄,其中用TextView顯示每一記錄。它們的xml文件分別為contact.xml、listitemlayout,如下所示:

====================================contact.xml

01 <?xmlversion="1.0"encoding="utf-8"?>
02   
03 <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
04   
05 android:orientation="vertical"
06   
07 android:layout_width="fill_parent"
08   
09 android:layout_height="fill_parent"
10   
11 >
12   
13 <ListViewandroid:id="@+id/contactListView"
14   
15 android:layout_width="fill_parent"
16   
17 android:layout_height="wrap_content"
18   
19 />
20   
21 </LinearLayout>

=================================== listitemlayout

01 <?xmlversion="1.0"encoding="utf-8"?>
02   
03 <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
04   
05 android:orientation="vertical"android:layout_width="fill_parent"
06   
07 android:layout_height="fill_parent">
08   
09 <TextViewandroid:id="@+id/itemTextView"android:layout_width="wrap_content"
10   
11 android:layout_height="wrap_content"android:padding="10px"
12   
13 android:textSize="16px"android:textColor="#FFF" />
14   
15 </LinearLayout>

 

為了能夠打開通訊錄,我們還需要在TextMessage程序中加入一個Button btnContact,通過點擊btnContact激活顯示通訊錄的活動。這只需在main.xml文件中加入如下代碼:

1 <Buttonandroid:layout_width="wrap_content"
2         android:layout_height="wrap_content"
3         android:text="@string/btnContact"
4         android:id="@+id/btnContact"    />

記得還有在values/strings.xml中相應的加入<stringname="btnContact">contact</string>

STEP2、添加Button的點擊事件

在上面準備工作做完之后,我們需要監(jiān)聽btnContact的點擊事件,當用戶點擊btnContact時,跳轉顯示通訊錄界面,當用戶選擇一個聯(lián)系人之后,返回SMS程序的主界面。這里就要用到了偉大的Intent啦

01 btnContact = (Button) findViewById(R.id.btnContact);
02   
03 btnContact.setOnClickListener(new View.OnClickListener() {
04   
05 @Override
06   
07 publicvoid onClick(View v) {
08   
09 // TODO Auto-generated method stub
10   
11 Intent intent = new Intent(Intent.ACTION_PICK,
12   
13 ContactsContract.Contacts.CONTENT_URI);
14   
15 startActivityForResult(intent, PICK_CONTACT);
16   
17 }
18   
19   
20 });

 

STEP3、添加通訊錄活動

添加一個類文件,類名為ContactPick(表示通訊錄活動名)繼承Activity。它的主要功能就是獲取從SMS主程序傳遞來的Intent并提取數(shù)據(jù);然后去查詢通訊錄數(shù)據(jù)庫,取出數(shù)據(jù)并填充到STEP1中定義的ListView;最后,還需要添加當用戶選擇一個聯(lián)系人的事件onItemClick,將結果返回給SMS主程序,這里也用到了我們偉大的Intent!代碼如下:

01 package skynet.com.cnblogs.www;
02   
03   
04 import android.app.Activity;
05   
06 import android.content.Intent;
07   
08 import android.database.Cursor;
09   
10 import android.net.Uri;
11   
12 import android.os.Bundle;
13   
14 import android.provider.ContactsContract;
15   
16 import android.view.View;
17   
18 import android.widget.AdapterView;
19   
20 import android.widget.ListView;
21   
22 importandroid.widget.SimpleCursorAdapter;
23   
24 import android.widget.AdapterView.OnItemClickListener;
25   
26   
27 publicclass ContactPick extends Activity {
28   
29 /** Called when the activity is first created. */
30   
31 @Override
32   
33 publicvoid onCreate(Bundle savedInstanceState) {
34   
35 super.onCreate(savedInstanceState);
36   
37 setContentView(R.layout.main);
38   
39   
40 Intent orgIntent=getIntent();
41   
42 Uri queryUri=orgIntent.getData(); 
43   
44 final Cursor c = managedQuery(queryUri,
45   
46 null
47   
48 null,
49   
50 null,
51   
52 null);
53   
54   
55 String[] fromColumns=new String[]{ContactsContract.Contacts.DISPLAY_NAME};
56   
57 int[] toLayoutIDs = newint[] { R.id.itemTextView };
58   
59 SimpleCursorAdapter adapter = newSimpleCursorAdapter(this,
60   
61 R.layout.listitemlayout, c, fromColumns, toLayoutIDs);
62   
63 ListView lv = (ListView) findViewById(R.id.contactListView);
64   
65 lv.setAdapter(adapter);
66   
67 lv.setOnItemClickListener(new OnItemClickListener() {
68   
69 @Override
70   
71 publicvoid onItemClick(AdapterView<?> parent, View view, int pos,
72   
73 long id) {
74   
75 c.moveToPosition(pos); 
76   
77 int rowId = c.getInt(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
78   
79 Uri outURI = Uri.parse(ContactsContract.Contacts.CONTENT_URI.toString() + rowId);
80   
81 Intent outData = new Intent();
82   
83 outData.setData(outURI);
84   
85 setResult(Activity.RESULT_OK,outData);
86   
87 finish();
88   
89 }
90   
91 });
92   
93 }
94   
95 }

 

STEP4、解析通訊錄返回的數(shù)據(jù)

從通訊錄活動返回之后,我們從返回的Intent中提取數(shù)據(jù)并填充到填寫電話號碼的EditView中。代碼主要如下:

01 @Override
02 publicvoid onActivityResult(int reqCode, int resCode, Intent data) {
03   
04 super.onActivityResult(reqCode, resCode, data);
05   
06   
07 switch (reqCode) {
08   
09 case (PICK_CONTACT): {
10   
11 if (resCode == Activity.RESULT_OK) {
12   
13 String name; 
14   
15 Uri contactData = data.getData();
16   
17 Cursor c = managedQuery(contactData, null, null, null, null);
18   
19 c.moveToFirst();
20   
21 name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
22   
23 TextView tv;
24   
25 tv = (TextView)findViewById(R.id.edtPhoneNo);
26   
27 tv.setText(name);
28   
29 }
30   
31 break;
32   
33 }
34   
35 }
36   
37 }

STEP5、在清單文件AndroidManifest.xml中注冊通訊錄活動和讀取Contact數(shù)據(jù)庫的權限

主要工作基本做完了,現(xiàn)在我們只需要注冊通訊錄活動和讀取Contact數(shù)據(jù)的權限了。完整的清單文件代碼如下:

01 <?xmlversion="1.0"encoding="utf-8"?>
02 <manifestxmlns:android="http://schemas.android.com/apk/res/android"
03 package="skynet.com.cnblogs.www"android:versionCode="1"
04 android:versionName="1.0">
05   
06 <application>
07   
08 <activityandroid:name=".TextMessage"android:label="@string/app_name">
09   
10 <intent-filter>
11   
12 <actionandroid:name="android.intent.action.MAIN"/>
13 <categoryandroid:name="android.intent.category.LAUNCHER"/>
14   
15 </intent-filter>
16   
17 </activity>
18   
19 <activityandroid:name=".ContactPick"android:label="@string/app_name">
20 <actionandroid:name="android.intent.action.PICK"/>
21 <categoryandroid:name="android.intent.category.DEFAULT"/>
22   
23 </activity>
24   
25 </application>
26   
27 <uses-permissionandroid:name="android.permission.SEND_SMS"/>
28 <uses-permissionandroid:name="android.permission.READ_CONTACTS"/>
29   
30 </manifest>

注意通訊錄活動的Intent Filters,它的 actionandroid.intent.action.PICKcategoryandroid.intent.category.DEFAULT。現(xiàn)在我們分析一下這個Intent Filter:

  • <actionandroid:name="android.intent.action.PICK"/>使用戶能夠可以在通訊錄列表中選擇一個,然后將選擇的聯(lián)系人的 URL返回給調用者。
  • <categoryandroid:name="android.intent.category.DEFAULT"/>這是默認的category,如果不知道category系統(tǒng)會自動加上。這個屬性是讓使其能夠被像Context.startActivity()等找到。要說明的的是,如果列舉了多個category,這個活動僅會去處理那些Intent中都包含了所有列舉的category的組件。

我們還可以在清單文件中看到TextMessage活動的Intent Filter:

1 <intent-filter>
2     <actionandroid:name="android.intent.action.MAIN"/>
3     <categoryandroid:name="android.intent.category.LAUNCHER"/>
4 </intent-filter>

它指 TextMessage活動定是真?zhèn)€程序的入口并且 TextMessage會列舉在Launcher即啟動列表中。

程序運行結果如下圖所示:

圖1、主界面

圖2、點擊contact按鈕之后

圖3、選擇一個聯(lián)系人之后

總結

我們用發(fā)短信中選擇聯(lián)系人的例子說明Intent和Intent Filter,這里體現(xiàn)了兩個活動之間如何通過Intent和Intent Filter來交互,這也是我們在編寫Android應用程序的時候經(jīng)常遇到了。本文除了上述的主要內容之外,還涉及別的知識點,下面列舉幾個個人認為比較有用的知識點:

  • Cursor類它跟我們平時用的數(shù)據(jù)庫中的游標類似,它提供了對從數(shù)據(jù)庫返回的結果的隨機讀寫操作。如我們例子中用到的,通過 managedQuery方法 查詢數(shù)據(jù)庫并返回結果,然后利用 Cursor對它進行操作。下面介紹 Cursor類的幾個方法(我們例子中用到的,更多的方法請自行查閱相關資料):
    • public abstract int getColumnIndexOrThrow (String columnName):返回給定列名的索引(注意:從0開始的),或者當列名不存在時拋出llegalArgumentException異常;
    • public abstract boolean moveToFirst ():移動到第一行。如果Cursor為空,則返回FALSE
    • public abstract boolean moveToPosition (int position):將游標移動到一個指定的位置,它的范圍在-1 <= position <= count。如果position位置不可達,返回FALSE
  • managedQuery方法:根據(jù)指定的URI路徑信息返回包含特定數(shù)據(jù)的Cursor對象,應用這個方法可以使Activity接管返回數(shù)據(jù)對象的生命周期。參數(shù):
    URI: Content Provider 需要返回的資源索引
    Projection: 用于標識有哪些columns需要包含在返回數(shù)據(jù)中
    Selection: 作為查詢符合條件的過濾參數(shù),類似于SQL語句中Where之后的條件判斷
    SelectionArgs: 同上
    SortOrder: 用于對返回信息進行排序
  • SimpleCursorAdapter允許你綁定一個游標的列到ListView上,并使用自定義的layout顯示每個項目。SimpleCursorAdapter的創(chuàng)建,需要傳入當前的上下文、一個layout資源,一個游標和兩個數(shù)組:一個包含使用的列的名字,另一個(相同大小)數(shù)組包含View中的資源ID,用于顯示相應列的數(shù)據(jù)值。
posted on 2011-12-22 09:11 life02 閱讀(2148) 評論(0)  編輯 收藏 引用 所屬分類: Android開發(fā)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲尤物视频网| 国产精品免费一区二区三区在线观看 | 一区二区视频在线观看| 亚洲视频网在线直播| 在线日韩av永久免费观看| 久久一二三四| 欧美激情一区二区三区蜜桃视频| 日韩视频在线观看免费| 国产精品扒开腿做爽爽爽软件 | 国产欧美日韩综合| 欧美中文字幕精品| 亚洲国产一区在线| 国产视频精品免费播放| 玖玖精品视频| 一区二区三区视频在线播放| 久久国产精品99国产| 亚洲电影自拍| 国产精品久久久久久久久久三级 | 一本色道**综合亚洲精品蜜桃冫| 欧美性事在线| 欧美区一区二区三区| 亚洲欧美激情诱惑| 欧美激情网站在线观看| 开元免费观看欧美电视剧网站| 99视频超级精品| 亚洲欧洲日本专区| 国产欧美在线看| 国产精品视频一区二区高潮| 你懂的国产精品| 亚洲一区中文| 亚洲国产欧洲综合997久久| 欧美成人精品影院| 午夜欧美大尺度福利影院在线看| 亚洲国产二区| 91久久精品国产91久久性色tv| 亚洲第一网站免费视频| 亚洲电影毛片| 亚洲精品一区二区三区av| 国产一区二区三区高清播放| 欧美偷拍另类| 麻豆91精品91久久久的内涵| 亚洲女同在线| 羞羞漫画18久久大片| 欧美激情视频给我| 亚洲国产中文字幕在线观看| 亚洲人成网站777色婷婷| 久久一区欧美| 香港久久久电影| 一区二区三区 在线观看视频| 亚洲丰满在线| 日韩视频专区| 亚洲欧美综合国产精品一区| 欧美在线资源| 奶水喷射视频一区| 最新国产成人av网站网址麻豆| 欧美mv日韩mv国产网站| 亚洲国产婷婷| 在线视频精品一区| 欧美资源在线观看| 欧美xxx成人| 麻豆av福利av久久av| 欧美日本国产精品| 国产日本亚洲高清| 亚洲国产欧美一区二区三区同亚洲 | 欧美亚一区二区| 国产精品国产一区二区| 欧美日韩性生活视频| 欧美大片一区二区三区| 欧美私人啪啪vps| 国产综合久久久久久| 国产一区二区欧美| 亚洲精品国产视频| 欧美一级一区| 亚洲二区在线| 最新亚洲一区| 欧美亚洲免费高清在线观看| 欧美大片91| 国产欧美精品| 99国产一区二区三精品乱码| 欧美一区二区三区四区夜夜大片 | 欧美一区二区三区成人| 男人的天堂亚洲在线| 国产精品视频1区| 亚洲激情女人| 久久久久九九九| 久久亚洲图片| 在线亚洲一区| 麻豆精品传媒视频| 国产精品综合久久久| 国产一区二区久久精品| 一本一本久久a久久精品综合麻豆| 欧美专区在线观看一区| 亚洲精品一区久久久久久| av成人福利| 欧美一区二区三区成人 | 在线免费观看日本欧美| 午夜一区不卡| 亚洲欧洲视频| 狼人天天伊人久久| 国产日韩在线视频| 亚洲午夜精品国产| 久久er99精品| 亚洲最快最全在线视频| 欧美成人国产一区二区| 伊人久久婷婷| 亚洲深夜福利| 久久婷婷综合激情| 亚洲免费一级电影| 欧美午夜精品理论片a级按摩| 亚洲人www| 蜜臀av一级做a爰片久久| 亚洲精品在线免费观看视频| 麻豆91精品| 一区二区三区在线不卡| 久久久久高清| 欧美一区中文字幕| 国产欧美日韩免费| 欧美在线视频一区| 亚洲综合国产精品| 国产精品久久久久秋霞鲁丝| 亚洲色图制服丝袜| 日韩天堂av| 久久综合网色—综合色88| 国内精品一区二区| 久久久久国产免费免费| 欧美在线精品一区| 国内精品久久久久久久97牛牛| 久久精品官网| 99热免费精品| 欧美三日本三级三级在线播放| 中文av一区二区| 亚洲深夜福利| 国产精品亚洲成人| 久久精品人人爽| 久久精品视频在线观看| 国产精品www994| 性亚洲最疯狂xxxx高清| 午夜欧美视频| 国外成人在线视频| 午夜影院日韩| 午夜影院日韩| 伊人久久大香线蕉综合热线 | 欧美日韩日本国产亚洲在线 | 欧美国产日本在线| 欧美xxxx在线观看| 亚洲视频在线看| 亚洲在线观看视频| 国产综合色精品一区二区三区| 久久一二三国产| 麻豆精品视频| 在线综合+亚洲+欧美中文字幕| 一本综合久久| 国产在线不卡| 亚洲高清视频在线观看| 欧美日韩在线视频首页| 欧美在线观看你懂的| 久久久久国内| 好看的亚洲午夜视频在线| 欧美a级在线| 欧美日韩亚洲综合一区| 欧美在线看片| 欧美大片在线观看| 香蕉成人啪国产精品视频综合网| 欧美一区二区三区四区高清 | 免费试看一区| 亚洲一区二区三区精品动漫| 欧美一级理论片| 亚洲片国产一区一级在线观看| 一本久久a久久免费精品不卡| 国产婷婷精品| 亚洲欧洲一区二区三区| 国产日韩欧美在线视频观看| 亚洲高清不卡| 国产麻豆9l精品三级站| 亚洲国产第一| 国产午夜精品理论片a级大结局| 亚洲第一级黄色片| 国产欧美在线| 亚洲人成亚洲人成在线观看| 国产日韩欧美一区在线 | 久久久高清一区二区三区| 夜夜爽www精品| 久久精品视频导航| 亚洲夜间福利| 另类天堂av| 久久国产精品99精品国产| 欧美激情一区二区三区全黄| 夜夜嗨av一区二区三区 | 国产精品黄色在线观看| 欧美sm视频| 国产精品一二三四| 亚洲精品一区二区三| 亚洲电影欧美电影有声小说| 亚洲欧美国产高清va在线播| 99视频有精品| 蘑菇福利视频一区播放| 久久久久久久久久久久久女国产乱 | 麻豆精品视频在线| 国产精品视频免费观看| 亚洲欧洲精品天堂一级|