編輯:中級開發
接下來還要為快捷方式設置名字、圖標、事件等屬性。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
簡介: 有幾個網站從事一些非盈利服務,提供一些可輕松設置和使用的表單來進行民意測驗和數據收集。本教程介紹一個簡單的架構來為 android 設計類似的應用程
很多開發者不知道ListVIEw列表控件的快速滾動滑塊是如何啟用的,這裡android開發網告訴大家,輔助滾動滑塊只需要一行代碼就可以搞定,如果你使用XML布局只需要在
簡介: HTML 5 針對移動 Web 應用程序引入了大量新特性,其中包括一些可視化特性,它們通常會帶來強烈的視覺沖擊。Canvas 是最引人注目的新 UI
Android ANR這個錯誤大家並不陌生,但是從Android 2.2開始出錯的ANR信息會自動上傳給Google進行系統分析改進,當然了你的應用ANR錯誤其實保存在