且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Android 电源系列小结s

更新时间:2022-06-01 17:25:26

package com.ritterliu.newBatteryWidget;

import android.app.Activity;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.IBinder;
import android.view.MotionEvent;
import android.view.Window;
import android.widget.TextView;

public class NewBatteryInfoActivity extends Activity{
	/** 定义电池信息变量  */
	private static int currentBatteryPlugged=0;
	private static int currentBatteryStatus=0;
	private static int currentBatteryLevel=0;
	private static int currentBatteryHealth=0;
	private static int currentBatteryTemperature=0;
	private static int currentBatteryVoltage=0;
	private static String currentBatteryTechnology="";

	
	/** TextView 声明 */
    private static TextView tvBatteryStatus;
    private static TextView tvBatteryLevel;
    private static TextView tvBatteryHealth;
    private static TextView tvBatteryTemperature;
    private static TextView tvBatteryVoltage;
    private static TextView tvBatteryTechnology;
	
    /** 定义好字符串以备使用 */
	private static String batteryStatus="电池状态: ";
	private static String batteryLevel="电池电量: ";
	private static String batteryHealth="电池健康: ";
	private static String batteryTemperature="电池温度: ";
	private static String batteryVoltage="电池电压: ";
	private static String  batteryTechnology="电池技术: ";
	
    private static String  batteryStatusCharging="正在充电";
    private static String  batteryStatusDischarging="正在放电";
    private static String  batteryStatusFull="已充满";
    private static String  batteryStatusNotCharging="未在充电";
    private static String  batteryStatusUnknown="状态未知";
        
    private static String  batteryPluggedAC="(AC)";
    private static String  batteryPluggedUSB="(USB)";
        
    private static String  batteryHealthCold="过冷";
    private static String  batteryHealthDead="损坏";
    private static String  batteryHealthGood="良好";
    private static String  batteryHealthOverheat="过热";
    private static String  batteryHealthOverVoltage="过压";
    private static String  batteryHealthUnknown="未知";
    private static String  batteryHealthUnspecifiedFailure="未知的故障";
	
    /** 提示Service启动标志位 */
	private static boolean flag;
	
