標籤:android style blog http io color ar os 使用
如有錯漏請不吝拍磚指正,轉載請註明出處,很感謝
案頭便簽軟體是android上經常使用軟體的一種,比方比較早的Sticky Note,就曾很流行,
Sticky Note的介紹能夠參見 http://www.tompda.com/c/article/11778/
而實際上使用android平台對widget開發的支援,案頭便簽類軟體是很易於開發的。
本文通過逐步實現一個簡單的案頭便簽軟體,和大家分享進行widget開發的過程和方法。
1.MyNote的終於實現效果
為了提起大家閱讀本文的興趣,先介紹一下終於實現的效果。
首先能夠通過案頭添加我們的MyNote小組件,例如以所看到的:
圖中的“我的便簽”就是我們之後將要開發的便簽程式。
點擊後啟動加入日誌介面,例如以所看到的:
輸入便簽內容後,能夠點擊以下所列的四種表徵圖之中的一個作為便簽表徵圖。
比方點擊第一個後,案頭上就會加入一個便簽:
點擊案頭上的便簽,能夠再次對便簽內容進行改動,並更換表徵圖。
案頭上能夠同一時候存在多個便簽,並能夠分別進行改動。
例如以所看到的,我們將剛才建立的便簽的表徵圖改動一下,並新增了一個便簽:
每一個便簽的內容都是分別獨立儲存的,能夠隨時點擊案頭表徵圖改動。
2.開發方式
開發的目的和追求的效果已經十分清楚了,首先我們確定一下開發方式。
在本文中,將採取一種漸進式的開發,也就是說不會一口氣從頭做到尾。
而是分為好幾個階段。每一個階段都完畢一定的目標,然後下個階段添加很多其它的功能,
每一個階段都離終於目標更進一步,OK,你能夠說這是一次敏捷開發 :)
第一個階段,首先我們會搭建一個widget原型程式,
它是全然能夠執行的,能夠建立案頭widget。
第二個階段,我們改進 widget 配置Activity 部分的實現
使其具備建立便簽的功能
第三個階段,我們改進 widget 點擊響應部分的實現,
使其具備改動便簽的功能
3.搭建widget原型程式
本節我們會做一個最簡單的widget程式原型,可是它是能夠執行的。
一般來說 widget 程式由下面部分組成:
a. AppWidgetProvider 的實現
b. widget外觀布局定義檔案
c. 新增widget時的配置Activity的實現(可選)
d. widget 參數設定檔
下面分別解說
a. AppWidgetProvider 的實現
首先我們建立一個androidproject起名為MyNote,然後改動 MyNote.java 的代碼,
使MyNote繼承自 AppWidgetProvider ,並重寫 onUpdate 和 onDeleted 方法。
當中onUpdate 會在widget建立及被更新時調用, onDeleted 會在widget被刪除時調用。
眼下我們不須要在這裡實現不論什麼功能,僅僅是簡單的記錄日誌以便我們觀察其執行,編寫好的代碼例如以下:
package com.silenceburn;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.Context;import android.util.Log;public class MyNote extends AppWidgetProvider {/** Called when the activity is first created. */final String mPerfName = "com.silenceburn.MyColorNoteConf";@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {// TODO Auto-generated method stubfinal int N = appWidgetIds.length;for (int i = 0; i < N; i++) {int appWidgetId = appWidgetIds[i];Log.i("myLog", "this is [" + appWidgetId + "] onUpdate!");}}@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {// TODO Auto-generated method stubfinal int N = appWidgetIds.length;for (int i = 0; i < N; i++) {int appWidgetId = appWidgetIds[i];Log.i("myLog", "this is [" + appWidgetId + "] onDelete!");}}}
b. widget外觀布局定義檔案
我們須要為widget編寫一個外觀布局檔案,在本示範範例中,布局很easy,僅僅須要一個imageView就可以
編寫好的 my_note_widget.xml 檔案例如以下:
<?xml version="1.0" encoding="utf-8"?><ImageView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/my_widget_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/sketchy_paper_008" android:clickable="true"/>
這裡用到了一個外部圖片 sketchy_paper_008.png,來源於網路,感謝圖片原作者。
能夠到 http://dryicons.com/free-icons/preview/sketchy-paper-icons/ 打包下載。
( 注意下載下來的包中的檔案名稱可能和我寫的程式中的命名有差異,請注意自行調整。)
c. 新增widget時的配置Activity的實現(可選)
android平台為widget提供一個配置介面的功能,我們能夠自己定義一個Activity,
在widget參數設定檔裡配置好相關參數後,此Activity會在使用者新增widget時自己主動調用。
一般來說,這個配置介面的作用是使用者建立widget時,讓使用者配置widget的一些屬性,比方顏色、大小等等。
可是在我們的這個示範範例程式中,我們用它來當做建立便簽的地方!
只是本節僅僅是先實現一個原型程式,所以臨時不做處理,我們僅僅是建立一個Activity就可以。
建立名為MyNoteConf的Activity,重寫onCreate方法,在OnCreate方法中,
因為這個Activity是由系統在新增widget時自己主動調用的,
所以我們能夠用getIntent擷取到傳入的widgetId。能夠推斷其是否是一個有效widgetId,
最後我們必須返回一個RESULT_OK的Intent,並結束當前Activity,系統才會覺得配置成功,在案頭上放置這個widget。
假設返回RESULT_CANCELED,系統會覺得配置失敗,終止widget的建立過程。
編寫好的MyNoteConf的代碼例如以下:
package com.silenceburn;import android.app.Activity;import android.appwidget.AppWidgetManager;import android.content.Intent;import android.os.Bundle;import android.util.Log;public class MyNoteConf extends Activity {int mAppWidgetId;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);Log.i("myLog"," on WidgetConf ... ");setResult(RESULT_CANCELED);// Find the widget id from the intent.Intent intent = getIntent();Bundle extras = intent.getExtras();if (extras != null) {mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);}// If they gave us an intent without the widget id, just bail.if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {finish();}// return OKIntent resultValue = new Intent();resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,mAppWidgetId);setResult(RESULT_OK, resultValue);finish();}}
d. widget 參數設定檔
最後我們須要編寫一個widget參數設定檔,將布局檔案、配置Activity關聯起來。
我們在res下建立檔案夾xml,在xml檔案夾下新增檔案 my_note_widget.xml ,編寫例如以下:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:minWidth="72dp" android:minHeight="72dp"android:updatePeriodMillis="86400000" android:initialLayout="@layout/my_note_widget"android:configure="com.silenceburn.MyNoteConf"></appwidget-provider>
當中 minWidth minHeight 用來指定widget的大小,假設我們僅僅佔用一個格子,也就是俗稱的1X1,
那麼72dp的長寬是android平台推薦的一個最佳實務值。
然後用 initialLayout 參數關聯了我們編寫好的 layout 檔案,
用 configure 參數關聯了我們編寫好的配置用Activity:MyNoteConf,
此外另一個參數 updatePeriodMills 指定widget的重新整理周期,
從省電角度考慮,一般都把此值設定的比較大,假設一定要對widget做周期性的事情,能夠使用AlarmManager。
至此全部widget的要素都已經準備好,我們執行一下來看看吧。
4.執行widget原型程式
為了執行widget,我們還須要改動一下 AndroidManifest.xml 來聲明我們的widget。
聲明一個receiver,過濾 android.appwidget.action.APPWIDGET_UPDATE ,
而且用metadata關聯到我們自己編寫的 appWidgetProvider 實現。
聲明一個activity關聯到我們的配置類 MyNoteConf,過濾 android.appwidget.action.APPWIDGET_CONFIGURE。
最後改動一下應用表徵圖,此表徵圖會出如今系統的新增widget列表中。
編寫好的AndroidManifest.xml 例如以下:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.silenceburn" android:versionCode="1" android:versionName="1.0"><application android:icon="@drawable/sketchy_paper_008"android:label="@string/app_name"><receiver android:name=".MyNote"><intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter><meta-data android:name="android.appwidget.provider"android:resource="@xml/my_note_widget" /></receiver><activity android:name=".MyNoteConf"><intent-filter><action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /></intent-filter></activity></application></manifest>
至此原型程式所有開發完畢,執行一下看看效果吧!
在案頭上長點,能夠選擇我們剛剛寫的原型widget“MyNote”了,
選擇後出現我們定義的配置介面MyNoteConf,
可是因為我們在onCreate中finish了,所以是一閃而過的。
之後MyNote就出如今案頭上了。
我們能夠隨便拖動它,或者把它丟進垃圾箱,觀察一下日誌輸出。
上半部分總結
上半部分主要完畢了一個widget的原型,它沒有不論什麼業務功能,
可是已經是一個能夠執行的骨架了。
在下半部分中我們為它加入血和肉,讓它真正具備業務功能。
希望大家喜歡這樣的先寫骨架,再逐步豐富的開發方式 :)
下半部分已出爐 android widget 開發執行個體 : 案頭便簽程式的實現具體解釋和原始碼 (下)
地址是:http://blog.csdn.net/silenceburn/archive/2010/12/23/6094705.aspx
android widget 開發執行個體 : 案頭便簽程式的實現具體解釋和原始碼 (上)