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之路。。。。。。。