天天看點

Android中widget視窗小部件的簡單應用

對于手機桌面小部件大家都不會模式,比如桌面上的時鐘,天氣,月曆等等,都屬于widget。

簡單做個widget小部件,先看一下效果圖。

Android中widget視窗小部件的簡單應用
Android中widget視窗小部件的簡單應用
Android中widget視窗小部件的簡單應用

隻是在桌面顯示個時間,每過一秒重新整理一次。

接下來上代碼:

首先需要在Layout中建立個布局widget.xml此布局為桌面上要顯示的内容,在裡面放個TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <TextView
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>      

建立WidgetProvider類繼承AppWidgetProvider。其中AppWidgetProvider的父類是BroadcastReceiver。是以它也屬于是廣播。

public class WidgetProvider extends AppWidgetProvider {
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
        //widget被從螢幕移除
    }

    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        //最後一個widget被從螢幕移除
        context.stopService(new Intent(context,TimerService.class));
    }

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        //widget添加到螢幕上執行
        context.startService(new Intent(context,TimerService.class));
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        //重新整理的時候執行widget
        //remoteView  AppWidgetManager
    }
}
      

我們重寫其中的一些方法,方法下面已經帶注釋了,在這裡就不細說了,看方法名字就大概知道作用了。

因為要實時更新時間顯示,是以我們在onEnabled方法中要開啟一個服務,同時要在onDisabled中關閉服務。

建立個服務類TimerService繼承Service

public class TimerService extends Service {
    private Timer mTimer;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mTimer = new Timer();
        mTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                updata();
            }
        }, 0, 1000);
    }

    private void updata() {
        String time = sdf.format(new Date());
        RemoteViews rv = new RemoteViews(getPackageName(), R.layout.widget);
        rv.setTextViewText(R.id.time, time);
        AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
        ComponentName cn =new ComponentName(getApplicationContext(),WidgetProvider.class);
        manager.updateAppWidget(cn, rv);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mTimer = null;
    }
}      

schedule (TimerTask task, long delay, long period)     

這個方法有三個參數,第一個參數傳遞一個TimerTask,第二個參數是延遲執行,第三個參數是多長時間執行一次,

在這裡我們是1s執行一次,無延遲。其中在TimerTask的run()方法中執行update()方法,在update方法中把獲得到的時間傳遞給TextView。更新資料需要用RemoteViews和AppWidgetManager。

我們還需要個widget的配置檔案,在res下面建立xml檔案夾,裡面建立一個widgetconfig.xml作為配置檔案。

<?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="45000">


</appwidget-provider>      

其中包含最小高度,最小寬度的屬性,android:initialLayout為管理的布局檔案。其中updatePeriodMillis為更新widget的時間間隔,Android系統為了節省電量的原因,預設重新整理時間最小為30分鐘,如何設定的時間小于30分鐘的話,也是30分鐘重新整理一次。

現在就剩最後在AndroidManifest中配置資訊了,需添加一個服務和一個廣播

<service android:name=".TimerService"/>
<receiver android:name=".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>      

好了,接下來運作程式,然後在視窗小部件中就能找到我們要顯示的widget。如文章剛開始的圖。這個是最簡單的使用例子。

繼續閱讀