android低电量处理流程

前一段时间分析的一个小过程,把它记下来:


我们都知道android电量的一些功能很多在service中,低电量也是如此,在BatteryService.java中我们可以从jni层(当然jni层的电量也是从下层kernel接收而来,这里就不做过多分析,有兴趣的可以去深入了解一下)获得机器的电量mBatteryLevel,我们也知道当手机电量低的时候它会有警告有些还发出声音提醒你,并且太低时会自动关机!

下面简单介绍一下其流程:


在BatteryService.java中,当我们从jni获得当前电量之后,可以在 update()中做一个判断:

 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 final void shutdownIfNoPower() {
     
        if (mBatteryLevel == 0 && !isPowered() && 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.startActivity(intent);


        }


    }


而在StatusBarPolicy.java中会有接收广播:private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

               。。。。。。。。。


里面会有判断当接受到ACTION_BATTERY_LOW时:


else if (action.equals(Intent.ACTION_BATTERY_LOW)) {


                onBatteryLow(intent);


            }

在StatusBarPolicy.java中会有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() {
                        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();
                    }
                }
            }
        }
    }

   //waring voiced这行下面就是低电量提醒的声音.

   大概过程就是这样了!



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
安卓设备的充电流程一般包括以下步骤: 1. 插入充电器并连接电源 当用户将充电器插入安卓设备并连接电源时,系统会检测到电源连接事件,然后启动相应的服务和线程来处理充电流程。 2. 开始充电流程 系统会根据充电器的类型和电池的状态,选择合适的充电模式,并开始充电流程。在此过程中,系统会监测电池的状态,包括电量、温度、电压等,并动态调整充电电流和电压等参数,以保证充电过程的安全和稳定。 3. 监测充电状态 系统会持续监测充电状态,包括电池电量、充电电流、充电电压等,并将这些信息通知给用户和应用程序。用户可以通过系统设置界面或者充电图标来查看电池电量和充电状态,应用程序可以通过BatteryManager类获取电池状态信息。 4. 充电完成 当电池充满电时,系统会停止充电流程,并通知用户和应用程序。通常情况下,系统会将充电电流降低到一个很小的值,以防止电池过充或者损坏。 5. 断开电源 当用户拔出充电器或者电源故障时,系统会检测到电源断开事件,并停止充电流程。此时,系统会根据电池的状态和充电模式,选择合适的电池管理策略,例如保持当前电量、降低电量等级、关闭不必要的应用程序等。 总的来说,安卓设备的充电流程是一个复杂的系统过程,需要多个服务和线程协同工作,以保证充电过程的安全、稳定和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值