转自: http://www.maxiaoguo.com/shipin/346.html

最近项目需要widget,最近做了一下,

要求如图   

是一个widget



点击widget



要求 这个widget中的图标是实时更新的, 这个弹出框是一个activity   详情看上篇博客。


创建widget的过程


1、  先看AndroidManifest.xml


         

        

2、顺着 需要在xml文件夹下弄个widgetinfo.xml


<?xml version="1.0" encoding="utf-8"?>

注意 android:updatePeriodMillis="0" 数值弄成0就可以了,看网上说在2.2以后这个值就不管用了,更新的时候需要起一个service


3、在配置文件中还提到一个WidgetProvider


package com.m4399.gamecenter.widget;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.Context;import android.content.Intent;import com.m4399.gamecenter.common.NativeGameDao;import com.m4399.gamecenter.service.WidghtService;public class WidgetProvider extends AppWidgetProvider {NativeGameDao dao;@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {//有部分被删除就会执行// TODO Auto-generated method stubsuper.onDeleted(context, appWidgetIds);}@Overridepublic void onEnabled(Context context) {//当第一次添加部件到卓面时会调用该 方法// TODO Auto-generated method stubsuper.onEnabled(context);}@Overridepublic void onDisabled(Context context) {//在最后一个同类型部件被删除的时候调用context.stopService(new Intent(context, WidghtService.class));}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {Intent intent = new Intent(context,WidghtService.class);intent.setAction(WidghtService.START_ACTION);intent.putExtra("update", true);context.startService(intent);  }}

其中update方法是更新widget的


4、那我们需要新建一个service


package com.m4399.gamecenter.service;import java.io.InputStream;import java.util.Vector;import com.m4399.gamecenter.R;import com.m4399.gamecenter.common.NativeGameDao;import com.m4399.gamecenter.ui.ScDialogActivity;import com.m4399.gamecenter.util.AppUtils;import com.m4399.gamecenter.util.LogTag;import com.m4399.gamecenter.vo.GameInfo;import com.m4399.gamecenter.widget.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.content.res.Resources;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.os.IBinder;import android.widget.RemoteViews;public class WidghtService extends Service {public static String START_ACTION = "com.m4399.gamecenter.service.WidghtService";private NativeGameDao dao;@Overridepublic void onCreate() {super.onCreate();}@Overridepublic void onStart(Intent intent, int startId) {if(intent!=null){Bundle data = intent.getExtras();String action = intent.getAction();if(data==null)return;boolean update = data.getBoolean("update");// 操作类型if (START_ACTION.equals(action)) {// 注册流程if(update){RemoteViews mRemoteViews = buildUpdate(this); ComponentName thisWidget = new ComponentName(this, WidgetProvider.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(thisWidget, mRemoteViews); }}}}@Overridepublic void onDestroy() {super.onDestroy();}@Overridepublic IBinder onBind(Intent intent) {return null;} private RemoteViews buildUpdate(final Context context) {         final RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_ico);        // rv.setImageViewBitmap(viewId, bitmap)        Intent intent = new Intent(context, ScDialogActivity.class);         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);         rv.setOnClickPendingIntent(R.id.widget_fl, PendingIntent.getActivity(context, 0,intent, 0));          Vector s;if(dao==null){        dao = new NativeGameDao(context);        }s = dao.getLastlyGame();//Comparator comp=Collections.reverseOrder();//Collections.sort(s, comp);Resources r = getResources();InputStream is = r.openRawResource(R.drawable.transparent);BitmapDrawable  bmpDraw = new BitmapDrawable(is);Bitmap bmp = bmpDraw.getBitmap();for(int i=0;i<5;i++){if(s!=null&&s.size()>i){GameInfo gameInfo = s.get(i);//LogTag.showTAG_e("tag", gameInfo.name+"000");if(gameInfo!=null){Drawable drawableUnder = AppUtils.getIconFromPKname(context, gameInfo.packageName);if(drawableUnder!=null){BitmapDrawable bitmapDrawableUnder = (BitmapDrawable)drawableUnder;Bitmap bitmapUnder = bitmapDrawableUnder.getBitmap().copy(Bitmap.Config.ARGB_8888, true);int size = s.size();if(size==1){rv.setImageViewBitmap(R.id.widget_ico_f, bitmapUnder);rv.setImageViewBitmap(R.id.widget_ico_s, bmp);rv.setImageViewBitmap(R.id.widget_ico_t, bmp);rv.setImageViewBitmap(R.id.widget_ico_fo, bmp);rv.setImageViewBitmap(R.id.widget_ico_fif, bmp);}else if(size==2){switch (i) {case 0:rv.setImageViewBitmap(R.id.widget_ico_s, bitmapUnder);break;case 1:rv.setImageViewBitmap(R.id.widget_ico_f, bitmapUnder);break;}rv.setImageViewBitmap(R.id.widget_ico_t, bmp);rv.setImageViewBitmap(R.id.widget_ico_fo, bmp);rv.setImageViewBitmap(R.id.widget_ico_fif, bmp);}else if(size==3){switch (i) {case 0:rv.setImageViewBitmap(R.id.widget_ico_t, bitmapUnder);break;case 1:rv.setImageViewBitmap(R.id.widget_ico_s, bitmapUnder);break;case 2:rv.setImageViewBitmap(R.id.widget_ico_f, bitmapUnder);break;}rv.setImageViewBitmap(R.id.widget_ico_fo, bmp);rv.setImageViewBitmap(R.id.widget_ico_fif, bmp);}else if(size==4){switch (i) {case 0:rv.setImageViewBitmap(R.id.widget_ico_fo, bitmapUnder);break;case 1:rv.setImageViewBitmap(R.id.widget_ico_t, bitmapUnder);break;case 2:rv.setImageViewBitmap(R.id.widget_ico_s, bitmapUnder);break;case 3:rv.setImageViewBitmap(R.id.widget_ico_f, bitmapUnder);break;}rv.setImageViewBitmap(R.id.widget_ico_fif, bmp);}else if(size>4){switch (i) {case 0:rv.setImageViewBitmap(R.id.widget_ico_fif, bitmapUnder);break;case 1:rv.setImageViewBitmap(R.id.widget_ico_fo, bitmapUnder);break;case 2:rv.setImageViewBitmap(R.id.widget_ico_t, bitmapUnder);break;case 3:rv.setImageViewBitmap(R.id.widget_ico_s, bitmapUnder);break;case 4:rv.setImageViewBitmap(R.id.widget_ico_f, bitmapUnder);break;default:break;}}}}}}if(s==null||s.size()==0){rv.setImageViewBitmap(R.id.widget_ico_f, bmp);rv.setImageViewBitmap(R.id.widget_ico_s, bmp);rv.setImageViewBitmap(R.id.widget_ico_t, bmp);rv.setImageViewBitmap(R.id.widget_ico_fo, bmp);rv.setImageViewBitmap(R.id.widget_ico_fif, bmp);}                return rv;  } }


代码写的有点乱,逻辑走的不是很好。


5、service中提到一个R.layout.widget_ico  布局文件


<?xml version="1.0" encoding="utf-8"?>                                                             


基本上就ok了


更新widget的时候只要给service传个值就行了


Intent intent = new Intent(context,WidghtService.class);intent.setAction(WidghtService.START_ACTION);intent.putExtra("update", true);context.startService(intent); 







更多相关文章

  1. Android(安卓)ActionBar完全解析,使用官方推荐的最佳导航栏(下)
  2. Android(安卓)70道面试题汇总
  3. [Android自定义控件] Android(安卓)Scroller工具类和GestureDete
  4. wpa_supplicant适配层 -- 详解
  5. Android:Activity(六):Fragment详解
  6. android自更新时下载出现的问题
  7. Android(安卓)SDK 3.0正式放出 —— 我的使用感受(2/23更新)
  8. android kotlin webview内H5调用微信支付问题
  9. 简单理解View的onMeasure过程

随机推荐

  1. Android下载图片到相册
  2. 安卓开发者一定要收藏的网站
  3. Android路由框架AnnoRouter:使用Java接口
  4. android studio关联源码
  5. [Unity3D]Android发布
  6. android linux 命令记录
  7. Android(安卓)- Looper / Handler / Mess
  8. 如何通过Tesseract开源OCR引擎创建Androi
  9. TextView颜色
  10. android 调用.net 的webservice .