当前位置: 首页 > news >正文

Launcher3-实现家长管控-儿童模式-老人模式

最近有客户和朋友问到我这个儿童模式-家长管控模式 功能如何实现,给下思路,自己私下倒腾下 给出自己的实现方案

文章目录

  • 参考资料
  • 解决方案
    • 方案选择
    • 涉及到修改的文件
    • 具体修改内容
      • onCreate 方法中添加开机自启机制
      • 创建监听HOME按键的广播
      • onNewIntent 方法中添加开机自启机制
  • 儿童模式-管控模式-老人模式了解
  • 测试
  • 总结


参考资料

Framework 层Settings.System, Settings.Secure和Settings.Global存储及应用
home按键监听

如果你对Launcher3 感兴趣,或者 需要补充一下基础,建议看一下相关参考资料,充充电。 如果是初学开发者,还是希望且有必要在解决问题同时,了解最基本原理,熟悉最基本的业务逻辑和应用框架。
Launcher3 相关资料参考
菜鸟成长之路-源码分析专栏
Android Launcher3 简介
Launcher3 高端定制
Launcher3 开发
Launcher3 Android Code Search在线源码查看
Launcher3 xref 在线源码查看
Launcher3 RK 源码查看
Launcher3 解析
Launcher3 AndroidP AS版本
谷歌Launcher3 Android13源码修改
Launcher3 和 Launcher3QuickStep 区别
Android14 不分Launcher3修改
Launcher3 LoaderTask 的数据加载
Android14 浅析Launcher
Android O Launcher3-Workspace加载

解决方案

方案选择

这里解决方案有两种,这里我们选择第二种

  • 两个launcher 方案实现,进入和退出儿童模式设置一次默认Launcher,这样会造成重新设置默认Launcher时候界面卡顿一下
  • 一个默认Launcher情况下,比如默认Launcher3 ,儿童-管控-老人模式作为一个单独apk, 采用开机自启+监听HOME按键。 进入到Launcher 时候判断当前是否设置过模式,如果设置过则直接进入,如果没设置则正常显示。 在退出模式时候清空设置模式的FLAG值即可。

涉及到修改的文件

/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java

具体修改内容

Launcher.java 类中

onCreate 方法中添加开机自启机制

Log.e(TAG, "onCreate   modify start ");String  ziQiAppPkg = "";try {ziQiAppPkg = Settings.Secure.getString(this.getContentResolver(),"ziQiAppPkg");} catch (Exception e) {Log.d(TAG," Exception shezhi moren value kong zifuchuan ");Settings.Secure.putString(this.getContentResolver(),"ziQiAppPkg","");e.printStackTrace();}Log.e(TAG, "onCreate   ziQiAppPkg value:"+ziQiAppPkg);if(TextUtils.isEmpty(ziQiAppPkg)){Log.e(TAG, "onCreate   ziQiAppPkg no  value:");}else{Intent launchIntent = getPackageManager().getLaunchIntentForPackage(ziQiAppPkg);if (launchIntent != null) {Log.e(TAG, "onCreate   zhunbei start app value:"+ziQiAppPkg);startActivity(launchIntent);} else {Log.d(TAG," app pkg:"+ziQiAppPkg+" zanwei anzhuang");}  }Log.e(TAG, "onCreate   modify end ");

创建监听HOME按键的广播

第一步:声明HOME按键监听的广播,广播触发后进行开机自启逻辑判断

  private final BroadcastReceiver mCloseSystemDialogsReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Log.d(TAG,"mCloseSystemDialogsReceiver onReceive");Log.e(TAG, "mCloseSystemDialogsReceiver   modify start ");String  ziQiAppPkg = "";try {ziQiAppPkg = Settings.Secure.getString(context.getContentResolver(),"ziQiAppPkg");} catch (Exception e) {Log.d(TAG," Exception shezhi moren value kong zifuchuan ");Settings.Secure.putString(context.getContentResolver(),"ziQiAppPkg","");e.printStackTrace();}Log.e(TAG, "mCloseSystemDialogsReceiver   ziQiAppPkg value:"+ziQiAppPkg);if(TextUtils.isEmpty(ziQiAppPkg)){Log.e(TAG, "mCloseSystemDialogsReceiver   ziQiAppPkg no  value:");}else{Intent launchIntent = getPackageManager().getLaunchIntentForPackage(ziQiAppPkg);if (launchIntent != null) {Log.e(TAG, "mCloseSystemDialogsReceiver   zhunbei start app value:"+ziQiAppPkg);startActivity(launchIntent);} else {Log.d(TAG," app pkg:"+ziQiAppPkg+" zanwei anzhuang");}  }Log.e(TAG, "mCloseSystemDialogsReceiver   modify end ");	}};

第二步:onCreate 方法里面注册广播

   registerReceiver(mCloseSystemDialogsReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));

