当前位置:操作系统 > 安卓/Android >>

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.getPacka

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,