iT邦幫忙

DAY 11
3

以「寶寶聯絡簿」為例,適合 Android 初學者的學習筆記系列 第 11

寶寶生活記錄 App (Day11 Android Studio 的 Auto Import 和 Implicit Intent 初探)

昨天我們透過修改 /res/menu/calendar.xml 新增了三個選項,然而這三個選項點選後都沒有反應,今天我們便要來討論「選項的實作」,首先我們討論「寄信給開發者」這個選項的實作,不過在撰寫程式碼之前,筆者要先介紹 Android Studio 的「Auto Import」功能,有使用過 ADT Bundle (Eclipse IDE with built-in ADT) 的使用者可能都知道 Eclipse 有一個很方便的快速鍵 Ctrl + Shift + o (MAC 系統為 command + shift + o),讓程式可自動產生相對應的 import 敘述,Android Studio 是否也有類似的功能呢?答案示肯定的,於 Android Studio 的 Menu Bar 點選 Android Studio -> Preferences,接著會出現如下圖的視窗:

點選 Editor -> Auto Import,上圖是筆者的設定,有了上面的設定,當讀者於自己的 Android Studio 貼上筆者的程式碼時,就會執行 Auto Import。

現在我們終於可以開始討論「寄信給開發者」這個選項的實作,程式碼如下所示:

1  public boolean onOptionsItemSelected(MenuItem item) {
2    switch (item.getItemId()) {
3    case R.id.action_addbaby:
4      return true;
5    case R.id.action_babylist:
6      return true;
7    case R.id.action_mailtodeveloper:
8      mailToDeveloper();
9      return true;
10   }
11   return super.onOptionsItemSelected(item);
12 }
13 
14 private void mailToDeveloper() {
15   try {
16     Uri uri = Uri.parse("mailto:kigurumi.shia@gmail.com");
17     Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
18
19     PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
20     String subject = getString(R.string.app_name) + " (" + pInfo.versionName + ")";
21     intent.putExtra(Intent.EXTRA_SUBJECT, subject);
22     startActivity(intent);
23   } catch (Exception e) {
24     Toast.makeText(this, R.string.mailfail, Toast.LENGTH_SHORT).show();
25   }
26 }

mailToDeveloper 這個 Method 裏面用到許多 Android 提供的類別,如 Intent, PackageInfo 等,讀者若剛剛有設定好「Auto Import」,那麼可發現相關的 Import 敘述會自動產生。在解說這段程式碼之前,我們先看一下執行的結果,點選「寄信給開發者」後,由於筆者的手機內有兩個郵件 App,因此先跳出一個對話框,要您選擇使用哪個 App 開啟,選擇了 Gmail 後就進入寄送的畫面:

果筆者的手機只有一個郵件 App (假設為 Gmail),那麼就會直接進入 Gmail 的編寫新信畫面 (Activity),也就是說點選「寄信給開發者」後,會啟動一個 Activity,接下來就要說明如何啟動一個新的 Activity。

啟動 Activity 的方法很簡單,只要呼叫 Context 類別的 startActivity 這個 Method 就可以了,在第 22 行,由於 CalendarActivity 繼承了 Activity,其又繼承了 Context,因此我們可以直接呼叫。從程式碼我們知道 startActivity 需要一個 Intent 物件 當參數,程式碼 16 ~ 21 行就是在準備這個 Intent 物件,Intent 有兩種:明確的 Intent (Explicit Intent) 和不明確的 Intent (Implicit Intent) [1]。

Explicit Intent 會明確指定它想要啟動的 Activity (正確的說,是指定它想要啟動的 Component,Component 可能是 Activity, Broadcast Receiver 或 Service,筆者期盼自己有機會在這個系列中介紹到 Broadcast Receiver 和 Service,有興趣的讀者亦可參閱筆者的書籍 [2]),通常Explicit Intent 會用於同一個 App 內 Activities,關於Explicit Intent 的範例,之後才會介紹。

Implicit Intent 通常用於不同 App 間 Activity 的相互啟動,以「寄信給開發者」為例,郵件 App 跟我們的 App 是不同的 App,因此需使用 Implicit Intent,Implicit Intent 是透過 ACTION 來指定它的意圖(它想執行什麼),當 Android 系統收到這個 Implicit Intent,Android 會檢查它的 Activity List,找出可以幫忙執行其意圖的 Activity,並啟動那個 Activity,以「寄信給開發者」為例,我們所使用的建構子為:Intent(String action, Uri uri),ACTION 是用一個字串常數來表示,程式中填入的常數Intent.ACTION_SENDTO,其常數值為”android.intent.action.SENDTO”,從參考文件[1],我們亦可知道其作用是「Send a message to someone specified by the data.」,程式第 16 行,我們設定了一個 data Uri,裏面設定了收件人的 Email 信箱,程式 19 ~ 21 行是設定信件的主旨,其中第 19 行是為了取得 App 的版本,如此我們就能知道使用者是在使用哪個版本的 App,將 Intent 設定好後,就可以呼叫 startActivity 來啟動 Activity,由於 Android 系統發現有兩個 App 能夠處理這個 Implicit Intent,因此才會開啟一個對話框,要我選擇要使用哪個 App 開啟。如果沒有 App 能夠處理我們所指定的 ACTION,會產生例外,此時應用程式會利用 Toast 顯示一個錯誤訊息給使用者,關於 Toast,讀者可自行參閱 Toast 類別的說明文件 [3]。

以上就是「寄信給開發者」這個選項的實作細節,明天筆者還會針對 Implicit Intent 做更深入的探討。

參考資料

[1] Intent | Android Developers, http://developer.android.com/reference/android/content/Intent.html

[2] 林致宇, Android程式設計入門與應用(附範例光碟), 全華出版社, ISBN: 9789572194126, http://www.opentech.com.tw/search/bookinfo.asp?isbn=9789572194126&companyID=04383129

[3] Toast | Android Developers, http://developer.android.com/reference/android/widget/Toast.html


上一篇
寶寶生活記錄 App (Day10 選單的製作)
下一篇
寶寶生活記錄 App (Day12 Implicit Intent 深入探討:如何寫一個假的郵件 App)
系列文
以「寶寶聯絡簿」為例,適合 Android 初學者的學習筆記30

尚未有邦友留言

立即登入留言