最近突发奇想,想自己编一个Android电池插件放在桌面上,一是这个App确实有它的实用价值,二是编起来工程量应该不是很大,不用花太长时间,三来又能学习下Widget的开发方法,一举三得,于是,暂停下游戏开发的学习,来编一个widget先。
在查找并结合多方资料后终于实现,效果图如下:
长按桌面空白处,出现菜单,点击Widgets,此时的插件已经装入:

在电源连接时,机器人周围会星光闪闪,表明正在充电,不在充电时,周围的星光会消失。
机器人身上显示电池电量百分比。

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

下面介绍代码的实现:

整个工程主要实现两个部分,一个是AppWidget部分,实现桌面Widget的显示,更新等,另一个部分就是点击widget后出现的显示电池详细信息的Activity的实现了。
首先是AppWidget部分,上代码,NewBatteryWidget.java部分:
view plain
- 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.widget.RemoteViews;
-
- public class NewBatteryWidget extends AppWidgetProvider{
- private static int currentBatteryLevel;
- private static int currentBatteryStatus;
-
- 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);
- }
-
-