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 中实现逻辑即可。