Widget基礎用法

這邊只是一個簡單的時鐘提示Widget。

分五個步驟:

1,編寫Widget的UI佈局

2,設定Widget的配置信息

3,實現AppWidgetProvider

4,創建Service

5,配置清單文件。


1,編寫Widget的UI佈局,只是RelativeLayout中添加一個TextView。Widget佈局支持FrameLayout,LinearLayout,RelativeLayout。

widget.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <TextView 
        android:id="@+id/tv_widget"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello world"/>
    

</RelativeLayout>


2,設置Widget的配置信息:res/xml/widgetconfig.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="100dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="30000"
    android:initialLayout="@layout/widget">
    
</appwidget-provider>


3,實現APPWidgetProvider的類:WidgetProvider.java

package com.wang.demo_android.provider;

import com.wang.demo_android.service.WidgetService;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

public class WidgetProvider extends AppWidgetProvider{
    
    @Override
    public void onEnabled(Context context) {
        // TODO Auto-generated method stub
        super.onEnabled(context);
        //第一個Widget創建
        Intent intent = new Intent(context,WidgetService.class);
        context.startService(intent);
    }
    
    @Override
    public void onDisabled(Context context) {
        // TODO Auto-generated method stub
        super.onDisabled(context);
        //最後一個Widget移除
        Intent intent = new Intent(context,WidgetService.class);
        context.stopService(intent);
    }
    
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        //widget更新,基本所有的變動都會觸動此方法
    }

}

4,創建Service

package com.wang.demo_android.service;

import com.wang.demo_android.R;
import com.wang.demo_android.provider.WidgetProvider;

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.widget.RemoteViews;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class WidgetService extends Service {

    private Timer timer;

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

    RemoteViews rv = null;

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

            @Override
            public void run() {
                updateWidget();
            }
        }, 0, 1000);

    }

    private void updateWidget() {
        String text = sdf.format(new Date());
        if (rv == null) {
            rv = new RemoteViews(getPackageName(), R.layout.widget);
            PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), 0,
                    new Intent().setAction("com.wang.demo_android.activity.secondactivity"), 0);//設置tv_widget的點擊事件
            rv.setOnClickPendingIntent(R.id.tv_widget, pIntent);
        }
        rv.setTextViewText(R.id.tv_widget, text);
        AppWidgetManager awm = (AppWidgetManager) getSystemService(Context.APPWIDGET_SERVICE);
        ComponentName cm = new ComponentName(getApplicationContext(), WidgetProvider.class);
        awm.updateAppWidget(cm, rv);

    }

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

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

}

5,在androidminifest.xml 清單文件中配置:

        <receiver android:name="com.wang.demo_android.provider.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.wang.demo_android.service.WidgetService" >
        </service>









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章