如何開發(fā)APP Widget?相信大部分人都還沒學(xué)會(huì)這個(gè)技能,為了讓大家學(xué)會(huì),給大家總結(jié)了以下關(guān)于開發(fā)APP Widget的步驟內(nèi)容,話不多說,一起往下看吧。
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供瑪沁網(wǎng)站建設(shè)、瑪沁做網(wǎng)站、瑪沁網(wǎng)站設(shè)計(jì)、瑪沁網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、瑪沁企業(yè)網(wǎng)站模板建站服務(wù),10多年瑪沁做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
1、繼承AppWidgetProvider類,
public class MyWidget extends AppWidgetProvider{ <!-- 每一個(gè)Widget放置到桌面上時(shí)調(diào)用,每一次updatePeriodMillis時(shí)間到了之后也會(huì)被調(diào)用--> public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) <!-- 移除widget時(shí)調(diào)用--> public void onDeleted(Context context, int[] appWidgetIds) <!-- 不管添加多少個(gè)widget,都只會(huì)調(diào)用一次 --> public void onEnabled(Context context) <!-- 當(dāng)最后一個(gè)widget從桌面刪除的時(shí)候調(diào)用--> public void onDisabled(Context context) <!-- 可用做Widget上的按鍵響應(yīng)處理--> public void onReceive(Context context, Intent intent) }
一般在onUpdate中進(jìn)行widget中按鍵的事件處理,和初始化值。
2、AppWidgetProvider是一個(gè)Broadcast,需要在Mainfest.xml中注冊(cè)。
<receiver android:name="繼承AppWidgetProvider的類"> <intent-filter > <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_config"/> </receiver
3、 <meta-data>中的android:resource引用的是Widget的配置文件,需要在res/xml下新建,如果xml目錄不存在,也需要新建。
widget_config文件
<?xml version="1.0" encoding="UTF-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="40dp" <!-- 顯示在桌面上最小的的寬,高,不能大于4*4的格子--> android:minHeight="20dp" android:updatePeriodMillis="1000000" <!-- widget的更新間隔時(shí)間--> android:previewImage="@drawable/l7" <!-- 預(yù)覽圖--> android:initialLayout="@layout/my_widgets_layout" <!-- 在桌面的顯示布局,在3.0版本之后可以使用,默認(rèn)以應(yīng)用圖標(biāo)顯示。--> android:resizeMode="horizontal|vertical" <!-- 在桌面可調(diào)整的方向--> android:configure="cn.fly.widgets.MyWidgetsConfigActivity"> <!-- 當(dāng)widget在拖到桌面上時(shí),顯示的配置文件--> <!--加上以下配置,在4.2版本可以放到鎖屏界面上,4.2以下的版本默認(rèn)是放主屏幕 android:widgetCategory ="home_screen|keyguard" android:initialKeyguardLayout="" 在鎖屏界面上顯示的布局 --> </appwidget-provider>
設(shè)置了updatePeriodMillis后,就算手機(jī)處于待機(jī)狀態(tài),也會(huì)喚醒手機(jī)去執(zhí)行更新操作,如果widget更新頻繁,這會(huì)對(duì)手機(jī)電池壽命造成影響,所以針對(duì)這種情況,可以使用AlarmManager來執(zhí)行定時(shí)更新操作,將AlarmManager的Type設(shè)置為 ELAPSED_REALTIME 或者 RTC,就可以保證手機(jī)在喚醒的狀態(tài)下執(zhí)行更新,updatePeriodMillis則需要設(shè)置為0。
在桌面顯示的布局文件的跟節(jié)點(diǎn)必須是常用布局例如:Framelayout,linearLayout,viewStub等,不能使用自定義布局。
在4.0以后的版本,widget放置到桌面上是可以根據(jù)其他的widget或者快捷圖標(biāo)來擴(kuò)充邊距,使添加的widget能夠在桌面視覺上達(dá)到協(xié)調(diào),但是4.0以下的版本需要自己來設(shè)置Padding,使widget能和其他桌面圖標(biāo)達(dá)到視覺協(xié)調(diào)。
做完以上的操作,一個(gè)簡(jiǎn)單的widget的就完成了,根據(jù)應(yīng)用需求我們會(huì)遇到以下的一些情況。
一、相應(yīng)widget的按鍵事件
因?yàn)閣idget不是運(yùn)行在自身的應(yīng)用的進(jìn)程中,所以是通過以下方式來處理事件。
RemoteView 進(jìn)行布局引用。
PendingIntent 進(jìn)行事件分發(fā)。
//這段代碼一般寫在onUpdate中,所處理的事情是按button更改Textview的顯示 final int N = appWidgetIds.length; for(int i = 0;i< N;i++){ Intent intent = new Intent("自定義action用來標(biāo)示這個(gè)intent"); intent.setClass(context, MyWidgets.class); //發(fā)送廣播,在onReceive()中進(jìn)行處理PendingIntent也可以啟動(dòng)Activity,也可以//啟動(dòng)Service PendingIntent mPendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), "widget布局引用"); //button按鍵處理 remoteViews.setOnClickPendingIntent(R.id.btn_click, mPendingIntent); appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews); }
在onReceive()的處理
String action = intent.getAction(); if(action.equals("比較發(fā)送的action")){ RemoteViews remoteViews = new RemoteViews(context.getPackageName(),"widget布局引用"); //更改文本顯示 remoteViews.setTextViewText(R.id.tv, "測(cè)試"); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); ComponentName componentName = new ComponentName(context,MyWidgets.class); appWidgetManager.updateAppWidget(componentName, remoteViews); }
二、widget添加上桌面上時(shí)的配置頁面
這個(gè)配置頁面是一個(gè)activity,所以需要在mainfest.xml中進(jìn)行配置
1、在啟動(dòng)這個(gè)配置頁面的時(shí)候,需要在oncreate()方法里面寫上setResult(RESULT_CANCELED);這樣做是為了防止配置頁面還沒有顯示出來,用戶就按了返回鍵,
setResult(RESULT_CANCELED); super.onCreate(savedInstanceState);
2、需要獲取widgetId
Intent intent = getIntent(); Bundle extra = intent.getExtras(); if(extra !=null){ mAppWidgetId = extra.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); }
如果mAppWidgetId為INVALID_APPWIDGET_ID則退出頁面顯示。
3、當(dāng)配置頁面顯示后,用戶做完了配置退出頁面時(shí),需要將這些配置信息更新到桌面的widget,照著官方給出的文檔上來操作的話,只能顯示widget但是配置并沒有生效,參考了appdemo中的例子和個(gè)人調(diào)試后總結(jié)如下。
在MyWidget中寫一個(gè)靜態(tài)方法
//describe是一個(gè)在配置文件中自由輸入文本,然后在widget的text上顯示,widget是為了做到代碼重用,這里只是一個(gè)簡(jiǎn)單的更改文本,如果涉及到圖片更改,列表數(shù)據(jù)改動(dòng)等,這些改動(dòng)如果有配置界面的話基本上和onupdate所做的操作一樣。 public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId, String describe) { RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider); views.setTextViewText(R.id.tv, describe); appWidgetManager.updateAppWidget(appWidgetId, views); }
在配置界面的退出方法中這樣寫
private void exits(){ String describe = et.getText().toString(); Context context = this; AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); //appWidgetId在進(jìn)入配置界面的時(shí)候已經(jīng)獲取了 MyWidget.updateAppWidget(context,appWidgetManager,appWidgetId , describe ); //配置完成退出界面 Intent intent = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult(RESULT_OK, intent ); finish(); }
當(dāng)時(shí)參考文檔做時(shí),文檔中并沒有提到調(diào)用updateAppWidget方法后,退出界面需要重新獲取view,并改變view的顯示數(shù)據(jù)。所以我只寫了appWidgetManager.updateAppWidget(appWidgetId, views)方法。
看完這篇文章,你們學(xué)會(huì)開發(fā)APP Widget了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。
網(wǎng)頁標(biāo)題:如何開發(fā)APPWidget?
文章網(wǎng)址:http://bm7419.com/article36/jdehpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、動(dòng)態(tài)網(wǎng)站、云服務(wù)器、網(wǎng)站建設(shè)、ChatGPT、網(wǎng)頁設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)