Android息屏状态下启动App
Android息屏状态下启动App
- 需求简介
- 分析
- 1、点亮屏幕
- 2、通过startActivity方法启动App
- 启动失败问题
- 原因
- 解决
需求简介
设备在息屏的状态下,通过特定的物理按键去启动Camera应用。
分析
设备在息屏状态下(系统处于休眠),直接通过startActivity方法去启动应用是无效的。
所以将需求的实现应该分为两步:
1、点亮屏幕(唤醒系统);
2、通过startActivity方法启动App;
1、点亮屏幕
我对这个需求的实现代码是写在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 中的。
PowerManager mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
private void lightScreen(String keyName){if (!mPowerManager.isScreenOn()) {mPowerManager.wakeUp(SystemClock.uptimeMillis()); }
}
2、通过startActivity方法启动App
需要判断一下设备是否处于锁屏状态,因为不同状态下启动App所用到的action是不同的。
//CAMERA_PACKAGE_NAME 为camera应用的包名
private final String CAMERA_PACKAGE_NAME = "com.app.camera";
private void launchApp(){Intent intent;if (isOnLockScreenPage()) {intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE).addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);//startActivityAsUser是PhoneWindowManager中的已有方法} else {intent = mContext.getPackageManager().getLaunchIntentForPackage(CAMERA_PACKAGE_NAME);intent.setAction(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);}
}
//判断设备是否处于锁屏状态
private boolean isOnLockScreenPage(){KeyguardManager mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);return mKeyguardManager.inKeyguardRestrictedInputMode();
}
启动失败问题
在设备处于锁屏且息屏的状态下,通过物理按键事件启动Camera App存在概率性失败的bug。
原因
因为在唤醒系统后即刻执行Camera相应组件的初始化操作,耗费的时间比正常状态下要久一些,而系统在frameworks/base/services/core/java/com/android/server/am/ActivityStack.java中对App的响应做了一个时间限制(500ms),超过该时间会认为启动的App是未响应状态,从而取消对该App的启动。
我所用设备从息屏状态下启动的Camera的响应时间估计在500ms上下,所以导致概率性失败的问题。
解决
在ActivityStack.java的schedulePauseTimeout中对从息屏状态下启动Camera的情况,适当的延长了响应超时时间。
/**
* Schedule a pause timeout in case the app doesn't respond. We don't give it much time because
* this directly impacts the responsiveness seen by the user.
*/
private void schedulePauseTimeout(ActivityRecord r) {final Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG);msg.obj = r;r.pauseTime = SystemClock.uptimeMillis();//属性persist.sys.camera_prop在息屏状态下启动Camera的时候设置为trueif (SystemProperties.getBoolean("persist.sys.camera_prop", false)) {mHandler.sendMessageDelayed(msg, 1000);SystemProperties.set("persist.sys.camera_prop", "0");} else {//PAUSE_TIMEOUT = 500mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT);}if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Waiting for pause to complete...");
}
Android息屏状态下启动App相关推荐
- Android 锁屏状态下启动应用很慢的原因分析
最近在工作中遇到一个需求就是,在锁屏状态下直接拨打电话,功能实现之后测试给的反馈是操作之后到电话拨出的时间太长(大概5秒).希望能优化一下.后来经过分析确定不是应用层的问题.然后就一顿百度.Googl ...
- Android APP息屏状态下收到通知解决方案
1.问题 最近负责的Android APP,用户反馈无法收到通知,尤其是息屏状态下无法收到通知. 这些APP,笔者以前都测试过,可以收到推送的.但测试以后,发现在新的Android上,确实收不到通知和 ...
- 计算机锁屏之后QQ音乐停止播放了,MAC电脑如何在息屏状态下让QQ音乐能继续播放音乐...
MAC电脑如何在息屏状态下让QQ音乐能继续播放音乐 一般MAC电脑息屏之后,大部分的应用都是会停止运行的,比如QQ音乐,就不会再播放音乐.今天小编就跟大家分享下MAC电脑如何在息屏状态下让QQ音乐能继 ...
- Android锁屏状态下点亮屏幕并弹窗提醒
类似于手机锁屏状态下QQ来消息然后点亮屏幕并弹窗,如图. 相信QQ的这个功能大家都是很熟悉的了,下面就开始讲具体的实现步骤. 一.新建一个Activity并在OnCreate中添加四个标识 @Over ...
- 使用SurfaceView实现手机息屏状态下的静默拍照保存,上传服务器
注意:本文章只适用于技术交流,请你友好交流净化开发环境 思考 由于谷歌强制在Android应用开发中编写拍照程序是必需要有图像预览的.这对那些恶意程序比如Android中泛滥的Service在后台偷偷 ...
- android 锁屏界面弹出qq,Android锁屏状态下弹出activity,如新版qq的锁屏消息提示
Android锁屏状态下弹出activity,如新版qq的锁屏消息提示 发布时间:2020-06-26 21:27:13 来源:51CTO 阅读:1643 作者:lp5345 在接收消息广播的onRe ...
- Android锁屏状态下信息的显示
Android窗口的显示很简单,但很多人不知道锁屏状态下窗口的显示,今天就来展示一下. 先上QQ的效果图 1:显示 就一句代码,在需要显示的Activity中onCreate方法中加入 this.ge ...
- Android锁屏状态下service不能正常工作的探究
理想情况下例如音乐播放等service在锁屏状态下都是可以正常播放的. 最近在用android5.0做开发,写了蓝牙4.0的服务和socket的网络请求服务,需求是每隔一段时间自动查询服务器数据,如果 ...
- android熄屏微信收到原理,求助,如何才能在息屏状态下显示收到的微信消息内容?...
5楼搞错了...重发给你. 本帖最后由 散闲游人 于 2018-4-14 14:18 编辑 如P20的设置和手机管家和m10是一样的,请参考如下设置: 一:点击手机管家,点启动管理,以进入手动管理为例 ...
最新文章
- VB中Unicode vs Ansi-From alpsong(阿尔卑斯之歌)
- day32 并发编程之锁
- java并发集合面试题,那些经常被问的JAVA面试题(1)—— 集合部分
- 机器学习笔记(九)---- 集成学习(ensemble learning)【华为云技术分享】
- python入门教程第三讲_第三讲 使用Template
- html5 拖拽滚动条,js 简易版滚动条实例(适用于移动端H5开发)
- 在实际项目中,如何选择合适的机器学习模型?
- 佳能Canon PIXMA MG3020 打印机驱动
- winxp计算机如何连接win7计算机,Win7电脑连接XP系统共享打印机的操作方法
- arcmap制作地闪密度专题图
- 51单片机“叮咚”门铃
- android 微信授权获取用户个人信息
- java内存分析详解_深入java内存查看与分析详解
- 2019年架构软考论文押题(二)
- 搭建vue前端脚手架
- python由大到小排序_Python选择从小到大的排序,python
- 如何应付全英文的技术面试(一)
- R语言对完全随机分组实验、拉丁方实验及正交实验进行方差分析(例题,过程+代码)
- Altium Designer,PCB处理最后GND以及铺铜经验
- 统计大写字母、小写字母、数字出现的次数