码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 2022-08-24 AndroidR 实现长按按键打开一个app或者打开app的某个界面


    AndroidR 实现长按按键打开一个app或者打开app的某个界面

    一、frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java interceptKeyBeforeDispatching 里面处理按键长按事件

    二、接收按键长按事件并然后用startActivityAsUser打开app

     三、接收按键长按事件然后用startActivityAsUser打开某个app的某个页面

            3.1 先在要被跳转的activity里面配置好 intent-filter参数

    1. <intent-filter>
    2. <action android:name="android.intent.action.IRThermal" />
    3. <category android:name="android.intent.category.DEFAULT" />
    4. </intent-filter>

    ​

            3.2 执行startActivityAsUser(new Intent("android.intent.action.IRThermal"),
                            UserHandle.CURRENT_OR_SELF); 跳转到对应的页面。

    ​

            3.3 长按按键一秒后打开app的某个界面

    ​

            3.4 查看相应的log

    ​

      四、使用Scheme跳转,什么是 URL Scheme? android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面

    1. startActivityAsUser(new Intent("android.intent.action.IRThermal",Uri.parse("giada://jh558")),
    2. UserHandle.CURRENT_OR_SELF);
    1. <activity android:name=".sample.SerialPortPreferences" >
    2. <intent-filter>
    3. <action android:name="android.intent.action.IRThermal" />
    4. <category android:name="android.intent.category.DEFAULT" />
    5. <data
    6. android:host="jh558"
    7. android:scheme="giada" />
    8. </intent-filter>
    9. </activity>

    ​

    五、整个过程的所有修改内容如下

    1. diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
    2. index d966f36..cd99647 100755
    3. --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
    4. +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
    5. @@ -229,6 +229,7 @@ import java.io.IOException;
    6. import java.io.PrintWriter;
    7. import java.util.HashSet;
    8. import java.util.List;
    9. +import android.net.Uri;
    10. /**
    11. * WindowManagerPolicy implementation for the Android phone UI. This
    12. @@ -636,6 +637,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    13. private static final int MSG_LAUNCH_ASSIST_LONG_PRESS = 24;
    14. private static final int MSG_POWER_VERY_LONG_PRESS = 25;
    15. private static final int MSG_RINGER_TOGGLE_CHORD = 26;
    16. + private static final int MSG_PHOTO_VERY_LONG_PRESS = 27;
    17. private int screenWidth;
    18. private int screenHeight;
    19. @@ -731,6 +733,21 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    20. case MSG_POWER_LONG_PRESS:
    21. powerLongPress();
    22. break;
    23. + case MSG_PHOTO_VERY_LONG_PRESS:
    24. + /*
    25. + Intent intent = new Intent();
    26. + intent = mPackageManager.getLaunchIntentForPackage("com.topdon.tc003");
    27. + startActivityAsUser(intent, UserHandle.CURRENT);
    28. + */
    29. +
    30. + /*startActivityAsUser(new Intent("android.intent.action.IRThermal"),
    31. + UserHandle.CURRENT_OR_SELF);
    32. + */
    33. + startActivityAsUser(new Intent("android.intent.action.IRThermal",Uri.parse("giada://jh558")),
    34. + UserHandle.CURRENT_OR_SELF);
    35. +
    36. + Log.d(TAG, "received MSG_PHOTO_VERY_LONG_PRESS message , go to open com.topdon.tc003 app IRThermal! ");
    37. + break;
    38. case MSG_POWER_VERY_LONG_PRESS:
    39. powerVeryLongPress();
    40. break;
    41. @@ -2852,11 +2869,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    42. Slog.wtf(TAG, "KEYCODE_VOICE_ASSIST should be handled in interceptKeyBeforeQueueing");
    43. return -1;
    44. } else if (keyCode == KeyEvent.KEYCODE_SYSRQ) {
    45. + Slog.wtf(TAG, "KeyEvent.KEYCODE_SYSRQ repeatCount "+repeatCount+" down:"+down);
    46. if (down && repeatCount == 0) {
    47. - mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);
    48. - mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_OTHER);
    49. - mHandler.post(mScreenshotRunnable);
    50. - }
    51. + Slog.wtf(TAG, "KeyEvent.KEYCODE_SYSRQ down & repeatCount = 0");
    52. + mHandler.sendEmptyMessageDelayed(MSG_PHOTO_VERY_LONG_PRESS, 1000);
    53. + }else if (!down){
    54. + Slog.wtf(TAG, "KeyEvent.KEYCODE_SYSRQ down false");
    55. + mHandler.removeMessages(MSG_PHOTO_VERY_LONG_PRESS);
    56. + }
    57. return -1;
    58. } else if (keyCode == KeyEvent.KEYCODE_BRIGHTNESS_UP
    59. || keyCode == KeyEvent.KEYCODE_BRIGHTNESS_DOWN) {

    六、有价值的参考文章

    https://www.jianshu.com/p/0de981ffa9d0?u_atoken=386d82cf-e74e-4664-88a8-7c079d0a9ed5&u_asession=01I5I6cSZ01KGe5V-2OGcJK3pas_Pz_nALSDBrimj-nABQAjU0ATCE7AzHz8gAuwSHX0KNBwm7Lovlpxjd_P_q4JsKWYrT3W_NKPr8w6oU7K-KfhCVHQzWHYOgT0brCRzhAt9AIvYhu5Tuzl1JEP_OamBkFo3NEHBv0PZUm6pbxQU&u_asig=05Lp3qL_cCDfZcsRdAuiHlpKOswxE9eynMZY8mER2Ey7anmhapRFW4otLuSW7g85W0V_kKS_XrgcpnmoNo7dAnYAXPyP21hp7wqeSvvzDP1bW3Mqa09_gNaol0kemGEKFevhVNuwoHjfstlgBp4quMdmYe6-QMGWxpsyt9cRuU4pf9JS7q8ZD7Xtz2Ly-b0kmuyAKRFSVJkkdwVUnyHAIJzZfVXgcHIQ35ffaeXNqqJz3Bu_8DjNX_RyjjSdG7hGEucYXgoUw8UHphWe030pDERu3h9VXwMyh6PgyDIVSG1W8cTIwhSwvIMeRLsvBwihBBzONyJJJzAdPaC5tEw5I_9xCKw3Xrm6bZlhf7WtFhd_kl99ZRY-KEc6nTbkTM1v7LmWspDxyAEEo4kbsryBKb9Q&u_aref=23HJ666denmpu5Nwp7n99V4NQR0%3Dhttps://www.jianshu.com/p/0de981ffa9d0?u_atoken=386d82cf-e74e-4664-88a8-7c079d0a9ed5&u_asession=01I5I6cSZ01KGe5V-2OGcJK3pas_Pz_nALSDBrimj-nABQAjU0ATCE7AzHz8gAuwSHX0KNBwm7Lovlpxjd_P_q4JsKWYrT3W_NKPr8w6oU7K-KfhCVHQzWHYOgT0brCRzhAt9AIvYhu5Tuzl1JEP_OamBkFo3NEHBv0PZUm6pbxQU&u_asig=05Lp3qL_cCDfZcsRdAuiHlpKOswxE9eynMZY8mER2Ey7anmhapRFW4otLuSW7g85W0V_kKS_XrgcpnmoNo7dAnYAXPyP21hp7wqeSvvzDP1bW3Mqa09_gNaol0kemGEKFevhVNuwoHjfstlgBp4quMdmYe6-QMGWxpsyt9cRuU4pf9JS7q8ZD7Xtz2Ly-b0kmuyAKRFSVJkkdwVUnyHAIJzZfVXgcHIQ35ffaeXNqqJz3Bu_8DjNX_RyjjSdG7hGEucYXgoUw8UHphWe030pDERu3h9VXwMyh6PgyDIVSG1W8cTIwhSwvIMeRLsvBwihBBzONyJJJzAdPaC5tEw5I_9xCKw3Xrm6bZlhf7WtFhd_kl99ZRY-KEc6nTbkTM1v7LmWspDxyAEEo4kbsryBKb9Q&u_aref=23HJ666denmpu5Nwp7n99V4NQR0%3D

    Android开发之打开指定APP | 打开APP任意页面的方法_xiayiye5的博客-CSDN博客_android 打开app方法一:此方法只是打开APP,说白了就是类似你手动点击APP图标打开而已PackageManager packageManager = getPackageManager();Intent intent = new Intent();//跳转到下一页5 APP界面intent = packageManager.getLaunchIntentForPackage("cn.xiayiy...https://blog.csdn.net/xiayiye5/article/details/84975374

  • 相关阅读:
    什么是研学
    JS 中防抖函数形成闭包的相关处理及思考
    竞赛 深度学习实现行人重识别 - python opencv yolo Reid
    Flink+ice 实现可视化规则编排与灵活配置(Demo)
    【Solidity】智能合约案例——①食品溯源合约
    【博客506】k8s扩展调度器以支撑更灵活的GPU调度
    redis中使用pipeline批量执行命令,提升性能
    图斑自上而下,自左而右顺序编码,按照权属单位代码分组,每组从1开始编码
    JAVA 实现 UNIX tail -f 命令功能
    vue+element模仿商城,前后端分离实现,含数据库
  • 原文地址:https://blog.csdn.net/qq_37858386/article/details/126509239
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号