Android Widget 电池插件的开发实现


最近突发奇想,想自己编一个Android电池插件放在桌面上,一是这个App确实有它的实用价值,二是编起来工程量应该不是很大,不用花太长时间,三来又能学习下Widget的开发方法,一举三得,于是,暂停下游戏开发的学习,来编一个widget先。

在查找并结合多方资料后终于实现,效果图如下:
长按桌面空白处,出现菜单,点击Widgets,此时的插件已经装入:

 

在电源连接时,机器人周围会星光闪闪,表明正在充电,不在充电时,周围的星光会消失。

机器人身上显示电池电量百分比。


单击机器人图标,会跳出电池信息的详情,再次单击屏幕关闭详情信息。

下面介绍代码的实现:

整个工程主要实现两个部分,一个是AppWidget部分,实现桌面Widget的显示,更新等,另一个部分就是点击widget后出现的显示电池详细信息的Activity的实现了。

首先是AppWidget部分,上代码,NewBatteryWidget.java部分:

  1. package com.ritterliu.newBatteryWidget;  
  2.   
  3. import android.app.AlarmManager;  
  4. import android.app.PendingIntent;  
  5. import android.app.Service;  
  6. import android.appwidget.AppWidgetManager;  
  7. import android.appwidget.AppWidgetProvider;  
  8. import android.content.BroadcastReceiver;  
  9. import android.content.ComponentName;  
  10. import android.content.Context;  
  11. import android.content.Intent;  
  12. import android.content.IntentFilter;  
  13. import android.graphics.Bitmap;  
  14. import android.graphics.BitmapFactory;  
  15. import android.os.IBinder;  
  16. import android.widget.RemoteViews;  
  17.   
  18. public class NewBatteryWidget extends AppWidgetProvider{      
  19.     private static int currentBatteryLevel;  
  20.     private static int currentBatteryStatus;  
  21.   
  22.     public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds)  
  23.     {  
  24.         super.onUpdate(context, appWidgetManager, appWidgetIds);  
  25.       
  26.         /** 启动自动更新电池信息的service */  
  27.         context.startService(new Intent(context,updateService.class));  
  28.       
  29.         /** 为AppWidget设置点击事件的响应,启动显示电池信息详情的activity */   
  30.         Intent startActivityIntent = new Intent(context,NewBatteryInfoActivity.class);  
  31.         PendingIntent Pintent = PendingIntent.getActivity(context,0,startActivityIntent,0);  
  32.         RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.newrelativelayout);  
  33.         views.setOnClickPendingIntent(R.id.imageView,Pintent);  
  34.         appWidgetManager.updateAppWidget(appWidgetIds,views);  
  35.               
  36.     }  
  37.       
  38.     /** 自动更新电池信息的service,通过AlarmManager实现定时不间断地发送电池信息 */  
  39.     public static class updateService extends Service{  
  40.         Bitmap bmp;     //定义机器人图片   
  41.         @Override  
  42.         public IBinder onBind(Intent intent) {  
  43.             // TODO Auto-generated method stub   
  44.             return null;  
  45.         }  
  46.           
  47.         /** 定义一个接收电池信息的broascastReceiver */  
  48.         private BroadcastReceiver batteryReceiver=new BroadcastReceiver()  
  49.         {  
  50.             @Override  
  51.             public void onReceive(Context context, Intent intent) {  
  52.                 // TODO Auto-generated method stub   
  53.                 currentBatteryLevel=intent.getIntExtra("level"0);  
  54.                 currentBatteryStatus=intent.getIntExtra("status"0);  
  55.             }  
  56.               
  57.         };  
  58.           
  59.           
  60.         public void onStart(Intent intent,int startId)  
  61.         {  
  62.             super.onStart(intent, startId);  
  63.               
  64.             /** 注册接收器 */  
  65.             registerReceiver(batteryReceiver,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));  
  66.               
  67.             /** 定义一个AppWidgetManager */  
  68.             AppWidgetManager manager=AppWidgetManager.getInstance(this);  
  69.               
  70.             /** 定义一个RemoteViews,实现对AppWidget界面控制 */  
  71.             RemoteViews views=new RemoteViews(getPackageName(),R.layout.newrelativelayout);  
  72.               
  73.               
  74.             if(currentBatteryStatus==2||currentBatteryStatus==5)    //当正在充电或充满电时,显示充电的图片   
  75.             {  
  76.                 if(currentBatteryLevel>=95)  
  77.                 {  
  78.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.jcharge);  
  79.                 }  
  80.                 else if(currentBatteryLevel>=85&& currentBatteryLevel<95)  
  81.                 {  
  82.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.icharge);  
  83.                 }  
  84.                 else if(currentBatteryLevel>=75&& currentBatteryLevel<85)  
  85.                 {  
  86.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.hcharge);  
  87.                 }  
  88.                 else if(currentBatteryLevel>=65&& currentBatteryLevel<75)  
  89.                 {  
  90.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.gcharge);  
  91.                 }  
  92.                 else if(currentBatteryLevel>=55&& currentBatteryLevel<65)  
  93.                 {  
  94.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.fcharge);  
  95.                 }  
  96.                 else if(currentBatteryLevel>=45&& currentBatteryLevel<55)  
  97.                 {  
  98.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.echarge);      
  99.                 }  
  100.                 else if(currentBatteryLevel>=35&& currentBatteryLevel<45)  
  101.                 {  
  102.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.dcharge);      
  103.                 }  
  104.                 else if(currentBatteryLevel>=25&& currentBatteryLevel<35)  
  105.                 {  
  106.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.ccharge);      
  107.                 }  
  108.                 else if(currentBatteryLevel>=15&& currentBatteryLevel<25)  
  109.                 {  
  110.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.bcharge);  
  111.                 }  
  112.                 else  
  113.                 {  
  114.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.acharge);      
  115.                 }     
  116.             }  
  117.             else    //未在充电时,显示不在充电状态的系列图片   
  118.             {  
  119.                 if(currentBatteryLevel>=95)  
  120.                 {  
  121.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.j);  
  122.                 }  
  123.                 else if(currentBatteryLevel>=85&¤tBatteryLevel<95)  
  124.                 {  
  125.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.i);  
  126.                 }  
  127.                 else if(currentBatteryLevel>=75&¤tBatteryLevel<85)  
  128.                 {  
  129.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.h);  
  130.                 }  
  131.                 else if(currentBatteryLevel>=65&¤tBatteryLevel<75)  
  132.                 {  
  133.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.g);  
  134.                 }  
  135.                 else if(currentBatteryLevel>=55&¤tBatteryLevel<65)  
  136.                 {  
  137.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.f);  
  138.                 }  
  139.                 else if(currentBatteryLevel>=45&¤tBatteryLevel<55)  
  140.                 {  
  141.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.e);    
  142.                 }  
  143.                 else if(currentBatteryLevel>=35&¤tBatteryLevel<45)  
  144.                 {  
  145.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.d);    
  146.                 }  
  147.                 else if(currentBatteryLevel>=25&¤tBatteryLevel<35)  
  148.                 {  
  149.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.c);    
  150.                 }  
  151.                 else if(currentBatteryLevel>=15&¤tBatteryLevel<25)  
  152.                 {  
  153.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.b);  
  154.                 }  
  155.                 else  
  156.                 {  
  157.                     bmp=BitmapFactory.decodeResource(getResources(),R.drawable.a);    
  158.                 }     
  159.             }     
  160.   
  161.             /** 设置AppWidget上显示的图片和文字的内容 */  
  162.                 views.setImageViewBitmap(R.id.imageView,bmp);  
  163.             views.setTextViewText(R.id.tv,currentBatteryLevel+"%");  
  164.               
  165.             ComponentName thisWidget=new ComponentName(this,NewBatteryWidget.class);  
  166.           
  167.             /** 使用AlarmManager实现每隔一秒发送一次更新提示信息,实现信息实时动态变化 */  
  168.             long now=System.currentTimeMillis();  
  169.             long pause=1000;  
  170.               
  171.             Intent alarmIntent=new Intent();  
  172.             alarmIntent=intent;  
  173.               
  174.             PendingIntent pendingIntent=PendingIntent.getService(this0, alarmIntent, 0);  
  175.             AlarmManager alarm=(AlarmManager)getSystemService(Context.ALARM_SERVICE);  
  176.             alarm.set(AlarmManager.RTC_WAKEUP,now+pause,pendingIntent);  
  177.               
  178.             /** 更新AppWidget */  
  179.                         manager.updateAppWidget(thisWidget, views);  
  180.   
  181.         }     
  182.     }  
  183. }  
  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容