第三步:在onDestory 方法里面解绑注册的广播

 unregisterReceiver(mCloseSystemDialogsReceiver);

onNewIntent 方法中添加开机自启机制

 @Overrideprotected void onNewIntent(Intent intent) {if (Utilities.IS_RUNNING_IN_TEST_HARNESS) {Log.d(TestProtocol.PERMANENT_DIAG_TAG, "Launcher.onNewIntent: " + intent);}// modify onNewIntent start Log.e(TAG, "onNewIntent  ");Log.e(TAG, "onCreate   modify start ");String  ziQiAppPkg = "";try {ziQiAppPkg = Settings.Secure.getString(this.getContentResolver(),"ziQiAppPkg");} catch (Exception e) {Log.d(TAG," Exception shezhi moren value kong zifuchuan ");Settings.Secure.putString(this.getContentResolver(),"ziQiAppPkg","");e.printStackTrace();}Log.e(TAG, "onCreate   ziQiAppPkg value:"+ziQiAppPkg);if(TextUtils.isEmpty(ziQiAppPkg)){Log.e(TAG, "onCreate   ziQiAppPkg no  value:");}else{Intent launchIntent = getPackageManager().getLaunchIntentForPackage(ziQiAppPkg);if (launchIntent != null) {Log.e(TAG, "onCreate   zhunbei start app value:"+ziQiAppPkg);startActivity(launchIntent);} else {Log.d(TAG," app pkg:"+ziQiAppPkg+" zanwei anzhuang");}  }Log.e(TAG, "onCreate   modify end ");// modify onNewIntent end .........................}    

儿童模式-管控模式-老人模式了解

儿童模式、老人一般存在在电子消费产品上,比如手机上面都有儿童模式的也有老年人模式的。管控模式一般都是工控产品 有这样的业务逻辑。基本思路就是进入这个模式前和退出该输入管理密码,对于模式你们可以自定义一些功能作为显示,比方说显示指定app在桌面;

下面简单看看自己产品上面的儿童模式的几个界面,方便了解。最直接的还是看手机端效果和逻辑,我这里给出界面效果,仅供参考。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

测试

假使儿童模式应用包名:com.fise.dmseries
我们通过adb 设置值
在这里插入图片描述
那重启机器、自动进入儿童模式app, 点击HOME按键、进入其它app 点击HOME 按键。 各种情况测试HOME按键都会回到儿童模式的,说明功能已经完成了。

总结

  • 借助之前文章分析,开机自启应用的一个逻辑,判断是否设置过模式【开机自启APP】+ HOME 按键监听 来实现逻辑
  • 默认的Launcher 是 安卓自带的Launcher3. 这篇文章借助于系统实现了功能。如果Launcher 是第三方应用自己开发,则在其它Launcher 中实现逻辑即可。
http://www.xdnf.cn/news/219709.html

相关文章:

  • 机器学习第四篇 线性回归-最小二乘法
  • 案例分享|20倍提效!水力设备电磁仿真的云端实战
  • DDoS攻击真的无解吗?
  • DeepClaude开源程序可以实现代码生成、创作诗句以及内容创作等功能
  • 详解大语言模型生态系统概念:lama,llama.cpp,HuggingFace 模型 ,GGUF,MLX,lm-studio,ollama这都是什么?
  • 【LaTex】3.8流程图绘制
  • Transformer数学推导——Q34 推导位置插值(Position Interpolation)在长文本外推中的误差上界
  • (02)Redis 的订阅发布Pub/Sub
  • Ubuntu上搭建python环境并安装第三方库
  • C语言教程(二十四):C 语言中递归的详解
  • cuda学习3: 全局线程id计算
  • 大语言模型能否替代心理治疗师的深度拓展研究:fou
  • 两数之和II-输入有序数组(中等)
  • 洛谷题解 | CF1979C Earning on Bets
  • DNA复制过程3D动画教学工具
  • 稳定性 复杂度
  • 浅析localhost、127.0.0.1 和 0.0.0.0的区别
  • 【RocketMq延迟消息操作流程】
  • 鸟笼效应——AI与思维模型【84】
  • Canvas基础篇:概述
  • DeepSeek 本地化部署与 WebUI 配置的方法
  • Fiddler抓取APP端,HTTPS报错全解析及解决方案(一篇解决常见问题)
  • 在Ubuntu中安装python
  • 02_高并发系统问题及解决方案
  • 大模型高效化三大核心技术:量化、蒸馏与剪枝详解
  • 【AI论文】BitNet v2:针对1位LLM的原生4位激活和哈达玛变换
  • 物流新速度:数字孪生让仓库“聪明”起来
  • 民锋视角下的价格波动管理思路
  • 健康养生:拥抱活力生活
  • 【AI提示词】机会成本决策分析师