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)); } }