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

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


参考资料

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() {
        @Override
        public 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 方法中添加开机自启机制

 @Override
    protected 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 中实现逻辑即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值