点击打开链接

Android 通过BatteryService对电量进行自动管理。在BatteryService.java中从jni层获得电量mBatteryLevel,  并根据mBatteryLevel判断手机电量是否过低,然后发出警告或声音提醒,并且太低时还会自动关机。下面简单介绍一下其流程。

在BatteryService.java中判断当前电量是否过低:

[java] view plaincopy
  1. /* The ACTION_BATTERY_LOW broadcast is sent in these situations:
  2. * - is just un-plugged (previously was plugged) and battery level is
  3. *   less than or equal to WARNING, or
  4. * - is not plugged and battery level falls to WARNING boundary
  5. *   (becomes <= mLowBatteryWarningLevel).
  6. */
  7. final boolean sendBatteryLow = !plugged
  8. && mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
  9. && mBatteryLevel <= mLowBatteryWarningLevel
  10. && (oldPlugged || mLastBatteryLevel > mLowBatteryWarningLevel);

如果当前电量小于警告电量(在config.xml中 <integer name="config_lowBatteryWarningLevel">15</integer>)则弹出电量低提示,或者电量为0(当然这个有误差也可能是5%时就自动关机)时自动关机。如果低电量的话就发送一个广播出去:

[java] view plaincopy
  1. if (sendBatteryLow) {
  2. mSentLowBatteryBroadcast = true;
  3. statusIntent.setAction(Intent.ACTION_BATTERY_LOW);
  4. mContext.sendBroadcast(statusIntent);
  5. }

下面这段代码是电量过低而自动关机:

[java] view plaincopy
  1. private void More ...shutdownIfNoPowerLocked() {
  2. // shut down gracefully if our battery is critically low and we are not powered.
  3. // wait until the system has booted before attempting to display the shutdown dialog.
  4. if (mBatteryLevel == 0 && !isPoweredLocked(BatteryManager.BATTERY_PLUGGED_ANY)) {
  5. mHandler.post(new Runnable() {
  6. @Override
  7. public void More ...run() {
  8. if (ActivityManagerNative.isSystemReady()) {
  9. Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
  10. intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
  11. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  12. mContext.startActivityAsUser(intent, UserHandle.CURRENT);
  13. }
  14. }
  15. });
  16. }
  17. }

而在StatusBarPolicy.java中会接收广播, 里面有判断当接受到ACTION_BATTERY_LOW时, 调用onBatteryLow(intent)方法来处理:

[java] view plaincopy
  1. private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. String action = intent.getAction();
  5. .....action.
  6. //里面会有判断当接受到ACTION_BATTERY_LOW时:
  7. else if (action.equals(Intent.ACTION_BATTERY_LOW)) {
  8. onBatteryLow(intent);
  9. }
  10. }
  11. }
  12. private void onBatteryLow(Intent intent) {
  13. if (SHOW_LOW_BATTERY_WARNING) {
  14. if (false) {
  15. Slog.d(TAG, "mPhoneState=" + mPhoneState
  16. + " mLowBatteryDialog=" + mLowBatteryDialog
  17. + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
  18. }
  19. if (SHOW_BATTERY_WARNINGS_IN_CALL || mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
  20. showLowBatteryWarning();
  21. } else {
  22. mBatteryShowLowOnEndCall = true;
  23. }
  24. }
  25. }

弹出低电量过低Dialog提醒和声音提醒:

[java] view plaincopy
  1. private void showLowBatteryWarning() {
  2. closeLastBatteryView();
  3. // Show exact battery level.
  4. CharSequence levelText = mContext.getString(R.string.battery_low_percent_format, mBatteryLevel);
  5. if (mBatteryLevelTextView != null) {
  6. mBatteryLevelTextView.setText(levelText);
  7. } else {
  8. View v = View.inflate(mContext, R.layout.battery_low, null);
  9. mBatteryLevelTextView=(TextView)v.findViewById(R.id.level_percent);
  10. mBatteryLevelTextView.setText(levelText);
  11. AlertDialog.Builder b = new AlertDialog.Builder(mContext);
  12. b.setCancelable(true);
  13. b.setTitle(R.string.battery_low_title);
  14. b.setView(v);
  15. b.setIcon(android.R.drawable.ic_dialog_alert);
  16. b.setPositiveButton(android.R.string.ok, null);
  17. final Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
  18. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
  19. | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
  20. | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
  21. | Intent.FLAG_ACTIVITY_NO_HISTORY);
  22. if (intent.resolveActivity(mContext.getPackageManager()) != null) {
  23. b.setNegativeButton(R.string.battery_low_why, new DialogInterface.OnClickListener() {
  24. @Override
  25. public void onClick(DialogInterface dialog, int which) {
  26. mContext.startActivity(intent);
  27. if (mLowBatteryDialog != null) {
  28. mLowBatteryDialog.dismiss();
  29. }
  30. }
  31. });
  32. }
  33. AlertDialog d = b.create();
  34. d.setOnDismissListener(mLowBatteryListener);
  35. d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
  36. d.show();
  37. mLowBatteryDialog = d;
  38. }
  39. //waring voiced
  40. final ContentResolver cr = mContext.getContentResolver();
  41. if (Settings.System.getInt(cr, Settings.System.POWER_SOUNDS_ENABLED, 1) == 1) {
  42. final String soundPath = Settings.System.getString(cr, Settings.System.LOW_BATTERY_SOUND);
  43. if (soundPath != null) {
  44. final Uri soundUri = Uri.parse("file://" + soundPath);
  45. if (soundUri != null) {
  46. final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
  47. if (sfx != null) {
  48. sfx.setStreamType(AudioManager.STREAM_SYSTEM);
  49. sfx.play();
  50. }
  51. }
  52. }
  53. }
  54. }

