Android系统默认锁定自己的Home主页Launcher

本文详细介绍了一种在Android设备上定制默认Launcher的方法,包括修改ActivityMangerService、PhoneWindowManager及ResolverActivity等关键组件,确保设备开机及Home键操作始终调用自定义Launcher,并通过系统设置锁定,防止用户更改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全志H2H3方案里的方法是:
device\softwinner\dolphin-fvd-p1\dolphin_fvd_p2.mk
在变量PRODUCT_PROPERTY_OVERRIDES添加
PRODUCT_PROPERTY_OVERRIDES += \
                ro.sw.defaultlauncherpackage=com.android.launcher \
                ro.sw.defaultlauncherclass=com.android.launcher2.Launcher
最终在/system/build.prop 文件生成这2个属性:
ro.sw.defaultlauncherpackage=com.android.launcher
ro.sw.defaultlauncherclass=com.android.launcher2.Launcher                

使用H3文档里面说的方法,虽然H5的代码ActivityMangerService里面有 setDefaultLauncher()方法,
但是没有效果。找了网上类似的方法也没有用。最后我是这样改的:

修改
frameworks\base\services\core\java\com\android\server\am\ActivityMangerService.java

在boolean startHomeActivityLocked(int userId, String reason) {
中添加

  if(aInfo == null){
    intent = getHomeIntent();
    aInfo =resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
    }

//add by zhaoyf start    
     PackageManager pm = mContext.getPackageManager();
     Intent newintent = new Intent(Intent.ACTION_MAIN);
           newintent.addCategory(Intent.CATEGORY_HOME);
            List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(newintent, 0);
            //判断带有Intent.CATEGORY_HOME标签的所有activity中如果有你指定的activity则替换
                if(resolveInfoList != null){
                int size = resolveInfoList.size();
                 for(int i = 0; i < size; i++){
                    ResolveInfo rInfo = resolveInfoList.get(i);
                    if(rInfo.activityInfo.name.equals("com.ider.launcher.MainActivity")){//设置自己的Launcher
                    aInfo = rInfo.activityInfo;
                    }
              }
           }
//add by zhaoyf stop
           intent.setComponent(new ComponentName(
                    aInfo.applicationInfo.packageName, aInfo.name));
            // Don't do this if the home app is currently being
            // instrumented.
            aInfo = new ActivityInfo(aInfo);
            aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);
            ProcessRecord app = getProcessRecordLocked(aInfo.processName,
                    aInfo.applicationInfo.uid, true);
            if (app == null || app.instrumentationClass == null) {
                intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
                //这里启动你已替换过的activity
                mStackSupervisor.startHomeActivity(intent, aInfo);
            }
        }
        return true;
    }
          
在PhoneWindowManager.java 中添加
public void init(Context context, IWindowManager windowManager,
            WindowManagerFuncs windowManagerFuncs) {
            ......
        mHomeIntent =  new Intent(Intent.ACTION_MAIN, null);
        mHomeIntent.addCategory(Intent.CATEGORY_HOME);
        
        //add by zhaoyf start
        //需要默认的Launcher
        ComponentName mHomecom = new ComponentName("com.android.launcher3", "com.android.launcher3.Launcher");
        mHomeIntent.setComponent(mHomecom);
        //add zhaoyf stop
        
        mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            ......
}
OK就是这样了

==================2018.12.22==================
上面的做法虽然能保证每次开机进入到默认的Launcher,而且按Home键回到默认的Launcher,(需要在PhoneWindowManager里面加上Home键监听)
可以满足大多数要求,但是由于默认Home是没有锁定的,这样会有一个问题,比如有的APK在退出时会做一番处理,通过隐式调用Home启动Activity,这样就会出现Home选择列表了。
所以需要通过下面这种方法可以锁定自己的Launcher为默认的Home
在 frameworks/base/core/java/com/android/internal/app/ResolverActivity.java 中作修改

