android 低电时震动

来源:互联网 发布:淘宝怎么看是不是假货 编辑:程序博客网 时间:2024/06/05 06:10

 现象描述:低电量时需要震动,以提示用户进入低电模式

当电池电量低于15%时,在状态栏点击信息,会出现如下图片!


那么点击"开启"按钮,如何震动来提示用户呢?通过搜索关键字,可以看到最终会走到PowerNotificationWarnings.java中,该源码位于

frameworks\base\packages\SystemUI\src\com\android\systemui\power\PowerNotificationWarnings.java
private void showStartSaverConfirmation() {        if (mSaverConfirmation != null) return;        final SystemUIDialog d = new SystemUIDialog(mContext);        d.setTitle(R.string.battery_saver_confirmation_title);        d.setMessage(com.android.internal.R.string.battery_saver_description);        d.setNegativeButton(android.R.string.cancel, null);        d.setPositiveButton(R.string.battery_saver_confirmation_ok, mStartSaverMode);        d.setShowForAllUsers(true);        d.setOnDismissListener(new OnDismissListener() {            @Override            public void onDismiss(DialogInterface dialog) {                mSaverConfirmation = null;            }        });        d.show();        mSaverConfirmation = d;    }

从上述代码可知,点击"开启"按钮后,会执行mStartSaverMode
 private final OnClickListener mStartSaverMode = new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {            AsyncTask.execute(new Runnable() {            @Override                public void run() {                    setSaverMode(true);//设置低电模式                }            });        }    };
上述是异步任务开启设置低电模式,而低电模式开启之后:1.关闭各种服务 2 动画全部取消 3 屏幕亮度变暗 4 后台数据关闭;即低电时通过牺牲性能来达到节省电量的。
低电开启之后的结果就是:除通知图标外顶部状态栏、底部通知栏颜色全部变成亮橙色,大部分图标等资源添加橙色,应用顶部栏也会
变成橙色。  那么既然低电会关闭各种服务,而震动则需要使用VibratorService服务;如何实现呢?
  如果直接将震动代码加入到上述onClick方法中,即代码如下:
   private final OnClickListener mStartSaverMode = new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {Vibrator mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);boolean mHasVibrator = mVibrator != null && mVibrator.hasVibrator();                        Slog.i(TAG, "mHasVibrator="+mHasVibrator);               if(mHasVibrator){                         mVibrator.vibrate(VIBRATE_HINT_DURATION);      }                AsyncTask.execute(new Runnable() {                @Override                public void run() {                setSaverMode(true);                }            });        }    };
编译SystemUI验证,就会发现只有第一次进入低电时才会震动一下,而且震动时间很短,再次进入低电时就不再出现震动;这就和前面所说的低电模式会关闭各种服务有关!
最后猜想只有让系统暂时休眠几秒钟让系统执行震动,之后再执行低电模式,即在上述代码修改处加入一句:
SystemClock.sleep(VIBRATE_HINT_DURATION);即可;再次编译验证,可以实现进入低电模式之前实现所需要的震动!