App Widget的更新方法介紹_第1頁
App Widget的更新方法介紹_第2頁
App Widget的更新方法介紹_第3頁
App Widget的更新方法介紹_第4頁
App Widget的更新方法介紹_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、App Widget的更新方法介紹Widget是一種小巧但是功能強大的程序,使用戶能夠方便快捷的獲取信息,在 PC上被廣泛的 使用,現(xiàn)在隨著OPhone的推出,widget也進入到了手機領(lǐng)域, 為用戶帶來了方便的同時也為開發(fā)者實現(xiàn)更多很酷想法的可能。在OPhone中有 兩種widget開發(fā)方式,一種是以HTML+CSS+JavaScript的開發(fā)方式,另一種是 沿用Android平臺的開發(fā)方式,本文介紹的是后面一種,在OPhone平臺上開發(fā) App widgetowidget 一般開發(fā)方式介紹下面以編寫一個時鐘的小程序來介紹如何編寫widget。創(chuàng)建一個類,讓其繼承類 AppWidgetPro

2、vider,在 AppWidgetProvider 類 中有許多的方法,例如 onDelete(Context, int),onEnable(Context)等等, 一般情況下我們紙需要重寫 onUpdate(Context, AppWidgetManager, int)這 個方法就可以了,這個方法是當(dāng)觸發(fā)器更新widget時候執(zhí)行的操作。在項目的AndroidMenifest.xml文件中添加一個receiver標(biāo)簽,讓其指向 前面創(chuàng)建的AppWidgetProvider子類,內(nèi)容如下:intent-filter中過濾了 APPWIDGET_UPDATE事件,這個事件是由系統(tǒng)觸發(fā)的更 新事件

3、,每個widget必須包含這個事件;meta-data標(biāo)簽描述的是widget的配 置文件指向,該文件描述了 widget的一些基本信息。編寫widget的provider文件信息,本例中該文件名叫做 widget_setting.xml,開發(fā)者可以隨便取名,只要在AndroidMenifest.xml中寫 正確就行。minWidth和minHeight是widget的最小寬度和高度,這個值是一個參考值,系 統(tǒng)會根據(jù)實際情況進行改變,initialLayout屬性指明了 widget的視圖布局文 件,updatePeriodMillis屬性是widget每隔多久更新一次的時 間,單位為毫秒。接

4、下來就是界面布局,在這個示例中只需要一個TextView控件就可以,代 碼如下:準(zhǔn)備工作完畢,接下來完善繼承自AppWidgetProvider的自定義類,重寫onUpdate(Context, AppWidgetManager,int)函數(shù),代碼如下:package com.dt.time;2.import java.util.Date;4.import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.Context;import andr

5、oid.widget.RemoteViews;9.public class widget extends AppWidgetProvider (11.Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int a ppWidgetIds) (/ TODO Auto-generated method stubsuper.onUpdate(context, appWidgetManager, appWidgetIds);16./1.獲取當(dāng)前時間Date now = new Date();S

6、tring strNow = now.toLocaleString();/2.獲取 RemoteViews 對象RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main) ;/3.顯示時間到widgetviews.setTextViewText(R.id.text, strNow);/4.更新 widgetappWidgetManager.updateAppWidget(appWidgetIds, views);之后運行寫好的widget查看下成果,widget的啟動與普通程序不同,它不會在 程序列表

7、中顯示,而是要長按桌面在彈出的列表中選擇Widgets項目,之后選擇 本示例time。widget的擴展更新方法在上例中widget更新是通過定時方式實現(xiàn)的,在普通情況下這種更新方式已經(jīng) 足夠了,但是對于某些應(yīng)用使用定時方式更新顯得就不夠用了。比如短信 提示, 當(dāng)有新的短信到來時我們希望能夠?qū)崟r的更新widget,如果還是用定時更新顯 然是不行的,那么能不能讓widget接受除appwidget_update之外的系統(tǒng)消息 呢?答案是可以的。仔細(xì)查看下文檔后可以發(fā)現(xiàn),widget只是一個receiver,既然是receiver那么 也就可以接受所有的系統(tǒng)消息了,接下來使用短信提醒示例來演示wi

8、dget接受 系統(tǒng)其他消息的方式,本例中將只前一示例進行修改。修改AndroidMenifest.xml文件,向其中添加vider.Telephony.SMS_RECEIVED 監(jiān)聽事件,代碼如下:添加了這個短信監(jiān)聽事件后,我們就已經(jīng)向widget添加了監(jiān)聽短信的功能了, 實際操作非常簡單。接下來需要添加一個閱讀短信的權(quán)限,在AndroidMenifest.xml中任意位置添加 然后還需要修改下widget_setting.xml文件,將其中的 updatePeriodMillis屬性設(shè)為0,也就是不定時更新,這樣可以展示這個widget 是實時更新的。之后修改AppWidgetProvide

