Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> Android特色開發之Google Map和桌面組件(3)

Android特色開發之Google Map和桌面組件(3)

編輯:中級開發

接下來還要為快捷方式設置名字、圖標、事件等屬性。Intent.EXTRA_SHORTCUT_NAME對應快捷方式的名字;Intent.EXTRA_SHORTCUT_ICON_RESOURCE對應快捷方式的圖標;Intent. EXTRA_SHORTCUT_INTENT對應快捷方式執行的事件。需要說明的是,android專門提供了 Intent.ShortcutIconResource.fromContext來創建快捷方式的圖標,最後通過setResult來返回,構建一個快捷方式,如代碼清單9-8所示。

     代碼清單9-8  第9章\Examples_09_05\src\com\yarin\android\Examples_09_05\Activity01.Java

     public class Activity01 extends Activity

     {

     public void onCreate(Bundle savedInstanceState)

     {

     super.onCreate(savedInstanceState);

     //要添加的快捷方式的Intent

     Intent addShortcut;

     //判斷是否要添加快捷方式

     if (getIntent().getAction().equals(Intent.ACTION_CREATE_SHORTCUT))

     {

     addShortcut = new Intent();

     //設置快捷方式的名字

     addShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,"發送郵件");

     //構建快捷方式中專門的圖標

     Parcelable icon = Intent.ShortcutIconResource.fromContext

     (this,R.drawable.mail_edit); 

     //添加快捷方式圖標

     addShortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,icon);

     //構建快捷方式執行的Intent

     Intent mailto=new  Intent(Intent.ACTION_SENDTO, Uri.parse

     ("mailto:[email protected]" ));

     //添加快捷方式Intent

     addShortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,mailto); 

     //正常

     setResult(RESULT_OK,addShortcut); 

     }

     else

     {

     //取消

     setResult(RESULT_CANCELED); 

     }

     //關閉

     finish(); 

     }

     }  

現在我們啟動模擬器,就可以在Shortcuts列表中找到所添加的快捷方式,將其添加到桌面,如圖9-21所示。

 

圖9-21  桌面快捷方式

9.4.2  實時文件夾

在android 1.5中,Live Folders無疑是一個備受關注的新功能。簡單地說,Live Folders就是一個查看你的手機中所有電子書、電子郵件、rss訂閱、播放列表的快捷方式,並且這些內容是實時更新的。比如你不再需要單獨打開電子郵件軟件查看郵件,打開通訊錄找聯系人等。Live Folders自帶了列出所有聯系人、所有有電話號碼的聯系人以及Starred聯系人的功能,我們還可以使用Live Folders API開發出更多的新穎應用。

由於Live Folders本身不存儲任何信息,都是以映射的方式查看其ContentProvider所指向的數據信息,並可以自定義顯示格式,所以當源數據發生改變後,Live Folders可以實時更新顯示內容。那麼在開發時,我們要確保所指定數據信息URI的ContentProvider支持實時文件夾的查詢。

其添加方式和添加快捷方式一樣,只是在選擇時要選擇“Folders”。本小節我們通過Live Folders調用電話本中的信息,當點擊其中一條信息時,便執行呼叫該聯系人的動作(本書所附代碼:第9章\ Examples_09_06)。

和創建快捷方式一樣,我們需要在Activity注冊時添加一個Action動作為android.intent.action. CREATE_LIVE_FOLDER的IntentFilter。代碼如下:

                 <intent-filter>

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

     <category android:name= "android.intent.category.DEFAULT" />

                 </intent-filter>

我們需要在程序中設置該實時文件夾的數據源、圖標、名字的信息。可以通過intent.setData方法來設置要讀取的數據源,該例中我們設置數據源為“content://contacts/live_folders/people”,即聯系人信息。其他信息的設置如表9-2所示。

表9-2  Live Folders的常用屬性

 

在設置圖標時,android專門提供了Intent.ShortcutIconResource.fromContext來設置實時文件夾的圖標。下面我們將實時文件夾添加到桌面(如圖9-22所示),運行效果如圖9-23所示。

 

圖9-22 “電話本”實時文件夾               

 

圖9-23  實時文件夾運行效果

下面需要在onCreate方法中將實時文件夾的相關信息裝入Intent對象,並通過setResult方法設置為結果Intent,最後調用finish方法結束Activity,把結果返回給Home應用程序,以添加實時文件夾,如代碼清單9-9所示。

     代碼清單9-9  第9章\Examples_09_06\src\com\yarin\android\Examples_09_06\Activity01.Java

     public class Activity01 extends Activity

     {

     public void onCreate(Bundle savedInstanceState)

     {

     super.onCreate(savedInstanceState);

     // setContentVIEw(R.layout.main);

     // 判斷是否創建實時文件夾

     if (getIntent().getAction().equals(LiveFolders.ACTION_CREATE_LIVE_FOLDER))

     {

     Intent intent = new Intent();

     // 設置數據地址

     intent.setData(Uri.parse("content://contacts/live_folders/

     people"));

     // 設置單擊之後的事件,這裡單擊一個聯系人後,呼叫

     intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT,

     new Intent(Intent.ACTION_CALL,Contacts.People.CONTENT_URI));

     // 設置實時文件夾的名字

     intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME,"電話本");

     // 設置實施文件夾的圖標

     intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON, Intent.

     ShortcutIconResource.fromContext(this,R.drawable.contacts));

     // 設置顯示模式為列表

     intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE,

     LiveFolders.DISPLAY_MODE_LIST);

     // 完成

     setResult(RESULT_OK, intent);

     }

     else

     {

     setResult(RESULT_CANCELED);

     }

     finish();

     }

     }

