• Android 电源系列小结s


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

      

  • 相关阅读:
    hdu 5504 GT and sequence
    解决:Incorrect line ending: found carriage return ( ) without corresponding newline ( )
    hdu 5501 The Highest Mark(贪心+01背包)
    web开发学习之路是否有尽头
    2016年后web开发趋势是什么?
    使用 jQuery Mobile 与 HTML5 开发 Web App 系列文章目录
    web开发微信文章目录
    现代web开发需要学习的15大技术
    移动前端重构实战系列
    什么鬼,又不知道怎么命名class了
  • 原文地址:https://www.cnblogs.com/spring87/p/4494493.html
Copyright © 2020-2023  润新知