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