Android Widget 电池插件的开发实现(2)

本次开发大概前后折腾了4天时间,这其中绕了一段弯路(就是那个Android:updatePeriodMillis),不仅学习了如何开发Widget,还对Activity的一些写法,比如设置风格为Dialog等又有了进一步的学习,在关闭Activity时,我是直接调用的finish关闭的,也许在用法上还有不当之处,本人从9月份开始自学Android开发至今两个多月的时间,开发水平还十分有限,代码中有写的不好的地方还请大家多多指点,不甚感激。

更新于2011.11.14 15:17

经过昨晚一夜的测试,发现在AppWidget中设置AlarmManager每隔一秒刷新一次频率太高,过于费电了,一夜耗电量居然占到了8%,故针对这个问题正在修改,修改完成后将及时上传。

使用AlarmManager实现每隔一秒刷新一次主要是为了实现实时的充电状态的检测,电池信息的更新自然不用这么频繁,修改中。。。

修改完成,原来的通过AlarmManager每隔一秒刷新一次实现的对充电事件的及时响应改为对ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED监听来实现。

就修改了AppWidget部分:

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(this0, alarmIntent, 0);               AlarmManager alarm=(AlarmManager)getSystemService(Context.ALARM_SERVICE);               alarm.set(AlarmManager.RTC_WAKEUP,now+pause,pendingIntent);                              setViews();              }          }   }  

源码下载地址:

免费下载地址在

用户名与密码都是

具体下载目录在 /pub/Android源码集锦/2011年/11月/Android Widget 电池插件的开发实现/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wysfwg.html