	/** 提示信息接收器 */
	BroadcastReceiver infoReceiver;
	
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);		//设置activity无标题
		setContentView(R.layout.newlayout);		//使用newlayout的布局
		
		tvBatteryStatus=(TextView)findViewById(R.id.tvBatteryStatus);
		tvBatteryLevel=(TextView)findViewById(R.id.tvBatteryLevel);
		tvBatteryHealth=(TextView)findViewById(R.id.tvBatteryHealth);
		tvBatteryTemperature=(TextView)findViewById(R.id.tvBatteryTemperature);
		tvBatteryVoltage=(TextView)findViewById(R.id.tvBatteryVoltage);
		tvBatteryTechnology=(TextView)findViewById(R.id.tvBatteryTechnology);
		
		flag=true;		//提示service的标志位置为true
		
		infoReceiver=new BroadcastReceiver()	//提示信息接收器的定义
		{
			@Override
			public void onReceive(Context context, Intent intent) {
				// TODO Auto-generated method stub
				setText();		//收到intent,就及时修改TextView信息,使得Activity显示时,电池信息也能动态显示
			}
		};
		
		/** 注册提示信息的intentFilter */
		IntentFilter filter=new IntentFilter();
		filter.addAction("com.ritterliu.newBatteryWidget");
		registerReceiver(infoReceiver,filter);

		/** 启动提示service */
		Intent startService=new Intent(this,updateService.class);
		startService(startService);
		
	}
	
	/** 点击屏幕任意位置,关闭电池信息Activity */
	public boolean onTouchEvent(MotionEvent event)
	{
		this.finish();
	//	onDestroy();
	//	System.exit(0);
		return true;
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		flag=false;
		unregisterReceiver(infoReceiver);
		super.onDestroy();
	}

	/** 及时动态修改Activity上文字信息的函数 */
	public static  void setText()
	{
		String plugState="";
		switch(currentBatteryPlugged)
		{
		case 0:
			plugState="";
			break;
		case 1:
			plugState=batteryPluggedAC;
			break;
		case 2:
			plugState=batteryPluggedUSB;
			break;
		default:
			plugState="";
		}

		switch(currentBatteryStatus)
		{
		case 1:
			tvBatteryStatus.setText(batteryStatus+batteryStatusUnknown);
			break;
		case 2:
			tvBatteryStatus.setText(batteryStatus+batteryStatusCharging+plugState);
			break;
		case 3:
			tvBatteryStatus.setText(batteryStatus+batteryStatusDischarging);
			break;
		case 4:
			tvBatteryStatus.setText(batteryStatus+batteryStatusNotCharging);
			break;
		case 5:
			tvBatteryStatus.setText(batteryStatus+batteryStatusFull+plugState);
			break;
		default:
			tvBatteryStatus.setText(batteryStatus+batteryStatusUnknown);
		}
		
		tvBatteryLevel.setText(batteryLevel+String.valueOf(currentBatteryLevel)+"%");
		
		switch(currentBatteryHealth)
		{
		case 1:
			tvBatteryHealth.setText(batteryHealth+batteryHealthUnknown);
			break;
		case 2:
			tvBatteryHealth.setText(batteryHealth+batteryHealthGood);
			break;
		case 3:
			tvBatteryHealth.setText(batteryHealth+batteryHealthOverheat);
			break;
		case 4:
			tvBatteryHealth.setText(batteryHealth+batteryHealthDead);
			break;
		case 5:
			tvBatteryHealth.setText(batteryHealth+batteryHealthOverVoltage);
			break;
		case 6:
			tvBatteryHealth.setText(batteryHealth+batteryHealthUnspecifiedFailure);
			break;
		case 7:
			tvBatteryHealth.setText(batteryHealth+batteryHealthCold);
			break;
		default:
			tvBatteryHealth.setText(batteryHealth+batteryHealthUnknown);
		}
		
		tvBatteryTemperature.setText(batteryTemperature+currentBatteryTemperature/10f+"℃");
		tvBatteryVoltage.setText(batteryVoltage+currentBatteryVoltage+"mv");
		tvBatteryTechnology.setText(batteryTechnology+currentBatteryTechnology);
	}
	
	/** 提示信息变化的service,约每隔一秒,就发送intent,
	 * 提醒activity更新电池信息,主要为了检测电池状态的变化,
	 * 例如连上充电时,状态会从“未在充电”变为“正在充电”
	 * 通过调用plugged方式,还能判断是AC方式充电还是USB方式充电
	 */
	public static class updateService extends Service{
		@Override
		public IBinder onBind(Intent intent) {
			// TODO Auto-generated method stub
			return null;
		}
		
		/** 定义得到电池信息的BroadcastReceiver,提取出关键信息,存入变量中 */
		private BroadcastReceiver batteryReceiver=new BroadcastReceiver()
		{
			@Override
			public void onReceive(Context context, Intent intent) {
				// TODO Auto-generated method stub
				currentBatteryStatus=intent.getIntExtra("status", 0);
				currentBatteryLevel=intent.getIntExtra("level", 0);
				currentBatteryHealth=intent.getIntExtra("health", 0);
				currentBatteryTemperature=intent.getIntExtra("temperature",0);
				currentBatteryVoltage=intent.getIntExtra("voltage",0);
				currentBatteryTechnology=intent.getStringExtra("technology");
				currentBatteryPlugged=intent.getIntExtra("plugged",0);
			}
		};
		
		
		public void onStart(Intent intent,int startId)
		{
			registerReceiver(batteryReceiver,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));//注册BroadcastReceiver
		
			/** 启动一个线程,约每隔一秒就发送intent提醒Activity更新电池信息 */
			new Thread()
			{
				public void run()
				{
					while(flag)
					{
			            Intent sendInfoToActivity=new Intent();
			            sendInfoToActivity.setAction("com.ritterliu.newBatteryWidget");
			            sendBroadcast(sendInfoToActivity);
		
						try
						{
							Thread.sleep(1000);
						}
						catch(Exception ex)
						{
							ex.printStackTrace();
						}
					}
				}
			}.start();
			super.onStart(intent, startId);
		}
	}
}

  

 

 

 

package com.ritterliu.newBatteryWidget;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.IBinder;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;

public class NewBatteryWidget extends AppWidgetProvider{
	
	private static int currentBatteryLevel;
	private static int currentBatteryStatus;

