Android開發(fā)之AppWidget詳解
Android通知系統(tǒng)是它的一大特色,而其中,AppWidget是其中一個亮點(diǎn)。在開發(fā)應(yīng)用的中,很多時候可以為其添加一個AppWidget顯示在桌面中,及時方便的與用戶進(jìn)行
交互。這里就簡單的熟悉一下開發(fā)一個AppWidget的流程吧。
想要在應(yīng)用中創(chuàng)建一個AppWidget,至少需要以下幾樣?xùn)|西:
需要創(chuàng)建一個AppWidgetProviderInfo,來描述AppWidget的元數(shù)據(jù)。 需要實(shí)現(xiàn)一個自己的AppWidgetProvider對AppWidget進(jìn)行更新等操作。 需要布局文件來描述AppWidget的布局。那么,下面就開始創(chuàng)建一個AppWidget吧。
一、在AndroidManifest.xml中聲明一個AppWidget首先我們需要在AndroidManifest.xml中聲明AppWidgetProvider。格式如下:
<receiver android:name='MyAppWidgetProvider' > <intent-filter> <action android:name='android.appwidget.action.APPWIDGET_UPDATE' /> </intent-filter> <meta-data android:name='android.appwidget.provider' android:resource='@xml/my_appwidget_info' /> </receiver>
可以看出AppWidgetProvider實(shí)際上就是一個BroadcastReceiver,它接收特定的Broadcast。<meta-data>標(biāo)簽描述了AppWidget所使用的元數(shù)據(jù),android:resource則聲明了定義元數(shù)據(jù)的xml文件的位置。
二、添加AppWidgetProviderInfo元數(shù)據(jù)AppWidgetProviderInfo描述了AppWidget的本質(zhì)特性,例如,AppWidget更新的周期,最小的寬度、長度,所使用的布局文件是什么,以及添加AppWidget需要啟動的
configuration Activity等。我們需要在XML中來定義AppWidgetProviderInfo對象,這個XML文件應(yīng)該保存在res/xml文件夾下。下面是一個范例:
<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.MyAppWidgetConfigure' android:resizeMode='horizontal|vertical'> </appwidget-provider>
<appwidget-provider>需要使用這個標(biāo)簽來定義AppWidgetProviderInfo。下面對范例中使用到的屬性做下說明。
minWidth、minHeight定義了AppWidget需要占據(jù)的最小的空間。
updatePeriodMillis定義了大概多久AppWidget需要更新一次,這里定義的只是一個大概的時間,系統(tǒng)不能做出精確的保證。
previewImage定義了在用戶選擇AppWidget時做現(xiàn)實(shí)的圖標(biāo)。
initialLayout定義了AppWidget所使用的布局文件。
configure定義了AppWidget在添加的時候需要啟動的configuration Activity 用于執(zhí)行配置的工作。
resizeMode定義了縮放模式。
三、創(chuàng)建AppWidget所使用的布局文件在創(chuàng)建AppWidget時必須創(chuàng)建一個布局文件,為其提供布局描述。AppWidget創(chuàng)建視圖時,需要根據(jù)RemoteViews來創(chuàng)建。而出于效率等因素的考慮,很多控件在
RemoteViews中是被支持的。以下列出能在RemoteViews中使用的UI控件:
layout : FrameLayout , LinearLayout , RelativeLayout
widget : AnalogClock , Button , Chronometer , ImageButton , ImageView , ProgressBar , TextView , ViewFlipper , ListView , GridView , StackView , AdapterViewFlipper
四、創(chuàng)建一個AppWidgetProvider的子類前面提到過AppWidgetProvider就是一個BroadcastReceiver。對,它其實(shí)確實(shí)是繼承自BroadcastReceiver,只是它為了更加方便的處理AppWidget的廣播進(jìn)行了封裝。
AppWidgetProvider在接收到AppWidget的廣播的時候,會根據(jù)類型分別觸發(fā)以下幾個方法:
onUpdate() : 當(dāng)AppWidget需要更新時,會觸發(fā)這個方法,我們需要重寫這個方法,在里面實(shí)現(xiàn)更新的操作。如果沒有定義configuration Activity,那么在添加一個AppWidget
時,也會觸發(fā)此方法。
onDelete(Context , int[] ):當(dāng)AppWidget從AppWidgetHost中刪除時,會觸發(fā)此方法。
onEnabled(Context ):如果為一個應(yīng)用添加了多個AppWidget,只有在第一個AppWidget被添加時,此方法才會被調(diào)用。
onDisabled(Context ):當(dāng)一個應(yīng)用的最后一個AppWidget從AppWidgetHost中刪除時,會觸發(fā)此方法。
onReceive(Context , Intent ):這實(shí)際上就是BroadcastReceiver中的方法,當(dāng)任何一個Broadcast被接收到時,會調(diào)用此方法,并且會在以上回調(diào)方法之前被調(diào)用。
五、創(chuàng)建一個ConfigurationActivity(可選)如果需要AppWidget添加的時候做一些配置工作,就可以使用Configuration Activity。要使用ConfigurationActivity首先需要像普通的Activity一樣在AndroidManifest.xml中
進(jìn)行聲明:
<activity android:name='.ExampleAppWidgetConfigure'> <intent-filter> <action android:name='android.appwidget.action.APPWIDGET_CONFIGURE'/> </intent-filter> </activity>
只是這里需要添加action類型為android.appwidget.action.APPWIDGET_CONFIGURE的intent-filter。然后,需要在AppWidgetProviderInfo中進(jìn)行聲明:
<appwidget-provider xmlns:android='http://schemas.android.com/apk/res/android' ... android:configure='com.example.android.ExampleAppWidgetConfigure' ... > </appwidget-provider>
最后,當(dāng)然是需要創(chuàng)建Activity了,在Configuration Activity中,需要執(zhí)行一些必要的操作:
1、獲取AppWidget ID
Intent intent = getIntent(); Bundle extras = intent.getExtras(); if (extras != null) { mAppWidgetId = extras.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); }
2、進(jìn)行必要的配置操作,獲取AppWidgetManager實(shí)例、更新RemoteViews
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget); appWidgetManager.updateAppWidget(mAppWidgetId, views);
3、設(shè)置Activity result,并且返回一個Intent。
Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); setResult(RESULT_OK, resultValue); finish();
這樣一個就創(chuàng)建好了一個Configuration Activity了。
注意android8.0以后無法收到發(fā)給自己的AppWidgetProvider,需要添加
intent.setComponent(new ComponentName(context,CacheProvider.class));
Intent intent = new Intent();intent.setAction(ACTION_CACHE_CLEAN);intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);intent.setComponent(new ComponentName(context,CacheProvider.class));PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);remoteViews.setOnClickPendingIntent(R.id.tv_clean, pendingIntent);
執(zhí)行完上面的步驟,就已經(jīng)創(chuàng)建了一個可以在桌面進(jìn)行顯示的AppWidget了。
以上就是Android開發(fā)之AppWidget詳解的詳細(xì)內(nèi)容,更多關(guān)于Android AppWidget詳解的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Python如何批量生成和調(diào)用變量2. ASP.NET MVC實(shí)現(xiàn)橫向展示購物車3. ASP.Net Core對USB攝像頭進(jìn)行截圖4. .net如何優(yōu)雅的使用EFCore實(shí)例詳解5. ASP.Net Core(C#)創(chuàng)建Web站點(diǎn)的實(shí)現(xiàn)6. python 爬取京東指定商品評論并進(jìn)行情感分析7. python基礎(chǔ)之匿名函數(shù)詳解8. Python獲取B站粉絲數(shù)的示例代碼9. ajax動態(tài)加載json數(shù)據(jù)并詳細(xì)解析10. 通過CSS數(shù)學(xué)函數(shù)實(shí)現(xiàn)動畫特效
