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

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

<?xml version="1.0" encoding="utf-8"?><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视图,仅供参考:

<?xml version="1.0" encoding="utf-8"?><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();  }}

更多相关文章

  1. Android(安卓)Spinner 文字居中、其下拉窗口文字居中,自定义Spinn
  2. android添加新驱动
  3. android 核心组件( 1 ) 常用布局, adapter, handler, UI
  4. Android(安卓)Studio中AspectJ的简单使用一(自定义PointCut)
  5. Android(安卓)- 准备工作【仿】淘宝App
  6. android 怎样为多媒体文件生成缩略图
  7. Android实现拍照、录像、录音代码范例
  8. android 完美的ListView实现【原创】
  9. Android(安卓)判断网络是否可用 & 获取IP地址 & 获取以太网口MAC

随机推荐

  1. 瘸腿蛤蟆笔记cocos2d-x-3.2移植到到andro
  2. Android 快速开发框架,thinkandroid改变和
  3. 还在用枚举?我早就抛弃了!(Android(安卓)注
  4. Android之常见安全问题
  5. 初涉Android蓝牙开发(转) 收藏以备后用
  6. Android触屏事件和MotionEvent介绍
  7. Android 小小白入门学习详解(不喝脉动,不吃
  8. Broadcast 广播 的接收 和发送 -- Androi
  9. 五成Android设备要向微软支付专利费
  10. android中的5个布局方式