Android之Widget小元件

Xu朝旭發表於2015-12-06

下面是我學習Widget的一些筆記:

一、特點:
1.快捷方便
2.個性化定製和功能
3.及時控制更新顯示內容

二、步驟:
1.繪製Widget佈局
2.配置基本屬性
3.定義AppWidgetProvider
4.提供Service或其他,在provider呼叫

三、如何顯示具體內容
1.建立一個RemoveViews物件,建立該物件時可以指定載入指定的介面佈局檔案
2.如果需要改變上一步所載入的介面佈局檔案的內容(主要包含ImageView和TextView兩種元件),則可通過RemoteViews物件進行修改
3.建立一個ComponentName物件
4.呼叫AppWidgetManager更新桌面控制元件

example:
1.layout中建立widget.xml頁面
   加入一個顯示時間的TextView

2.建立xml目錄並建立widget的屬性檔案寬度,高度,佈局,重新整理時間 
   新建xml/widgetconfig.xml,選擇appwidget-provider
   <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
         android:initialLayout="@layout/widget"
         android:minHeight="40dp"
         android:minWidth="100dp"
         android:updatePeriodMillis="864000" >
         <!-- 主要設定的引數如下: 
                 minWidth: 定義Wdiget元件的寬度 
                 minHeight: 定義Wdiget元件的高度 
                 updatePeriodMillis: 更新的時間週期 
                 initialLayout: Widget的佈局檔案  -->

    </appwidget-provider>

3.建立Provider類繼承AppWidgetProvider重寫onEnabled(context.startServices()),onDisabled(context.deleteServices()),onDeleted(),onUpdated()
   public class WidgetProvider extends AppWidgetProvider {

    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onDeleted(context, appWidgetIds);
        // Widget從螢幕移除
    }

    @Override
    public void onDisabled(Context context) {
        // TODO Auto-generated method stub
        super.onDisabled(context);
        // 最後一個Widget被從螢幕移除執行
        context.stopService(new Intent(context, TimerSerivce.class));
    }

    @Override
    public void onEnabled(Context context) {
        // TODO Auto-generated method stub
        super.onEnabled(context);
        // 第一個Widget新增到螢幕上執行
        context.startService(new Intent(context, TimerSerivce.class));
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        super.onReceive(context, intent);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        // 重新整理widget
        // 通過remoteView和AppWidgetManager
    }
}

4.在包下建立TimerService類繼承Service類重寫onCreate(),onDestroy():
   public class TimerSerivce extends Service {

    private Timer timer;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        timer = new Timer();
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                updateViews();
            }
        }, 0, 1000);
    }
   
    private void updateViews() {
        String time = sdf.format(new Date());
        RemoteViews rv = new RemoteViews(getPackageName(), R.layout.widget);
        rv.setTextViewText(R.id.text, time);
        AppWidgetManager manager = AppWidgetManager
                .getInstance(getApplicationContext());
        ComponentName cn = new ComponentName(getApplicationContext(), WidgetProvider.class);
        manager.updateAppWidget(cn, rv);
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        timer = null;
    }

}

5.修改清單檔案,新增許可權
   <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="com.example.widgetdemo.WidgetProvider" >
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"                  
               android:resource="@xml/widgetconfig"/>
        </receiver>

        <service android:name="com.example.widgetdemo.TimerSerivce" >
        </service>
    </application>

附:
Widget並不支援所有的佈局和控制元件,而僅僅只是支援Android佈局和控制元件的一個子集。
(01) App Widget支援的佈局:
  FrameLayout
  LinearLayout
  RelativeLayout
  GridLayout
(02) App Widget支援的控制元件:
  AnalogClock
  Button
  Chronometer
  ImageButton
  ImageView
  ProgressBar
  TextView
  ViewFlipper
  ListView
  GridView
  StackView
  AdapterViewFlipper


相關文章