• <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>

            life02

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              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,而且繼續用SMS方面的例子來闡述。本文的主要內容如下:

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

            例子(需求)描述

            用手機發過SMS的人都知道:

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

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

            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的點擊事件

            在上面準備工作做完之后,我們需要監聽btnContact的點擊事件,當用戶點擊btnContact時,跳轉顯示通訊錄界面,當用戶選擇一個聯系人之后,返回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并提取數據;然后去查詢通訊錄數據庫,取出數據并填充到STEP1中定義的ListView;最后,還需要添加當用戶選擇一個聯系人的事件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、解析通訊錄返回的數據

            從通訊錄活動返回之后,我們從返回的Intent中提取數據并填充到填寫電話號碼的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數據庫的權限

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

            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。現在我們分析一下這個Intent Filter:

            • <actionandroid:name="android.intent.action.PICK"/>使用戶能夠可以在通訊錄列表中選擇一個,然后將選擇的聯系人的 URL返回給調用者。
            • <categoryandroid:name="android.intent.category.DEFAULT"/>這是默認的category,如果不知道category系統會自動加上。這個屬性是讓使其能夠被像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活動定是真個程序的入口并且 TextMessage會列舉在Launcher即啟動列表中。

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

            圖1、主界面

            圖2、點擊contact按鈕之后

            圖3、選擇一個聯系人之后

            總結

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

            • Cursor類它跟我們平時用的數據庫中的游標類似,它提供了對從數據庫返回的結果的隨機讀寫操作。如我們例子中用到的,通過 managedQuery方法 查詢數據庫并返回結果,然后利用 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方法:根據指定的URI路徑信息返回包含特定數據的Cursor對象,應用這個方法可以使Activity接管返回數據對象的生命周期。參數:
              URI: Content Provider 需要返回的資源索引
              Projection: 用于標識有哪些columns需要包含在返回數據中
              Selection: 作為查詢符合條件的過濾參數,類似于SQL語句中Where之后的條件判斷
              SelectionArgs: 同上
              SortOrder: 用于對返回信息進行排序
            • SimpleCursorAdapter允許你綁定一個游標的列到ListView上,并使用自定義的layout顯示每個項目。SimpleCursorAdapter的創建,需要傳入當前的上下文、一個layout資源,一個游標和兩個數組:一個包含使用的列的名字,另一個(相同大小)數組包含View中的資源ID,用于顯示相應列的數據值。
            posted on 2011-12-22 09:11 life02 閱讀(2136) 評論(0)  編輯 收藏 引用 所屬分類: Android開發
            久久久久亚洲AV成人网人人网站| 9999国产精品欧美久久久久久| 久久国产精品视频| 亚洲国产精品久久久久网站| 国产91久久精品一区二区| 亚洲&#228;v永久无码精品天堂久久| 久久久久亚洲精品日久生情| 久久精品国产亚洲av麻豆蜜芽| 久久精品国产亚洲AV蜜臀色欲| 久久国产精品久久| 久久久久人妻一区二区三区vr| 久久无码国产| 国产真实乱对白精彩久久| 欧美久久亚洲精品| 久久w5ww成w人免费| 久久国产香蕉视频| 国产成人久久精品激情| 综合网日日天干夜夜久久| 伊人色综合久久天天人守人婷| 久久亚洲国产精品五月天婷| 久久精品国产亚洲αv忘忧草| 国产AⅤ精品一区二区三区久久| 亚洲色大成网站www久久九| 亚洲色婷婷综合久久| 午夜精品久久影院蜜桃| 久久亚洲国产中v天仙www| 久久午夜电影网| 久久婷婷国产综合精品| AV无码久久久久不卡网站下载| 亚洲国产成人精品无码久久久久久综合| 亚洲AV无码成人网站久久精品大| 日韩av无码久久精品免费| 久久国产香蕉视频| 老司机国内精品久久久久| 久久综合噜噜激激的五月天| 蜜桃麻豆www久久国产精品| 国产一级做a爰片久久毛片| 久久久久亚洲精品天堂| 久久er99热精品一区二区| 久久久亚洲欧洲日产国码aⅴ| 久久亚洲精品人成综合网|