E_MemoryInfo 内存插件widget

E_MemoryInfo 内存插件widget 内存小插件很简单 表盘指针形式,右下角显示可用内存 指针显示当前内存使用比例。

一个widget开发首先是配置一个widget和一个service用来更新widget内容

AndroidManifest.xml配置文件中添加

 <!-- 定义widget广播接收器 -->
         <receiver
            android:label="@string/app_name"
            android:name="com.e.e_memoryinfo.widget.MemoryWidget" >
            <intent-filter >
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/e_memroy_widget"
                />
        </receiver>
          <!-- 声明一个service用来更新widget -->
           <service android:name="com.e.e_memoryinfo.widget.MemoryWidget$updateService"/>
接下来是 widget的配置文件 e_memroy_widget.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minHeight="72dip"
    android:minWidth="72dip"
    android:updatePeriodMillis="1000000"	
    android:initialLayout="@layout/memroy_widget_layout"
    >
 </appwidget-provider>
AppWidgetProvider的子类,内存插件的主要逻辑部分都在这里了。主要功能读取手机内存信息,计算指针偏转角度,画图OK

package com.e.e_memoryinfo.widget;
import java.text.DecimalFormat;

import com.e.e_memoryinfo.MemoryInfoActivity;
import com.e.e_memoryinfo.R;
import com.e.e_memoryinfo.util.MemInfo;

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;

import android.graphics.Paint;
import android.os.Handler;
import android.os.IBinder;

import android.widget.RemoteViews;

public class MemoryWidget extends AppWidgetProvider{
	public static double totalMemory;//总内存
	public static double avilMemory;//可用内存
	//public static boolean isShowDetail=false;//是否显示内存详细
	@Override
	public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds)
	{
		super.onUpdate(context, appWidgetManager, appWidgetIds);
	
		/** 启动自动更新内存信息的service */
		context.startService(new Intent(context,updateService.class));
	
		/** 为AppWidget设置点击事件的响应,启动显示电池信息详情的activity */ 
	   // Intent startActivityIntent = new Intent(context,MemoryInfoActivity.class);
	   // PendingIntent Pintent = PendingIntent.getActivity(context,0,startActivityIntent,0);
	    RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.memroy_widget_layout);
	   // views.setOnClickPendingIntent(R.id.imageView,Pintent);
	    appWidgetManager.updateAppWidget(appWidgetIds,views);
			
	}
	
	 @Override
	 public void onDisabled(Context context)
	 {
	  super.onDisabled(context);
	  //System.out.println("onDisabled 停止service");
	  Intent intent=new Intent(context,updateService.class);
	  context.stopService(intent);
	 }
	 /**
	  * 读取配置文件
	  */
	/* public static void readSharedPreferences(){
		 SharedPreferences settings = getSharedPreferences("memorywidgetConfig", MODE_WORLD_READABLE);
		 isShowDetail=settings.getBoolean("isShow", false);
	 }*/
	/**
	 * 更新widget 实时获取内存信息
	 * @author Administrator
	 *
	 */
	public static class updateService extends Service{
		int delaytime=1000;//更新时间
		int freeMemory;//可用内存
		private int handSize=10;//指针长度
		public double handRadian=345;//旋转角度 345-555
		private float centerX=0;//指针中心x坐标
		private float centerY=0;
		private Bitmap dital;//表盘图片
		@Override
		public void onCreate() {
			//------初始化表盘图片
		  BitmapFactory.Options opt = new BitmapFactory.Options();  
 		  opt.inPreferredConfig = Bitmap.Config.RGB_565;   
 		  opt.inPurgeable = true; 
 		  opt.inInputShareable = true;  
 		  dital=BitmapFactory.decodeStream(this.getBaseContext().getResources().openRawResource(R.drawable.hidal),null,opt); 
 		 centerX=dital.getWidth()/2;
 		 centerX=dital.getHeight()/2;
 		 //获取手机总内存
 		totalMemory=MemInfo.getTotalMemory();
		}
		@Override
		public IBinder onBind(Intent intent) {
			// TODO Auto-generated method stub
			return null;
		}
		private Handler handler = new Handler();
		private Runnable task = new Runnable() {
			public void run() {
				dataRefresh();//更新数据
				updateView();//更新widget
				handler.postDelayed(this, delaytime);//添加到线程队列
				
			}
		};

		public void dataRefresh() {
			DecimalFormat df = new DecimalFormat("0.0000");//
			//usedMemory=Double.parseDouble(df.format(MemInfo.getTotalMemory()-MemInfo.getAvailMemory(this)));
			avilMemory=MemInfo.getAvailMemory(this);//可用内存
			freeMemory=(int)avilMemory;//可用内存(取整)
			double percent=(totalMemory-MemInfo.getAvailMemory(this))/totalMemory;
			//System.out.println("已用百分: "+Double.parseDouble(df.format(percent)));
		    handRadian=263+270*Double.parseDouble(df.format(percent));//计算指针旋转角度
		}
		@Override
		public void onDestroy() {
			handler.removeCallbacks(task);
			super.onDestroy();
		}
		@Override
		public void onStart(Intent intent,int startId)
		{
			super.onStart(intent, startId);
			handler.postDelayed(task, delaytime);//添加到队列
		}	
		/**
		 * 更新widget视图
		 */
		public void updateView(){
			
			/** 定义一个AppWidgetManager */
			AppWidgetManager manager=AppWidgetManager.getInstance(this);
			
			/** 定义一个RemoteViews,实现对AppWidget界面控制 */
			RemoteViews views=new RemoteViews(getPackageName(),R.layout.memroy_widget_layout);

			/** 设置AppWidget上显示的图片和文字的内容 */
			
		    views.setImageViewBitmap(R.id.imageView,createBitmap(dital,handRadian,freeMemory));//更新视图
			ComponentName thisWidget=new ComponentName(this,MemoryWidget.class);
			/** 更新AppWidget */
            manager.updateAppWidget(thisWidget, views);
		}
	     /**
	      * 在表盘上画指针
	      * @return
	      */
	    private Bitmap createBitmap(Bitmap background,double Radian,int memroyInfo)  
	     {    
	    	 centerX=background.getWidth()/2;
	    	 centerY=background.getHeight()/2;
	 		 handSize=background.getWidth()/2-50;
	    	 Bitmap bg=background.copy(Bitmap.Config.ARGB_8888, true);
	         Canvas canvas = new Canvas(bg);//以Bitmap为背景的画布
	         Paint paint = new Paint();
	         paint.setStrokeWidth(8);//线粗细
	    	 paint.setColor(Color.RED);//红色
	    	 paint.setTextSize(50);//字体
	    	 canvas.drawLine(centerX, centerY, (int)Math.abs(centerX-handSize * Math.cos(Radian*Math.PI/180)),
	    			 (int) Math.abs(centerY - Math.sin(Radian*Math.PI/180) * handSize), paint);//画指针
	    	
	    	 canvas.drawText(memroyInfo+"",centerX+33, centerY+centerY/2, paint);//显示文本
	         
	         /*   Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.hand2);  
	            Matrix matrix=new Matrix();
	            matrix.postScale(0.7f, 0.8f);
	            matrix.postRotate(45);//,20,bmp.getHeight()/2
	            Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
	            canvas.drawBitmap(dstbmp,centerX-30,
	            		centerY-30, null); */
	            
	            canvas.save( Canvas.ALL_SAVE_FLAG );//保存  
	            canvas.restore();//存储  
	         return bg;  
	     }
	}
}
取手机内存信息工具类:

