歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android Widget 電池插件的開發實現

Android Widget 電池插件的開發實現

日期:2017/3/1 11:02:34   编辑:Linux編程
最近突發奇想,想自己編一個Android電池插件放在桌面上,一是這個App確實有它的實用價值,二是編起來工程量應該不是很大,不用花太長時間,三來又能學習下Widget的開發方法,一舉三得,於是,暫停下游戲開發的學習,來編一個widget先。

在查找並結合多方資料後終於實現,效果圖如下:
長按桌面空白處,出現菜單,點擊Widgets,此時的插件已經裝入:

在電源連接時,機器人周圍會星光閃閃,表明正在充電,不在充電時,周圍的星光會消失。

機器人身上顯示電池電量百分比。


單擊機器人圖標,會跳出電池信息的詳情,再次單擊屏幕關閉詳情信息。

下面介紹代碼的實現:

整個工程主要實現兩個部分,一個是AppWidget部分,實現桌面Widget的顯示,更新等,另一個部分就是點擊widget後出現的顯示電池詳細信息的Activity的實現了。

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

  1. package com.ritterliu.newBatteryWidget;
  2. import android.app.AlarmManager;
  3. import android.app.PendingIntent;
  4. import android.app.Service;
  5. import android.appwidget.AppWidgetManager;
  6. import android.appwidget.AppWidgetProvider;
  7. import android.content.BroadcastReceiver;
  8. import android.content.ComponentName;
  9. import android.content.Context;
  10. import android.content.Intent;
  11. import android.content.IntentFilter;
  12. import android.graphics.Bitmap;
  13. import android.graphics.BitmapFactory;
  14. import android.os.IBinder;
  15. import android.widget.RemoteViews;
  16. public class NewBatteryWidget extends AppWidgetProvider{
  17. private static int currentBatteryLevel;
  18. private static int currentBatteryStatus;
  19. public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds)
  20. {
  21. super.onUpdate(context, appWidgetManager, appWidgetIds);
  22. /** 啟動自動更新電池信息的service */
  23. context.startService(new Intent(context,updateService.class));
  24. /** 為AppWidget設置點擊事件的響應,啟動顯示電池信息詳情的activity */
  25. Intent startActivityIntent = new Intent(context,NewBatteryInfoActivity.class);
  26. PendingIntent Pintent = PendingIntent.getActivity(context,0,startActivityIntent,0);
  27. RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.newrelativelayout);
  28. views.setOnClickPendingIntent(R.id.imageView,Pintent);
  29. appWidgetManager.updateAppWidget(appWidgetIds,views);
  30. }
  31. /** 自動更新電池信息的service,通過AlarmManager實現定時不間斷地發送電池信息 */
  32. public static class updateService extends Service{
  33. Bitmap bmp; //定義機器人圖片
  34. @Override
  35. public IBinder onBind(Intent intent) {
  36. // TODO Auto-generated method stub
  37. return null;
  38. }
  39. /** 定義一個接收電池信息的broascastReceiver */
  40. private BroadcastReceiver batteryReceiver=new BroadcastReceiver()
  41. {
  42. @Override
  43. public void onReceive(Context context, Intent intent) {
  44. // TODO Auto-generated method stub
  45. currentBatteryLevel=intent.getIntExtra("level", 0);
  46. currentBatteryStatus=intent.getIntExtra("status", 0);
  47. }
  48. };
  49. public void onStart(Intent intent,int startId)
  50. {
  51. super.onStart(intent, startId);
  52. /** 注冊接收器 */
  53. registerReceiver(batteryReceiver,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
  54. /** 定義一個AppWidgetManager */
  55. AppWidgetManager manager=AppWidgetManager.getInstance(this);
  56. /** 定義一個RemoteViews,實現對AppWidget界面控制 */
  57. RemoteViews views=new RemoteViews(getPackageName(),R.layout.newrelativelayout);
  58. if(currentBatteryStatus==2||currentBatteryStatus==5) //當正在充電或充滿電時,顯示充電的圖片
  59. {
  60. if(currentBatteryLevel>=95)
  61. {
  62. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.jcharge);
  63. }
  64. else if(currentBatteryLevel>=85&& currentBatteryLevel<95)
  65. {
  66. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.icharge);
  67. }
  68. else if(currentBatteryLevel>=75&& currentBatteryLevel<85)
  69. {
  70. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.hcharge);
  71. }
  72. else if(currentBatteryLevel>=65&& currentBatteryLevel<75)
  73. {
  74. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.gcharge);
  75. }
  76. else if(currentBatteryLevel>=55&& currentBatteryLevel<65)
  77. {
  78. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.fcharge);
  79. }
  80. else if(currentBatteryLevel>=45&& currentBatteryLevel<55)
  81. {
  82. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.echarge);
  83. }
  84. else if(currentBatteryLevel>=35&& currentBatteryLevel<45)
  85. {
  86. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.dcharge);
  87. }
  88. else if(currentBatteryLevel>=25&& currentBatteryLevel<35)
  89. {
  90. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.ccharge);
  91. }
  92. else if(currentBatteryLevel>=15&& currentBatteryLevel<25)
  93. {
  94. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.bcharge);
  95. }
  96. else
  97. {
  98. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.acharge);
  99. }
  100. }
  101. else //未在充電時,顯示不在充電狀態的系列圖片
  102. {
  103. if(currentBatteryLevel>=95)
  104. {
  105. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.j);
  106. }
  107. else if(currentBatteryLevel>=85&¤tBatteryLevel<95)
  108. {
  109. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.i);
  110. }
  111. else if(currentBatteryLevel>=75&¤tBatteryLevel<85)
  112. {
  113. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.h);
  114. }
  115. else if(currentBatteryLevel>=65&¤tBatteryLevel<75)
  116. {
  117. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.g);
  118. }
  119. else if(currentBatteryLevel>=55&¤tBatteryLevel<65)
  120. {
  121. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.f);
  122. }
  123. else if(currentBatteryLevel>=45&¤tBatteryLevel<55)
  124. {
  125. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.e);
  126. }
  127. else if(currentBatteryLevel>=35&¤tBatteryLevel<45)
  128. {
  129. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.d);
  130. }
  131. else if(currentBatteryLevel>=25&¤tBatteryLevel<35)
  132. {
  133. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.c);
  134. }
  135. else if(currentBatteryLevel>=15&¤tBatteryLevel<25)
  136. {
  137. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.b);
  138. }
  139. else
  140. {
  141. bmp=BitmapFactory.decodeResource(getResources(),R.drawable.a);
  142. }
  143. }
  144. /** 設置AppWidget上顯示的圖片和文字的內容 */
  145. views.setImageViewBitmap(R.id.imageView,bmp);
  146. views.setTextViewText(R.id.tv,currentBatteryLevel+"%");
  147. ComponentName thisWidget=new ComponentName(this,NewBatteryWidget.class);
  148. /** 使用AlarmManager實現每隔一秒發送一次更新提示信息,實現信息實時動態變化 */
  149. long now=System.currentTimeMillis();
  150. long pause=1000;
  151. Intent alarmIntent=new Intent();
  152. alarmIntent=intent;
  153. PendingIntent pendingIntent=PendingIntent.getService(this, 0, alarmIntent, 0);
  154. AlarmManager alarm=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
  155. alarm.set(AlarmManager.RTC_WAKEUP,now+pause,pendingIntent);
  156. /** 更新AppWidget */
  157. manager.updateAppWidget(thisWidget, views);
  158. }
  159. }
  160. }
Copyright © Linux教程網 All Rights Reserved