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



發佈了28 篇原創文章 · 獲贊 24 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章