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

  

更多相关文章

  1. android 自定义View 对话框
  2. Android获取应用自身相关签名信息
  3. android 捕捉app错误信息
  4. android 自定义相册 多选
  5. 获取Android Device的信息
  6. Android 自定义水平滚动的容器
  7. 自定义ProgressBar的图片

随机推荐

  1. android studio --terminal 命令编译项目
  2. Android 系统蓝牙 控制手机端音乐暂停 (AV
  3. Android系统移植:开发概述
  4. 开启Android(安卓)Q DarkMode | 开启Andr
  5. Android framework工作方式及原理
  6. Android——Service(服务)
  7. Android(安卓)镜像地址[持续更新中]
  8. android 图片透明
  9. Android(安卓)工具
  10. Android(安卓)自动化测试―robotium(五)Spi