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相关推荐

  1. Android 锁屏状态下启动应用很慢的原因分析

    最近在工作中遇到一个需求就是,在锁屏状态下直接拨打电话,功能实现之后测试给的反馈是操作之后到电话拨出的时间太长(大概5秒).希望能优化一下.后来经过分析确定不是应用层的问题.然后就一顿百度.Googl ...

  2. Android APP息屏状态下收到通知解决方案

    1.问题 最近负责的Android APP,用户反馈无法收到通知,尤其是息屏状态下无法收到通知. 这些APP,笔者以前都测试过,可以收到推送的.但测试以后,发现在新的Android上,确实收不到通知和 ...

  3. 计算机锁屏之后QQ音乐停止播放了,MAC电脑如何在息屏状态下让QQ音乐能继续播放音乐...

    MAC电脑如何在息屏状态下让QQ音乐能继续播放音乐 一般MAC电脑息屏之后,大部分的应用都是会停止运行的,比如QQ音乐,就不会再播放音乐.今天小编就跟大家分享下MAC电脑如何在息屏状态下让QQ音乐能继 ...

  4. Android锁屏状态下点亮屏幕并弹窗提醒

    类似于手机锁屏状态下QQ来消息然后点亮屏幕并弹窗,如图. 相信QQ的这个功能大家都是很熟悉的了,下面就开始讲具体的实现步骤. 一.新建一个Activity并在OnCreate中添加四个标识 @Over ...

  5. 使用SurfaceView实现手机息屏状态下的静默拍照保存,上传服务器

    注意:本文章只适用于技术交流,请你友好交流净化开发环境 思考 由于谷歌强制在Android应用开发中编写拍照程序是必需要有图像预览的.这对那些恶意程序比如Android中泛滥的Service在后台偷偷 ...

  6. android 锁屏界面弹出qq,Android锁屏状态下弹出activity,如新版qq的锁屏消息提示

    Android锁屏状态下弹出activity,如新版qq的锁屏消息提示 发布时间:2020-06-26 21:27:13 来源:51CTO 阅读:1643 作者:lp5345 在接收消息广播的onRe ...

  7. Android锁屏状态下信息的显示

    Android窗口的显示很简单,但很多人不知道锁屏状态下窗口的显示,今天就来展示一下. 先上QQ的效果图 1:显示 就一句代码,在需要显示的Activity中onCreate方法中加入 this.ge ...

  8. Android锁屏状态下service不能正常工作的探究

    理想情况下例如音乐播放等service在锁屏状态下都是可以正常播放的. 最近在用android5.0做开发,写了蓝牙4.0的服务和socket的网络请求服务,需求是每隔一段时间自动查询服务器数据,如果 ...

  9. android熄屏微信收到原理,求助,如何才能在息屏状态下显示收到的微信消息内容?...

    5楼搞错了...重发给你. 本帖最后由 散闲游人 于 2018-4-14 14:18 编辑 如P20的设置和手机管家和m10是一样的,请参考如下设置: 一:点击手机管家,点启动管理,以进入手动管理为例 ...

最新文章

  1. VB中Unicode vs Ansi-From alpsong(阿尔卑斯之歌)
  2. day32 并发编程之锁
  3. java并发集合面试题,那些经常被问的JAVA面试题(1)—— 集合部分
  4. 机器学习笔记(九)---- 集成学习(ensemble learning)【华为云技术分享】
  5. python入门教程第三讲_第三讲 使用Template
  6. html5 拖拽滚动条,js 简易版滚动条实例(适用于移动端H5开发)
  7. 在实际项目中,如何选择合适的机器学习模型?
  8. 佳能Canon PIXMA MG3020 打印机驱动
  9. winxp计算机如何连接win7计算机,Win7电脑连接XP系统共享打印机的操作方法
  10. arcmap制作地闪密度专题图
  11. 51单片机“叮咚”门铃
  12. android 微信授权获取用户个人信息
  13. java内存分析详解_深入java内存查看与分析详解
  14. 2019年架构软考论文押题(二)
  15. 搭建vue前端脚手架
  16. python由大到小排序_Python选择从小到大的排序,python
  17. 如何应付全英文的技术面试(一)
  18. R语言对完全随机分组实验、拉丁方实验及正交实验进行方差分析(例题,过程+代码)
  19. Altium Designer,PCB处理最后GND以及铺铜经验
  20. 统计大写字母、小写字母、数字出现的次数

热门文章

  1. 个人居间服务,劳务费用怎样合理节税?自然人代开3个点
  2. 公众号bmob_newgd.js
  3. 【云速建站如何个人备案】
  4. 计算机视觉中的数学方法——1平面射影几何——1射影平面+2二次曲线
  5. Python,关于字符串间隔分割的while、for代码测试,近乎完美
  6. vue项目PC端屏幕分辨率与窗口大小自适应
  7. (HOTA)多目标跟踪MOT指标计算方法
  8. epub直接获取书名及书封面
  9. PS图层混合算法之四(亮光, 点光, 线性光, 实色混合)
  10. 数学词汇的英译,写文章,读文献必备