android weiget 实时数据更新

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

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

要求如图   

是一个widget



点击widget

android weiget 实时数据更新_第1张图片


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


创建widget的过程


1、  先看AndroidManifest.xml


 
        

  
	 
	     
	
	

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






注意 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;
	
	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {//有部分被删除就会执行
		// TODO Auto-generated method stub
		super.onDeleted(context, appWidgetIds);
	}


	@Override
	public void onEnabled(Context context) {//当第一次添加部件到卓面时会调用该 方法
		// TODO Auto-generated method stub
		super.onEnabled(context);
	}


	@Override
	public void onDisabled(Context context) {//在最后一个同类型部件被删除的时候调用
		context.stopService(new Intent(context, WidghtService.class));
	}


	@Override
	public 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;
	@Override
	public void onCreate() {
		super.onCreate();
	}
	
	@Override
	public 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); 
				}
			}
		}
	}

	@Override
	public void onDestroy() {
		
		super.onDestroy();
	}

	@Override
	public 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  布局文件




    
		  
	
	  
	      
	  
	  
	      	
	   
	   
	       	
	    
		 
			  
		  
		 
			  
			
  	  
		  
	  		
    


基本上就ok了


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


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







你可能感兴趣的:(android)