Android Low Battery 低电量处理流程
点击打开链接
Android 通过BatteryService对电量进行自动管理。在BatteryService.java中从jni层获得电量mBatteryLevel, 并根据mBatteryLevel判断手机电量是否过低,然后发出警告或声音提醒,并且太低时还会自动关机。下面简单介绍一下其流程。
在BatteryService.java中判断当前电量是否过低:
- /* The ACTION_BATTERY_LOW broadcast is sent in these situations:
- * - is just un-plugged (previously was plugged) and battery level is
- * less than or equal to WARNING, or
- * - is not plugged and battery level falls to WARNING boundary
- * (becomes <= mLowBatteryWarningLevel).
- */
- final boolean sendBatteryLow = !plugged
- && mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
- && mBatteryLevel <= mLowBatteryWarningLevel
- && (oldPlugged || mLastBatteryLevel > mLowBatteryWarningLevel);
如果当前电量小于警告电量(在config.xml中 <integer name="config_lowBatteryWarningLevel">15</integer>)则弹出电量低提示,或者电量为0(当然这个有误差也可能是5%时就自动关机)时自动关机。如果低电量的话就发送一个广播出去:
- if (sendBatteryLow) {
- mSentLowBatteryBroadcast = true;
- statusIntent.setAction(Intent.ACTION_BATTERY_LOW);
- mContext.sendBroadcast(statusIntent);
- }
下面这段代码是电量过低而自动关机:
- private void More ...shutdownIfNoPowerLocked() {
- // shut down gracefully if our battery is critically low and we are not powered.
- // wait until the system has booted before attempting to display the shutdown dialog.
- if (mBatteryLevel == 0 && !isPoweredLocked(BatteryManager.BATTERY_PLUGGED_ANY)) {
- mHandler.post(new Runnable() {
- @Override
- public void More ...run() {
- if (ActivityManagerNative.isSystemReady()) {
- Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
- intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivityAsUser(intent, UserHandle.CURRENT);
- }
- }
- });
- }
- }
而在StatusBarPolicy.java中会接收广播, 里面有判断当接受到ACTION_BATTERY_LOW时, 调用onBatteryLow(intent)方法来处理:
- private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- .....action.
- //里面会有判断当接受到ACTION_BATTERY_LOW时:
- else if (action.equals(Intent.ACTION_BATTERY_LOW)) {
- onBatteryLow(intent);
- }
- }
- }
- private void onBatteryLow(Intent intent) {
- if (SHOW_LOW_BATTERY_WARNING) {
- if (false) {
- Slog.d(TAG, "mPhoneState=" + mPhoneState
- + " mLowBatteryDialog=" + mLowBatteryDialog
- + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
- }
- if (SHOW_BATTERY_WARNINGS_IN_CALL || mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
- showLowBatteryWarning();
- } else {
- mBatteryShowLowOnEndCall = true;
- }
- }
- }
弹出低电量过低Dialog提醒和声音提醒:
- private void showLowBatteryWarning() {
- closeLastBatteryView();
- // Show exact battery level.
- CharSequence levelText = mContext.getString(R.string.battery_low_percent_format, mBatteryLevel);
- if (mBatteryLevelTextView != null) {
- mBatteryLevelTextView.setText(levelText);
- } else {
- View v = View.inflate(mContext, R.layout.battery_low, null);
- mBatteryLevelTextView=(TextView)v.findViewById(R.id.level_percent);
- mBatteryLevelTextView.setText(levelText);
- AlertDialog.Builder b = new AlertDialog.Builder(mContext);
- b.setCancelable(true);
- b.setTitle(R.string.battery_low_title);
- b.setView(v);
- b.setIcon(android.R.drawable.ic_dialog_alert);
- b.setPositiveButton(android.R.string.ok, null);
- final Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_NO_HISTORY);
- if (intent.resolveActivity(mContext.getPackageManager()) != null) {
- b.setNegativeButton(R.string.battery_low_why, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- mContext.startActivity(intent);
- if (mLowBatteryDialog != null) {
- mLowBatteryDialog.dismiss();
- }
- }
- });
- }
- AlertDialog d = b.create();
- d.setOnDismissListener(mLowBatteryListener);
- d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- d.show();
- mLowBatteryDialog = d;
- }
- //waring voiced
- final ContentResolver cr = mContext.getContentResolver();
- if (Settings.System.getInt(cr, Settings.System.POWER_SOUNDS_ENABLED, 1) == 1) {
- final String soundPath = Settings.System.getString(cr, Settings.System.LOW_BATTERY_SOUND);
- if (soundPath != null) {
- final Uri soundUri = Uri.parse("file://" + soundPath);
- if (soundUri != null) {
- final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
- if (sfx != null) {
- sfx.setStreamType(AudioManager.STREAM_SYSTEM);
- sfx.play();
- }
- }
- }
- }
- }
Android Low Battery 低电量处理流程相关推荐
- android低电量提示,Android P系统低电量提醒功能 根据使用情况判断充电时间
Android P系统是谷歌近几年以来变化最大的一个安卓系统,在I/O 2018上,谷歌已经正是宣布了Android P系统,并且面向vivo.OPPO.小米.一加.诺基亚等8个品牌的11款手机开放公 ...
- android低电量模式吗,Android P 省电模式(LowPowerMode)(二) ------ 省电行为
在上篇文章Android P 省电模式(LowPowerMode)(一) ------ 省电模式手动开启流程 中最后分析到,开启省电模式后,会在 BatterySaverController 中回调所 ...
- android 低电量卡,Android中低电量的处置方法
前段时间解了个Bug:Android系统在低电时充电,StatusBar上的充电图标不会变化,始终显示的是同一个图标 当时没有来得及整理,现在补一下 电池电量信息是从BatteryService中通过 ...
- android低电量提示,Android4.4开发之电池低电量告警提示原理与实现方法分析
本文实例讲述了Android4.4电池低电量告警提示原理与实现方法.分享给大家供大家参考,具体如下: 之前版本的电池电量低是通过发送 intent ACTION_BATTERY_LOW来实现的,而在a ...
- android 低电量卡,Android11 增加低电量通知
修改shouldSendBatteryLowLocked判断条件. //frameworks\base\services\core\java\com\android\server\BatterySer ...
- Android 屏幕常亮、低电量监听
Android保持屏幕常亮只需在manifest文件注册权限并使用PowerManager进行管理: <uses-permission android:name="android.pe ...
- android 低电量,如何在Android设备中模拟低电量
默认情况下,模拟低电量是不知道的(如果您使用eclipse作为im). 但是如果你在linux中,你可以使用telnet连接到本地主机模拟器并执行'Power'动作(没有使用它们也许你可以试试) ht ...
- Android 10.0增加低电量弹窗
在做定制化开发中,对于低电量提醒的功能,系统会在状态栏中弹出通知进行提示,但是如果隐藏了状态栏 就看不到提示了 所以客户要求增加个低电量弹窗功能 发现在SystemUI里面.发现SystemUI涵盖的 ...
- android 低电量模式吗,iPhone一直开着低电量模式会怎么样?
相比Android上那些五花八门的省电技巧来说,iOS系统的省电方法很简单:"打开低电量模式,完."在这个模式下,系统会通过减弱或者关闭一些功能如:电子邮件获取.嘿Siri.后台应 ...
最新文章
- R语言plotly可视化:plotly可视化箱图、相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数、linear、inclusive、exclusive)
- 如何迅速成长成为一名数据分析师(都是干货)?
- 《Python核心编程 》笔记-第二章+第三章
- 做WebRTC,千万别把媒体和信令混在一起
- jsdiff 比较文本内容差异
- 中文乱码问题解决方法总结
- 长微博android,Android 上最强大的长微博工具:BlackLight 长微博
- ASP.NET中调用Excel的问题
- 电子相册系统(六)相片列表显示
- matlab_一组数据元素随机排列
- 水题 Codeforces Beta Round #70 (Div. 2) A. Haiku
- bilibili 韩顺平Java后端学习路线
- 罗技鼠标G304驱动与讲解(其余类型驱动见文末)
- smp格式音频转换mp3软件方法
- 工作流软件哪个好?介绍几款知名的工作流软件
- PMP备考之路 - 汪博士第六章(项目进度管理)
- 伪标签+html,伪标签(Pseudo-Labelling)介绍:一种半监督机器学习技术
- IT项目经理沟通技巧的重要性
- java - (二)netty 心跳监测机制
- P2690 [USACO04NOV]Apple Catching G 题解
热门文章
- node python 速度_为什么python在递归上比node.js慢得多
- springboot jar服务器运行后无法请求_Spring Boot微服务中Chaos Monkey的应用
- 038_Steps步骤条
- 004_SpringBoot整合Listener
- 070_获取日期方法
- java多态强制类型转换_java多态和强制类型转换
- python里help和dir的区别_Python中dir()与help()的使用
- java导出excel_如何导出你和女票的微信聊天记录
- Android 网络请求详解
- 拼装机器人感想_学习制作机器人的感想作文500字6篇