android AppWidget的使用以及利用Service TimerTask实现widget的定时更新

第一步:首先是Widget的定义声明:

在资源文件下的xml文件夹中建立文件example_appwidget_info.xml:


<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/process_widget"
    android:minHeight="72.0dip"
    android:minWidth="294.0dip"
    android:updatePeriodMillis="0" />
第二步:编写MyWidget类实现AppWidgetProvider
package cn.itcast.testwidget;

import cn.itcast.mobilesafe.service.UpdateWidgetService;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

/**
 * 根据配置文件 每隔固定的时间 更新一下界面 最小值 半个小时 1800000毫秒 onRecevie - > onUpdate 注意
 * widget这个组件不是现实在我们的应用程序里面 显示在桌面的应用程序 不同的桌面 他们的widget的创建和销毁对应的 回调的事件可能会有不能
 * android luncher / htc sence / 米ui / 360桌面/awt /qq桌面/....
 */
public class MyWidget extends AppWidgetProvider {   //AppWidgetProvider继承自BroadcastReceiver

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

  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
      int[] appWidgetIds) {
    System.out.println("onUpdate");
    super.onUpdate(context, appWidgetManager, appWidgetIds);
  }

  @Override
  public void onDeleted(Context context, int[] appWidgetIds) {
    super.onDeleted(context, appWidgetIds);
    // 当某一个widget被删除的时候 会执行ondelete方法
    intent = new Intent(context, UpdateWidgetService.class);
    context.stopService(intent);
  }

  @Override
  public void onEnabled(Context context) {
    super.onEnabled(context);
    // widget第一次创建的时候 执行的方法
    // 初始化widget数据的操作,开启后台服务等
    intent = new Intent(context, UpdateWidgetService.class);
    context.startService(intent);
  }

  @Override
  public void onDisabled(Context context) {
    super.onDisabled(context);
    System.out.println("onDisabled");
    // 当所有的widget都被删除的时候 执行 ondisable();
    // 停止我们开启的服务
    // 删除垃圾文件 临时文件
  }
}
第三步:在清单文件中注册activity:
<receiver android:name="MyWidget" >
  <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  intent-filter>

  <meta-data
    android:name="android.appwidget.provider"
    android:resource="@xml/example_appwidget_info" />
receiver>

第四部:为Widget建立视图资源文件:

下面为金山手机卫士所对应的 Widget视图,仅供参考:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center_vertical"
  android:src="@drawable/widget_bg_portrait" >

  <LinearLayout
    android:id="@+id/pw_ll"
    android:layout_width="0.0dip"
    android:layout_height="fill_parent"
    android:layout_marginLeft="5.0dip"
    android:layout_weight="1.0"
    android:background="@drawable/widget_bg_portrait_child"
    android:gravity="center_vertical"
    android:orientation="vertical"
    android:paddingBottom="3.0dip"
    android:paddingTop="3.0dip" >

    <TextView
      android:id="@+id/process_count"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginLeft="10.0dip" />

    <ImageView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_marginBottom="1.0dip"
      android:layout_marginTop="1.0dip"
      android:background="@drawable/widget_bg_portrait_child_divider" />

    <TextView
      android:id="@+id/process_memory"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginLeft="10.0dip" />
  LinearLayout>

  <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

    <LinearLayout
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:gravity="center_vertical" >

      <ImageView
        android:layout_width="20.0dip"
        android:layout_height="20.0dip"
        android:background="@drawable/notification" />

      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name" />
    LinearLayout>

    <Button
      android:id="@+id/btn_clear"
      android:layout_width="90.0dip"
      android:layout_height="wrap_content"
      android:layout_centerVertical="true"
      android:layout_marginTop="5.0dip"
      android:background="@drawable/button_background_selected"
      android:text="一键清理" />
  LinearLayout>

LinearLayout>
效果:

第五部:利用UpdateWidgetService服务定期更新视图:
package cn.itcast.mobilesafe.service;

import java.util.Timer;
import java.util.TimerTask;

import cn.itcast.mobilesafe.R;
import cn.itcast.mobilesafe.receiver.LockScreenReceiver;
import cn.itcast.mobilesafe.ui.TaskManagerActivity;
import cn.itcast.mobilesafe.util.TaskUtil;

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

public class UpdateWidgetService extends Service {
  private Timer timer;
  private TimerTask task;
  private AppWidgetManager widgetmanager;

  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }

  @Override
  public void onCreate() {
    timer = new Timer();
    widgetmanager = AppWidgetManager.getInstance(getApplicationContext());
    task = new TimerTask() {
      @Override
      public void run() {
        // 更新widget的界面
        ComponentName name = new ComponentName("cn.itcast.mobilesafe",
            "cn.itcast.mobilesafe.receiver.ProcessWidget");// 获取前面参数包下的后参数的Widget
        RemoteViews views = new RemoteViews("cn.itcast.mobilesafe",
            R.layout.process_widget);// 获取Widget的布局
        views.setTextViewText(R.id.process_count, "XXXX");//给process_count设置文本
        views.setTextColor(R.id.process_count, Color.RED);//给process_count设置文本颜色
        views.setTextViewText(R.id.process_memory, "XXXX");
        views.setTextColor(R.id.process_memory, Color.RED);
        Intent intent = new Intent(UpdateWidgetService.this, XXXX.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
            getApplicationContext(), 0, intent, 0);
        views.setOnClickPendingIntent(R.id.btn_clear, pendingIntent);// 给布局文件中的btn_clear设置点击事件
        widgetmanager.updateAppWidget(name, views);//更新Widget
      }
    };
    timer.scheduleAtFixedRate(task, 1000, 2000);//延迟一秒      更新频率2秒
    super.onCreate();
  }

  @Override
  public void onDestroy() {
    timer.cancel();
    timer = null;
    task = null;
    super.onDestroy();
  }
}

你可能感兴趣的:(android)