package com.e.e_memoryinfo.util;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.content.Context;
/**
 * 获取内存信息
 * @author Administrator
 *
 */
public class MemInfo {
	
	/**
	 * 可用内存
	 * @param mContext
	 * @return
	 */
   public static double getAvailMemory(Context mContext) {
	 ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
	 MemoryInfo mi = new MemoryInfo();
     am.getMemoryInfo(mi);
	 //mi.availMem; 当前系统的可用内
	DecimalFormat df = new DecimalFormat("0.00");//保留2位小数
	return Double.parseDouble(df.format((double)mi.availMem/(1024*1024)));//转化为MB
	}
	/**
	 * 总内存
	 * @return
	 */
	public static double getTotalMemory() {
		double mTotal;
		// 系统内存
		String path = "/proc/meminfo";
		// 存储器内
		String content = null;
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(path), 8);
			String line;
			if ((line = br.readLine()) != null) {
				// 采集内存信息
				content = line;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (br != null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		// beginIndex
		int begin = content.indexOf(':');
		// endIndex
		int end = content.indexOf('k');
		// 采集数量的内
		content = content.substring(begin + 1, end).trim();
		// 转换为Int
		mTotal = Double.parseDouble(content)/1024;//单位为M
		DecimalFormat df = new DecimalFormat("0.00");//保留2位小数
		return Double.parseDouble(df.format(mTotal));
	}	
}

第一次写widget,大部分参考自互联网,唉坦白的讲我只能算是半个程序猿吧。android之路。。。。。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值