android weiget 实时数据更新
16lz
2021-01-26
转自: 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"?>
更新widget的时候只要给service传个值就行了
Intent intent = new Intent(context,WidghtService.class);intent.setAction(WidghtService.START_ACTION);intent.putExtra("update", true);context.startService(intent);
更多相关文章
- Android(安卓)ActionBar完全解析,使用官方推荐的最佳导航栏(下)
- Android(安卓)70道面试题汇总
- [Android自定义控件] Android(安卓)Scroller工具类和GestureDete
- wpa_supplicant适配层 -- 详解
- Android:Activity(六):Fragment详解
- android自更新时下载出现的问题
- Android(安卓)SDK 3.0正式放出 —— 我的使用感受(2/23更新)
- android kotlin webview内H5调用微信支付问题
- 简单理解View的onMeasure过程