9.4.3  Widget開發

Widget是一種很小的應用程序,主要作為Web 2.0服務或互聯網內容的前端。Web設計人員與開發者可以使用Widget來創造最受歡迎的互聯網體驗。在android 1.5中加入了AppWidget framework框架,開發者可以使用該框架開發Widget,這些Widget可以拖到用戶的桌面並且可以交互。Widget可以提供一個full- featured aPPS的預覽,例如可以顯示即將到來的日歷事件,或者一首後台播放的歌曲的詳細信息。當Widget被拖到桌面上時,指定一個保留的空間來顯示應用提供的自定義內容。用戶可以通過這個Widget來和應用交互,例如暫停或切換歌曲。如果你有一個後台服務,可以按照你自己的Schedule更新你的 Widget,或者使用AppWidget framework提供一個自動的更新機制。

每個Widget就是一個BroadcastReceiver,它們用XML metadata來描述Widget的細節。AppWidget framework通過Broadcast intents和Widget通信, Widget的更新使用RemoteViews來發送。RemoteVIEws被包裝成一個layout和特定內容來顯示到桌面上。下面我們通過一個示例來學習Widget開發(本書所附代碼:第9章\Examples_09_07)。

首先需要在res\layout目錄下創建桌面組件的布局文件appwidget_provider.XML,用來顯示桌面布局,這裡我們創建一個TextVIEw用來顯示一段文字,如代碼清單9-10所示。

     代碼清單9-10  第9章\Examples_09_07\res\layout\appwidget_provider.XML

     <?XML version="1.0" encoding="utf-8"?>

     <TextVIEw XMLns:android="http://schemas.android.com/apk/res/android"

         android:id="@+id/appwidget_text"

         android:textColor="#ff000000"

         android:layout_width="wrap_content"

         android:layout_height="wrap_content"

     />

然後需要創建一個描述這個桌面組件屬性的文件,存放到res\XML文件夾下,如代碼清單9-11所示。

     代碼清單9-11  第9章\Examples_09_07\res\xmlappwidget_provider.XML

     <?XML version="1.0" encoding="utf-8"?>

     <appwidget-provider XMLns:android="http://schemas.android.com/apk/res/android"

         android:minWidth="100dp"

         android:minHeight="50dp"

         android:updatePeriodMillis="86400000"

         android:initialLayout="@layout/appwidget_provider"

         android:configure="com.yarin.android.Examples_09_07.Activity01"

         >

     </appwidget-provider>

其中android:minWidth和android:minHeight分別指定了桌面組件的最小寬度和最小高度,其值可以根據期望的單元格數量並使用前面介紹過的公式來計算(最小尺寸=(單元格數×74)?2),android:updatePeriodMillis是自動更新的時間間隔,android:initialLayout是Widget的界面描述文件。android:configure是可選的,如果你的Widget需要在啟動前先啟動一個Activity,則需要設定該項為你的Activity。這裡我們需要先輸入一段文字,然後顯示在Widget上。

然後要建立一個Widget,創建一個類,讓其繼承類AppWidgetProvider。在AppWidgetProvider中有許多方法,包括onUpdate(周期更新時調用)、onDeleted(刪除組件時調用)、onEnabled(當第一個組件創建時調用)、 onDisabled(當最後一個組件刪除時調用),如代碼清單9-12所示。

