android widget 開發執行個體 : 案頭便簽程式的實現具體解釋和原始碼 (上)

來源:互聯網
上載者:User

標籤: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 開發執行個體 : 案頭便簽程式的實現具體解釋和原始碼 (上)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.