Android桌面小工具Widget功能實現
記錄一下Android桌面小工具的實現方式
1.註冊
首先需要在AndroidManifest.xml
中進行註冊,類似Activity、Service的註冊方式:
<receiver android:name=".MonitorWidgetProvider"> <meta-data android:name="android.appwidget.provider" android:resource="${APP_WIDGET}" /> <intent-filter> <action android:name="com.medtrum.healthcareforandroid.app.monitorwidgetprovider.refresh" /> </intent-filter> </receiver>
2.繼承AppWidgetProvider
實現
public class MonitorWidgetProvider extends AppWidgetProvider{ public MonitorWidgetProvider() { super(); } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); } @Override public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); } @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); } @Override public void onEnabled(Context context) { super.onEnabled(context); } @Override public void onDisabled(Context context) { super.onDisabled(context); } @Override public void onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds) { super.onRestored(context, oldWidgetIds, newWidgetIds); } }
從這些可以覆蓋的方法名稱就可以知道其呼叫的位置
3.配置檔案
注意這裡的${APP_WIDGET}
是對應的配置檔案,我們需要在res/xml
中建立:
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/view_monitor_sense" android:previewImage="@mipmap/ic_launcher_sense" android:minWidth="320dp" android:minHeight="110dp" android:updatePeriodMillis="60000" android:resizeMode="horizontal|vertical" android:minResizeWidth="250dp" android:minResizeHeight="40dp"> </appwidget-provider>
解釋一下這些引數的意思:
-
android:initialLayout
:對應的佈局; -
android:previewImage
:桌面外掛管理介面顯示的icon; -
android:minWidth
:最小寬度,這個寬度計算為:70*n-30,n代表的時在桌面上佔用n個格子; -
android:minHeight
:最小高度,同上; -
android:minResizeWidth
:最小可調節寬度,結合上方的最小寬度實現後結果即,外掛第一次拖拽到桌面時候佔用五個格子,長按調節寬度,最小可調節到四個格子寬; -
android:minResizeHeight
:最小可調節高度,同上; -
android:resizeMode
:可調節方向,回撥方法為onAppWidgetOptionsChanged(...)
; -
android:updatePeriodMillis
:給定間隔更新,單位毫秒,回撥方法為onUpdate(...)
;
4.主動更新Widget
我們在註冊的時候就添加了action
:
<intent-filter> <action android:name="com.medtrum.healthcareforandroid.app.monitorwidgetprovider.refresh" /> </intent-filter>
類似於傳送靜態廣播,如下操作就可以主動更新Widget:
Intentintent = new Intent(MonitorWidgetProvider.APP_WIDGET_REFRESH); sendBroadcast(intent);
注意,主動更新Widget中回撥的方法為onReceive
;
5.RemoteViews
獲取佈局元素
在Widget
中需要使用RemoteViews
類來操作佈局元素,這裡和Notication
中元素的操作類似:
RemoteViews remoteViews= new RemoteViews(context.getPackageName(), R.layout.view_monitor_all);
基本的元素操作就不再贅述,記錄一下如何跳轉到對應App指定介面事件:
Intentintent = new Intent(MyApplication.getInstance(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(MyApplication.getInstance(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.ll_widget_all, pendingIntent);
以上就是實現一個Widget需要記錄的了,ok~