Android Low Battery 低电量处理流程相关推荐

  1. android低电量提示,Android P系统低电量提醒功能 根据使用情况判断充电时间

    Android P系统是谷歌近几年以来变化最大的一个安卓系统,在I/O 2018上,谷歌已经正是宣布了Android P系统,并且面向vivo.OPPO.小米.一加.诺基亚等8个品牌的11款手机开放公 ...

  2. android低电量模式吗,Android P 省电模式(LowPowerMode)(二) ------ 省电行为

    在上篇文章Android P 省电模式(LowPowerMode)(一) ------ 省电模式手动开启流程 中最后分析到,开启省电模式后,会在 BatterySaverController 中回调所 ...

  3. android 低电量卡,Android中低电量的处置方法

    前段时间解了个Bug:Android系统在低电时充电,StatusBar上的充电图标不会变化,始终显示的是同一个图标 当时没有来得及整理,现在补一下 电池电量信息是从BatteryService中通过 ...

  4. android低电量提示,Android4.4开发之电池低电量告警提示原理与实现方法分析

    本文实例讲述了Android4.4电池低电量告警提示原理与实现方法.分享给大家供大家参考,具体如下: 之前版本的电池电量低是通过发送 intent ACTION_BATTERY_LOW来实现的,而在a ...

  5. android 低电量卡,Android11 增加低电量通知

    修改shouldSendBatteryLowLocked判断条件. //frameworks\base\services\core\java\com\android\server\BatterySer ...

  6. Android 屏幕常亮、低电量监听

    Android保持屏幕常亮只需在manifest文件注册权限并使用PowerManager进行管理: <uses-permission android:name="android.pe ...

  7. android 低电量,如何在Android设备中模拟低电量

    默认情况下,模拟低电量是不知道的(如果您使用eclipse作为im). 但是如果你在linux中,你可以使用telnet连接到本地主机模拟器并执行'Power'动作(没有使用它们也许你可以试试) ht ...

  8. Android 10.0增加低电量弹窗

    在做定制化开发中,对于低电量提醒的功能,系统会在状态栏中弹出通知进行提示,但是如果隐藏了状态栏 就看不到提示了 所以客户要求增加个低电量弹窗功能 发现在SystemUI里面.发现SystemUI涵盖的 ...

  9. android 低电量模式吗,iPhone一直开着低电量模式会怎么样?

    相比Android上那些五花八门的省电技巧来说,iOS系统的省电方法很简单:"打开低电量模式,完."在这个模式下,系统会通过减弱或者关闭一些功能如:电子邮件获取.嘿Siri.后台应 ...

最新文章

  1. R语言plotly可视化:plotly可视化箱图、相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数、linear、inclusive、exclusive)
  2. 如何迅速成长成为一名数据分析师(都是干货)?
  3. 《Python核心编程 》笔记-第二章+第三章
  4. 做WebRTC,千万别把媒体和信令混在一起
  5. jsdiff 比较文本内容差异
  6. 中文乱码问题解决方法总结
  7. 长微博android,Android 上最强大的长微博工具:BlackLight 长微博
  8. ASP.NET中调用Excel的问题
  9. 电子相册系统(六)相片列表显示
  10. matlab_一组数据元素随机排列
  11. 水题 Codeforces Beta Round #70 (Div. 2) A. Haiku
  12. bilibili 韩顺平Java后端学习路线
  13. 罗技鼠标G304驱动与讲解(其余类型驱动见文末)
  14. smp格式音频转换mp3软件方法
  15. 工作流软件哪个好?介绍几款知名的工作流软件
  16. PMP备考之路 - 汪博士第六章(项目进度管理)
  17. 伪标签+html,伪标签(Pseudo-Labelling)介绍:一种半监督机器学习技术
  18. IT项目经理沟通技巧的重要性
  19. java - (二)netty 心跳监测机制
  20. P2690 [USACO04NOV]Apple Catching G 题解

热门文章

  1. node python 速度_为什么python在递归上比node.js慢得多
  2. springboot jar服务器运行后无法请求_Spring Boot微服务中Chaos Monkey的应用
  3. 038_Steps步骤条
  4. 004_SpringBoot整合Listener
  5. 070_获取日期方法
  6. java多态强制类型转换_java多态和强制类型转换
  7. python里help和dir的区别_Python中dir()与help()的使用
  8. java导出excel_如何导出你和女票的微信聊天记录
  9. Android 网络请求详解
  10. 拼装机器人感想_学习制作机器人的感想作文500字6篇