根据需要默认Launcher来设置默认
//add++++++++++++++++++
    private void setDefaultLauncher(String defPackageName,String defClassName) {
        if ((defPackageName != null && defPackageName.trim().length() > 1) && (defClassName != null && defClassName.trim().length() > 0)) {
            IntentFilter filter = new IntentFilter();
            filter.addAction("android.intent.action.MAIN");
            filter.addCategory("android.intent.category.HOME");
            filter.addCategory("android.intent.category.DEFAULT");
     
            Intent intent=new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            List<ResolveInfo> list = new ArrayList<ResolveInfo>();
            list = getPackageManager().queryIntentActivities(intent, 0);
            final int N = list.size();
            ComponentName[] set = new ComponentName[N];
            int bestMatch = 0;
            for (int i=0; i<N; i++) {
                ResolveInfo r = list.get(i);
                set[i] = new ComponentName(r.activityInfo.packageName,
                        r.activityInfo.name);
                if (r.match > bestMatch) bestMatch = r.match;
            }
            ComponentName preActivity = new ComponentName(defPackageName, defClassName);
            getPackageManager().addPreferredActivity(filter, bestMatch, set,preActivity);
        }
    }
//add++++++++++++++++++end

在onCreate方法中添加调用

    protected void onCreate(Bundle savedInstanceState) {
        //add++++++++++++
        boolean firstBoot = (Settings.System.getInt(getApplication().getContentResolver(),
                    Settings.System.DEFAULT_HOME_SETTING_CHANGED, 0) == 0);
        if(firstBoot){
            String defPackageName = "com.panasonic.india.flexuihome";
            String defClassName = "com.panasonic.india.flexuihome.Launcher";
            setDefaultLauncher(defPackageName,defClassName);
     
            android.util.Log.i("deflauncher : ","deflauncher : PackageName = "+
                defPackageName+" ClassName = "+defClassName);
            Intent defIntent = new Intent();
            defIntent.setClassName(defPackageName, defClassName);
            defIntent.setAction("android.intent.action.MAIN");
            defIntent.addCategory("android.intent.category.HOME");
            defIntent.addCategory("android.intent.category.DEFAULT");
            startActivity(defIntent);
            Settings.System.putInt(getApplication().getContentResolver(),
                    Settings.System.DEFAULT_HOME_SETTING_CHANGED,1);
            this.finish();
        }
        //add++++++++++++end
        // Use a specialized prompt when we're handling the 'Home' app startActivity()
        final int titleResource;
        final Intent intent = makeMyIntent();
        final Set<String> categories = intent.getCategories();
        if (Intent.ACTION_MAIN.equals(intent.getAction())
                && categories != null
                && categories.size() == 1
                && categories.contains(Intent.CATEGORY_HOME)) {
            titleResource = com.android.internal.R.string.whichHomeApplication;
        } else {
            titleResource = com.android.internal.R.string.whichApplication;
        }
     
        onCreate(savedInstanceState, intent, getResources().getText(titleResource),
                null, null, true);
    }


DEFAULT_HOME_SETTING_CHANGED的设置

在core/java/android/provider/Settings.java的public static final class System extends NameValueTable{}中添加

public static final String DEFAULT_HOME_SETTING_CHANGED = "default_home_setting_changed";

packages/SettingsProvider/res/values/defaults.xml中添加

<integer name="default_launcher_value">0</integer>

packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

在private void loadSystemSettings(SQLiteDatabase db){}中添加中添加

loadIntegerSetting(stmt, Settings.System.DEFAULT_HOME_SETTING_CHANGED, R.integer.default_launcher_value);

这种方式是在第一次开机的时候,在ResolverActivity的onCreate方法中调用setDefaultLauncher()来设置默认的Launcher

这样还有一个问题:在系统Settings的Application里面可以找到所有APP的列表,点击任意一个Home类的APP,里面都有默认Home这一项,点击之后还是可以修改默认的Launcher.要测地解决可能需要隐藏掉这个选项,或者直接隐藏掉home类的APP,不让他们出现在所有列表里面,这样用户就彻底没有办法修改默认主页了。这个有待进一步去研究。
迫于时间仓促,产品急于要软件,暂时只能是修改Home键的监听,默认调用自己的Launcher
在PhoneWindowManager里面的init()修改,加上home键监听
 /** {@inheritDoc} */
    @Override
    public void init(Context context, IWindowManager windowManager,
            WindowManagerFuncs windowManagerFuncs) {
            
        mHomeIntent =  new Intent(Intent.ACTION_MAIN, null);
        mHomeIntent.addCategory(Intent.CATEGORY_HOME);
            //add by zhaoyf start
            ComponentName mHomecom = new ComponentName("com.ider.launcherpackage", "com.ider.launcherpackage.launcher.MainActivity");
            mHomeIntent.setComponent(mHomecom);
            //add zhaoyf stop
        mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值