9、r的子類,使其將短信內(nèi)容顯示到widget上。 在本示例中我們將不再修改onUpdate(Context, AppWidgetManager,int 口)函 數(shù),而是重寫 onReceive(Context context, Intent intent)函數(shù),這個函數(shù)其 實能夠?qū)崿F(xiàn)包括onUpdate在內(nèi)的所有函數(shù)功能,代碼如下:package com.dt.time;2.import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.Comp

10、onentName;import android.content.Context;import android.content.Intent;import android.widget.RemoteViews;9.public class widget extends AppWidgetProvider (11.Overridepublic void onReceive(Context context, Intent intent) (/ TODO Auto-generated method stubsuper.onReceive(context, intent);16./1.獲取 Remot

11、eViews 對象RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main) ;/2.顯示新消息提醒views.setTextViewText(R.id.text, New message!);/3.更新 widgetAppWidgetManager appWidgetManager = AppWidgetManager.getlnstance(context);appWidgetManager.updateAppWidget(new ComponentName(context, widget.cla

12、ss), views);代碼與上一示例差別不多,唯一有區(qū)別的地方便是appWidgetManager的實例化, 在上一示例中由于onUpdate()方法中有一個參數(shù) 是appWidgetManager因此我 們不需要單獨實例化該對象,但是在onReceive()方法中并沒有這個參數(shù),因此 我們需要實例化一個appWidgetManager,通過AppWidgetManager.getInstance(Context)方法就可以獲得一個appWidgetManager 實例。當(dāng)然由于 onReceive()函數(shù)還缺少 appWidgetIds 這個 參數(shù),因此我們也不能直接使用updateApp

13、Widget (int appWidgetIds, RemoteViews views)這個函數(shù),而要改用 updateAppWidget (ComponentName provider, RemoteViews views)這個函數(shù),其中 provider 參數(shù)是一個 ComponentName類型的值,簡單的說就是組件名,通過實例化一個組件便可;widget的進階更新方法上面的示例已經(jīng)讓widget可以實時的更新內(nèi)容,但是如果要顯示電池電量的話, 上面的方法還是不行的,為什么呢?原來android中并沒有為獲 取電池信息設(shè) 計單獨的api,必須注冊為一個service才能獲取。按照上面的思

14、路那也簡單, 只要我們寫個service,然后在系統(tǒng)中廣播更新消息就可以了;但是根據(jù)文檔 中的說明,要獲取電池信息的service必須是通過Context.registerReceiver() 這個函數(shù)來注冊一個監(jiān)聽電池變化的事件才能獲取,這樣一來對我們設(shè)計就帶 來了麻煩。解決的方法倒也很簡單,就是單獨寫個service在里面注冊一個監(jiān)聽事件,當(dāng)電 池電量發(fā)生變化的時候就更新widget,看起來與我們上面的例子很相似,就是 多了一個service,但是這里還有一個不同的是,我們更新widget的方法不再 是在onUpdate()或者是onReceive中進 行,而是在service中直接對wi

15、dget 修改,似乎跟文檔上說的出入很大,但是看看上面顯示短信的例子我們會發(fā)現(xiàn), 在那個示例中似乎widget的 更新與appWidgetProvider已經(jīng)沒有什么關(guān)系了, 我們即沒有從參數(shù)獲得appWidgetManager實例,也沒從參數(shù)中獲得 appWidgetIds,一切都是我們自己新建了一個,因而不再widget更新的方法完 全是可行的。下面來介紹下代碼:(1)本示例中沿用第二個示例的代碼,添加一個名叫service.java類package com.dt.time;2.import android.app.Service;import android.appwidget.AppW

16、idgetManager;import android.content.BroadcastReceiver;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Color;import android.os.IBinder;import android.widget.RemoteViews;13.public class mServi

17、ce extends Service (15.16.Overridepublic void onStart(Intent intent, int startId) (/ TODO Auto-generated method stubsuper.onStart(intent, startId);registerReceiver(this.mBR, new IntentFilter(Intent.ACTION_BATTERY_CHANGED) ;22.24.聲明一個廣播接受對象,用接受電池信息private BroadcastReceiver mBR = new BroadcastReceiver

18、() (27.Overridepublic void onReceive(Context context, Intent intent) (/ TODO Auto-generated method stub31.if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction()這里添加相關(guān)處理動作bLevel = intent.getIntExtra(level”, 0); /獲取當(dāng)前電量36.String value = String.valueOf(bLevel) + %; /顯示電量的文字38.AppWidgetManager awm = AppWidgetManager.getInstance(context);RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.main);41.views.setTextViewText(R.id.text, value);43.awm.updateAppWidget(new Compone

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論