android 低电时震动

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

当电池电量低于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);即可;再次编译验证,可以实现进入低电模式之前实现所需要的震动!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值