App Widget的開發精要

在 AndroidManifest 中聲明 <receiver>標簽, 用name屬性指定繼承自AppWidgetProvider的自定義類.

AndroidManifest.xml

<receiver android:name=".sample.MyWidgetProvider" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/my_appwidget_provider"/>
</receiver>

注:

  1. AppWidgetProvider本質是BroadcastReceiver, 在<action>中需要聲明APPWIDGET_UPDATE, 這樣在收到這種intent時, 系統會調用自定義AppWidgetProvider的onUpdate()來更新數據.

  2. <meta-data>中的resource屬性, 用來指定一個xml文件, 這個文件中的根節點是<appwidget-provider>標簽, 用來指定這個widget在桌面上的寬高值, 以及初始布局的xml文件.
    還有一個很重要的屬性是“updatePeriodMillis”用來定義刷新頻率, 也就是說framework多久發送一個特定的intent, 用來調用子定義AppWidgetProvider 的 onUpdate() 回調函數。
    系統基于節電的考慮, 定義了widget刷新數據的最小時間間隔是30分鐘, 所以你要是要求實時的去刷新數據的話, 就要采用 Service 和 AlarmManager 對 Widget 進行更新.

my_appwidget_provider.xml

<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="200dp"
    android:minHeight="50dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/app_icon"
    android:initialLayout="@layout/widget"
    android:configure="com.example.android.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen|keyguard"/>

3. 真正的業務邏輯, 基本集中在自定義的AppWidgetProvider類.
自己要去實現這樣幾個重要的回調方法,

onUpdate(), 這是最重要的回調方法, 接受特定的intent, 用來定期更新數據.
onDeleted():當 Widget 被刪除時調用該方法
onEnabled():當 Widget 第一次被添加時調用
onDisabled():當你的最后一個 Widget 被刪除時調用該方法
onAppWidgetOptionsChanged():當 Widget 第一次被添加或者大小發生變化時調用該方法.
public class MyWidgetProvider extends AppWidgetProvider {
    public void onUpdate()
    public void onDeleted()
    public void onEnabled()
    public void onDisabled()
    public void onAppWidgetOptionsChanged()
}

eg.
當點擊widget中的R.id.icon和R.id.icon_txt時, 啟動ThemesStore這個activity.

public class ThemeStoreWidget extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {

        RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_themestore);

        Intent intent = new Intent(context, ThemesStore.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        remoteView.setOnClickPendingIntent(R.id.icon, pendingIntent);
        remoteView.setOnClickPendingIntent(R.id.icon_txt, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, remoteView);
    }
}

refer to:
http://glgjing.github.io/blog/2015/11/05/android-kai-fa-zhi-app-widget-xiang-jie/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容