代碼清單9-12  第9章\Examples_09_07\src\com\yarin\android\Examples_09_07\ExampleAppWidget- Provider.Java

     public class ExampleAppWidgetProvider extends AppWidgetProvider

     {

     //周期更新時調用

     public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[]

     appWidgetIds)

     {

     final int N = appWidgetIds.length;

     for (int i = 0; i < N; i++)

     {

     int appWidgetId = appWidgetIds[i];

     String titlePrefix=Activity01.loadTitlePref(context,appWidgetId);

     updateAppWidget(context, appWidgetManager, appWidgetId,

     titlePrefix);

     }

     }

     //當桌面組件刪除時調用

     public void onDeleted(Context context, int[] appWidgetIds)

     {

     //刪除appWidget

     final int N = appWidgetIds.length;

     for (int i = 0; i < N; i++)

     {

     Activity01.deleteTitlePref(context, appWidgetIds[i]);

     }

     }

     //當AppWidgetProvider提供的第一個組件創建時調用

     public void onEnabled(Context context)

     {

     PackageManager pm = context.getPackageManager();

     pm.setComponentEnabledSetting(new ComponentName("com.yarin.android.

     Examples_09_07", ".ExampleBroadcastReceiver"),

     PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

     PackageManager.DONT_KILL_APP);

     }

     //當AppWidgetProvider提供的最後一個組件刪除時調用

     public void onDisabled(Context context)

     {

     PackageManager pm = context.getPackageManager();

     pm.setComponentEnabledSetting(new ComponentName("com.yarin.

     android.Examples_09_07", ".ExampleBroadcastReceiver"),

     PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

     PackageManager.DONT_KILL_APP);

     }

     //更新

     static void updateAppWidget(Context context, AppWidgetManager

     appWidgetManager, int appWidgetId, String titlePrefix)

     {

     //構建RemoteVIEws對象來對桌面組件進行更新

     RemoteViews views = new RemoteVIEws(context.getPackageName(),

     R.layout.appwidget_provider);

     //更新文本內容,指定布局的組件

     views.setTextVIEwText(R.id.appwidget_text, titlePrefix);

     //將RemoteVIEws的更新傳入AppWidget進行更新

     appWidgetManager.updateAppWidget(appWidgetId, vIEws);

     }

     }

其中,在updateAppWidget方法中我們構建了一個RemoteViews對象來對桌面組件進行更新,通過 setTextVIEwText方法來更新一個文本的顯示,然後通過updateAppWidget方法來將更新提供給AppWidget使其更新到桌面。在onDisabled和onEnabled方法中我們用ComponentName來表示應用程序中某個組件的完整名字。

最後,創建一個BroadcastReceiver類來接收更新的信息,在收到更新的信息之後就更新這個桌面Widget組件,如代碼清單9-13所示。

代碼清單9-13  第9章\Examples_09_07\src\com\yarin\android\Examples_09_07\ExampleBroadcast- Receiver.Java

     public class ExampleBroadcastReceiver extends BroadcastReceiver

     {

     public void onReceive(Context context, Intent intent)

     {

     //通過BroadcastReceiver來更新AppWidget

     String action = intent.getAction();

     if (action.equals(Intent.ACTION_TIMEZONE_CHANGED) || action.equals

     (Intent.ACTION_TIME_CHANGED))

     {

     AppWidgetManager gm = AppWidgetManager.getInstance(context);

     ArrayList<Integer> appWidgetIds = new ArrayList<Integer>();

     ArrayList<String> texts = new ArrayList<String>();

     Activity01.loadAllTitlePrefs(context, appWidgetIds, texts);

     //更新所有AppWidget

     final int N = appWidgetIds.size();

     for (int i = 0; i < N; i++)

     {

     ExampleAppWidgetProvider.updateAppWidget(context,

     gm, appWidgetIds.get(i), texts.get(i));

     }

     }

     }

     }

接下來,處理android:configure指定的類,用來輸入信息,在該類中我們監聽這個按鈕,當點擊按鈕之後,創建一個 AppWidgetManager實例,然後調用ExampleAppWidgetProvider.updateAppWidget方法來更新這個 Widget,通過以下代碼可以取得一個AppWidgetManager實例:

     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

注意,還需要在androidManifest.XML中注冊AppWidget、BroadcastReceiver和用來輸入信息的Activity,如代碼清單9-14所示。

     代碼清單9-14  第9章\Examples_09_07\androidManifest.XML

     <?XML version="1.0" encoding="utf-8"?>

     <manifest XMLns:android="http://schemas.android.com/apk/res/android"

           package="com.yarin.android.Examples_09_07"

           android:versionCode="1"

           android:versionName="1.0">

         <application android:icon="@drawable/icon" android:label="@string/app_name">

             <receiver android:name=".ExampleAppWidgetProvider">

                 <meta-data android:name="android.appwidget.provider"

                         android:resource="@XML/appwidget_provider" />

                 <intent-filter>

                     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

                 </intent-filter>

             </receiver>

             <activity android:name=".Activity01">

                 <intent-filter>

                     <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />

                 </intent-filter>

             </activity>

             <receiver android:name=".ExampleBroadcastReceiver" android:enabled="false">

                 <intent-filter>

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

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

                 </intent-filter>

             </receiver>

         </application>

         <uses-sdk android:minSdkVersion="5" />

     </manifest>

下面將該Widget添加到桌面上,和添加快捷方式一樣,如圖9-24所示,然後輸入要顯示的文字,如圖9-25所示,點擊“確定”按鈕之後,桌面即顯示我們輸入的信息,如圖9-26所示。

            

圖9-24  添加Widget到桌面   

 

圖9-25  輸入要顯示的信息         

 

圖9-26  桌面顯示Widget


下面的內容包括9.3 Google Map和9.4 桌面組件兩個部分:

9.3.1  Google Map概述

9.3.2  准備工作

9.3.3  Google Map API的使用

9.3.4  定位系統

9.4.1  快捷方式

9.4.2  實時文件夾

9.4.3  Widget開發

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.Net/L_serein/archive/2011/01/07/6122116.ASPx

 

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