	private static boolean firstTimeToCreate=true;
	
	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,NewBatteryInfoActivity.class);
	    PendingIntent Pintent = PendingIntent.getActivity(context,0,startActivityIntent,0);
	    RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.newrelativelayout);
	    views.setOnClickPendingIntent(R.id.imageView,Pintent);
	    appWidgetManager.updateAppWidget(appWidgetIds,views);
			
	}
	
	/** 自动更新电池信息的service,通过AlarmManager实现定时不间断地发送电池信息 */
	public static class updateService extends Service{
		Bitmap bmp;		//定义机器人图片
		@Override
		public IBinder onBind(Intent intent) {
			// TODO Auto-generated method stub
			return null;
		}
		
		/** 定义一个接收电池信息的broascastReceiver */
		
		private BroadcastReceiver batteryReceiver=new BroadcastReceiver()
		{
			@Override
			public void onReceive(Context context, Intent intent) {
				// TODO Auto-generated method stub
				currentBatteryLevel=intent.getIntExtra("level", 0);
				currentBatteryStatus=intent.getIntExtra("status", 0);
			}
			
		};
		
		private BroadcastReceiver powerConnectedReceiver=new BroadcastReceiver()
		{
			@Override
			public void onReceive(Context context, Intent intent) {
				// TODO Auto-generated method stub
				setViews();	
			}
		};
		
		private BroadcastReceiver powerDisconnectedReceiver=new BroadcastReceiver()
		{
			@Override
			public void onReceive(Context context, Intent intent) {
				// TODO Auto-generated method stub
				setViews();

			}
		};
		
		/** 设置Widget的显示 */
		private void setViews()
		{
			/** 定义一个AppWidgetManager */
			AppWidgetManager manager=AppWidgetManager.getInstance(this);
			
			/** 定义一个RemoteViews,实现对AppWidget界面控制 */
			RemoteViews views=new RemoteViews(getPackageName(),R.layout.newrelativelayout);
			
			if(currentBatteryStatus==2||currentBatteryStatus==5)	//当正在充电或充满电时,显示充电的图片
			{
			    if(currentBatteryLevel>=95)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.jcharge);
			    }
			    else if(currentBatteryLevel>=85&& currentBatteryLevel<95)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.icharge);
			    }
			    else if(currentBatteryLevel>=75&& currentBatteryLevel<85)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.hcharge);
			    }
			    else if(currentBatteryLevel>=65&& currentBatteryLevel<75)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.gcharge);
			    }
			    else if(currentBatteryLevel>=55&& currentBatteryLevel<65)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.fcharge);
			    }
			    else if(currentBatteryLevel>=45&& currentBatteryLevel<55)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.echarge);	
			    }
			    else if(currentBatteryLevel>=35&& currentBatteryLevel<45)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.dcharge);	
			    }
			    else if(currentBatteryLevel>=25&& currentBatteryLevel<35)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.ccharge);	
			    }
			    else if(currentBatteryLevel>=15&& currentBatteryLevel<25)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.bcharge);
			    }
			    else
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.acharge);	
			    }   
			}
			else	//未在充电时,显示不在充电状态的系列图片
			{
			    if(currentBatteryLevel>=95)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.j);
			    }
			    else if(currentBatteryLevel>=85&& currentBatteryLevel<95)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.i);
			    }
			    else if(currentBatteryLevel>=75&& currentBatteryLevel<85)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.h);
			    }
			    else if(currentBatteryLevel>=65&& currentBatteryLevel<75)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.g);
			    }
			    else if(currentBatteryLevel>=55&& currentBatteryLevel<65)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.f);
			    }
			    else if(currentBatteryLevel>=45&& currentBatteryLevel<55)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.e);	
			    }
			    else if(currentBatteryLevel>=35&& currentBatteryLevel<45)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.d);	
			    }
			    else if(currentBatteryLevel>=25&& currentBatteryLevel<35)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.c);	
			    }
			    else if(currentBatteryLevel>=15&& currentBatteryLevel<25)
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.b);
			    }
			    else
			    {
			    	bmp=BitmapFactory.decodeResource(getResources(),R.drawable.a);	
			    }   
			}   
		
			/** 设置AppWidget上显示的图片和文字的内容 */
		    views.setImageViewBitmap(R.id.imageView,bmp);
			views.setTextViewText(R.id.tv,currentBatteryLevel+"%");
			
			ComponentName thisWidget=new ComponentName(this,NewBatteryWidget.class);

			/** 更新AppWidget */
            manager.updateAppWidget(thisWidget, views);
			
		}
		
		public void onStart(Intent intent,int startId)
		{
			super.onStart(intent, startId);

			/** 注册接收器 */
			registerReceiver(batteryReceiver,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
			
			/** 增加了对于POWER_CONNECTED和DISCONNECTED事件的监听,
			 * 以实现充电时信息的动态变化,避免了原来需要依赖AlarmManager
			 * 每隔一秒发送检测信息来实现,节约了电量,用原来隔一秒更新的方法,
			 * 经过一夜测试,插件耗电量居然占到了8%,汗。。。
			 * 
			 * */
			registerReceiver(powerConnectedReceiver,new IntentFilter(Intent.ACTION_POWER_CONNECTED));
			registerReceiver(powerDisconnectedReceiver,new IntentFilter(Intent.ACTION_POWER_DISCONNECTED ));
			
			/** 使用AlarmManager实现,第一次启动Widget时隔一秒立即更新,
			 * 以后均为一分钟发送一次更新提示信息,实现信息实时动态变化,
			 * 实现节电功能
			 *  */
			long now=System.currentTimeMillis();
			long pause;
			
			if(firstTimeToCreate)
			{
				firstTimeToCreate=false;
				pause=1000;
			}
			else
			{
				pause=1000*60*2;
			}
			
			Intent alarmIntent=new Intent();
			alarmIntent=intent;
			
			PendingIntent pendingIntent=PendingIntent.getService(this, 0, alarmIntent, 0);
			AlarmManager alarm=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
			alarm.set(AlarmManager.RTC_WAKEUP,now+pause,pendingIntent);
			
			setViews();

		}	
	}
}