Android開發(fā)入門之Appwidget用法分析
本文實(shí)例講述了Android Appwidget用法。分享給大家供大家參考,具體如下:
App Widgets 是一個(gè)小型應(yīng)用程序的View 他可以嵌入到其他應(yīng)用程序中(如 桌面程序) 并且可以得到周期性刷新。
在創(chuàng)建App Widget之前需要了解以下幾個(gè)概念
AppWidgetProviderInfo對象
它是對App Widget 元數(shù)據(jù)的一個(gè)描述,譬如 AppWidget的布局,刷新頻率,以及 AppWidgetProvider 類 這些元數(shù)據(jù)都是定義在XML中。
AppWidgetProvider 類的實(shí)現(xiàn)
對于App Widget定義了(回調(diào)接口)一些基本的方法,這些方法都是基于廣播事件(broadcast events ),,通過它,當(dāng)App Widget更新,創(chuàng)建,無效,卸載時(shí),你可以接收廣播。
View layout
為App Widget定義初始布局,用XML來布局
另外,你可以為App Widget 實(shí)現(xiàn)一個(gè)配置的Activity,這是一個(gè)可選擇的Activity,在用戶添加你的App Widget 準(zhǔn)備創(chuàng)建時(shí)允許他修改或者配 置App Widget 。
下面我們就開始創(chuàng)建一個(gè)App Widget
① 在Manifest聲明App Widget
首先,在AndroidManifest.xml中聲明 AppWidgetProvider
<receiver android:name="ExampleAppWidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver>
<receiver>元素需要Android:name 屬性,AppWidgetProvider作為引用
<intent-filter> 元素務(wù)必要包含 <action>元素 然后Action中要有android:name 屬性,這個(gè)屬性需要指定能接收 ACTION_APPWIDGET_UPDATE 廣播的AppWidgetProvider,也就是ExampleAppWidgetProvider 這個(gè)廣播必須唯一 必須明確聲明,因?yàn)锳ppWidgetManager會自動(dòng)的發(fā)送所有其他應(yīng)用程序的廣播給AppWidgetProvider,所以很重要。
<meta-data> 元素指定AppWidgetProviderInfo資源需要以下屬性
Android:name -指定了元數(shù)據(jù)的名字,用android.appwidget.provider代表數(shù)據(jù)是AppWidgetProviderInfo描述。
Android:resource -引用AppWidgetProviderInfo 資源的位置
總之一句話:在AndroidManifest.xml主要聲明概念中AppWidgetProvider 和AppWidgetProviderInfo
②添加AppWidgetProviderInfo元數(shù)據(jù)
AppWidgetProviderInfo為AppWidgeet定義了一些最基本的數(shù)據(jù),譬如布局的最小尺寸,初始化布局資源,怎樣更新App Widget,以及在創(chuàng)建app Widget時(shí)的可配置Activity(可選)
要定義一個(gè)AppWidgetProviderInfo對象可以用XML資源文件定義,保存在res/xml/自己的文件名 ,XML文件中用一個(gè)單一的元素<appwidget-provider> 請看下面的例子:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dp" android:minHeight="72dp" android:updatePeriodMillis="86400000" android:previewImage="@drawable/preview" android:initialLayout="@layout/example_appwidget" android:configure="com.example.android.ExampleAppWidgetConfigure" android:resizeMode="horizontal|vertical"> </appwidget-provider>
initialLayout:指定App Widget布局資源文件
Configure:在創(chuàng)建App Widget時(shí)為他配置屬性的activity
updatePeriodMillis: appwidget更新頻率
③ 創(chuàng)建App Widget 布局
你必須為你的App Widget定義個(gè)初始化布局文件,可以將布局文件放在 res/layout/directory。 你可以設(shè)計(jì)你的App Widget用下面列出來
的View對象,但是在你設(shè)計(jì)開始之前,請你熟讀App Widget Design Guidelines.
如果你熟悉XML Layouts ,那么創(chuàng)建一個(gè)App Widget將會是簡單的, 然而,你必須意識到App Widget布局是基于 RemoteViews ,它并不是支持每一種layout和View widget。
一個(gè)RemoteView對象只能支持下面幾種layout布局類:
FrameLayout LinearLayout RelativeLayout
支持下面幾種widget 類:
AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView ViewFlipper ListView GridView
StackView AdapterViewFlipper
PS:這些類的繼承類也是不被支持的。
下面是我本次寫的demo中的Appwidget
功能很簡單只為初步理解AppWidget ,響應(yīng)Appwidget上按鈕事件
package com.manymorere.appwidget; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; public class ExampleAppWidgetProvider extends AppWidgetProvider{ private static final String ACTION = "com.manymore.appwidget"; private int id; @Override public void onDeleted(Context context, int[] appWidgetIds) { System.out.println("onDeleted"); super.onDeleted(context, appWidgetIds); } @Override public void onDisabled(Context context) { // TODO Auto-generated method stub System.out.println("onDisabled"); super.onDisabled(context); } @Override public void onEnabled(Context context) { // TODO Auto-generated method stub System.out.println("onEnabled"); super.onEnabled(context); } @Override public void onReceive(Context context, Intent intent) { System.out.println("onReceive"); // 自己定義的ACTION if(intent.getAction().equals(ACTION)) { RemoteViews remoteView = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout); remoteView.setCharSequence(R.id.button, "setText", "22222222222222"); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); ComponentName componentName = new ComponentName(context, ExampleAppWidgetProvider.class); appWidgetManager.updateAppWidget(componentName , remoteView); System.out.println("收到自定義ACTION"); }else{ super.onReceive(context, intent); } } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { int N = appWidgetIds.length; for(int i = 0; i<N; i++) { int appWidgetId = appWidgetIds[i]; Intent intent = new Intent(ACTION); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout); remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent); appWidgetManager.updateAppWidget(appWidgetId, remoteViews); System.out.println(appWidgetId); } super.onUpdate(context, appWidgetManager, appWidgetIds); } }
每次添加Appwidget實(shí)例 都會調(diào)用onUpdate()方法 然后會注冊里面的Button Onclick事件,當(dāng)你點(diǎn)擊該按鈕時(shí)會發(fā)送一個(gè)broadcast,這個(gè)broadcast是自己定義的,然后onReceive方法會收到該broadcast,然后再做出一些反應(yīng),我這里是把修改了TextView上的text。
由于Appwidget和本身的應(yīng)用,雖然是在一個(gè)程序中,但運(yùn)行時(shí),它們并不是在一個(gè)進(jìn)程中,所以在在調(diào)用方法和修改界面上多少會有點(diǎn)限制,沒有普通的(Activity上對View的一些操作)那么自由,所以想對Appwidget上的View做一些操作,或者更新Appwidget,一般需要用到RemoteViews,AppWidgetManager 同時(shí)可能還會用到ComponentName
個(gè)人理解:RemoteViews在創(chuàng)建時(shí)主要代表一個(gè)Appwidget實(shí)例中View的一個(gè)集合 ,而ComponentName則代表一個(gè)整個(gè)Appwidget實(shí)例
完整實(shí)例代碼點(diǎn)擊此處本站下載。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android資源操作技巧匯總》、《Android文件操作技巧匯總》、《Android操作SQLite數(shù)據(jù)庫技巧總結(jié)》、《Android操作json格式數(shù)據(jù)技巧總結(jié)》、《Android數(shù)據(jù)庫操作技巧總結(jié)》、《Android編程開發(fā)之SD卡操作方法匯總》、《Android開發(fā)入門與進(jìn)階教程》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
Android Studio升級3.6 Build窗口出現(xiàn)中文亂碼問題解決方法
這篇文章主要介紹了Android Studio升級3.6 Build窗口出現(xiàn)中文亂碼問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Android實(shí)現(xiàn)紙飛機(jī)的簡單操作
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)紙飛機(jī)的簡單操作,類似于漂流瓶功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android實(shí)現(xiàn)簡單加法計(jì)算器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡單加法計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03Flutter實(shí)現(xiàn)漸變色加描邊字體效果
這篇文章介紹了Flutter實(shí)現(xiàn)漸變色描邊字體效果的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11Android?NotificationListenerService通知監(jiān)聽服務(wù)使用
這篇文章主要為大家介紹了Android?NotificationListenerService通知監(jiān)聽服務(wù)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11使用Android的OkHttp包實(shí)現(xiàn)基于HTTP協(xié)議的文件上傳下載
OkHttp(GitHub主頁https://github.com/square/okhttp)是近來人氣攀升的一款安卓第三方HTTP包,這里我們來講解一下如何使用Android的OkHttp包實(shí)現(xiàn)基于HTTP協(xié)議的文件上傳下載:2016-07-07HorizontalScrollView水平滾動(dòng)控件使用方法詳解
這篇文章主要為大家詳細(xì)介紹了HorizontalScrollView水平滾動(dòng)控件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08