Android 电源系列小结s
16lz
2021-01-23
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的标志位置为trueinfoReceiver=new BroadcastReceiver()//提示信息接收器的定义{@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubsetText();//收到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;}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubflag=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{@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}/** 定义得到电池信息的BroadcastReceiver,提取出关键信息,存入变量中 */private BroadcastReceiver batteryReceiver=new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubcurrentBatteryStatus=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;//定义机器人图片@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}/** 定义一个接收电池信息的broascastReceiver */private BroadcastReceiver batteryReceiver=new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubcurrentBatteryLevel=intent.getIntExtra("level", 0);currentBatteryStatus=intent.getIntExtra("status", 0);}};private BroadcastReceiver powerConnectedReceiver=new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubsetViews();}};private BroadcastReceiver powerDisconnectedReceiver=new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubsetViews();}};/** 设置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();}}}
更多相关文章
- android 自定义View 对话框
- Android获取应用自身相关签名信息
- android 捕捉app错误信息
- android 自定义相册 多选
- 获取Android Device的信息
- Android 自定义水平滚动的容器
- 自定义ProgressBar的图片