Android 10 设置默认启动桌面

2025-11-02 01:28:11      匈牙利世界杯

1.需求,内置客户应用并且设置系统桌面,并且保留系统launcher

方式1):

1.直接去掉launch的home属性,去掉home属性会有个bug;

对文件进行修改:

/android/frameworks/base/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java

Index: OverviewProxyService.java

===================================================================

--- OverviewProxyService.java (版本 13296)

+++ OverviewProxyService.java (版本 13297)

@@ -83,7 +83,11 @@

import javax.inject.Inject;

import javax.inject.Singleton;

+import android.app.ActivityManager;

+import java.util.List;

+

+

/**

* Class to send information from overview to launcher with a binder.

*/

@@ -108,7 +112,7 @@

private final ComponentName mRecentsComponentName;

private final DeviceProvisionedController mDeviceProvisionedController;

private final List mConnectionCallbacks = new ArrayList<>();

- private final Intent mQuickStepIntent;

+ private Intent mQuickStepIntent=null;

private Region mActiveNavBarRegion;

@@ -466,8 +470,13 @@

mConnectionBackoffAttempts = 0;

mRecentsComponentName = ComponentName.unflattenFromString(context.getString(

com.android.internal.R.string.config_recentsComponentName));

- mQuickStepIntent = new Intent(ACTION_QUICKSTEP)

+

+ if( isRunProcess() ) {

+ mQuickStepIntent = new Intent(ACTION_QUICKSTEP)

.setPackage(mRecentsComponentName.getPackageName());

+ }

+

+

mWindowCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext.getResources());

mSupportsRoundedCornersOnWindows = ScreenDecorationsUtils

.supportsRoundedCornersOnWindows(mContext.getResources());

@@ -494,6 +503,24 @@

statusBarWinController.registerCallback(mStatusBarWindowCallback);

}

+

+

+ //判断是否在主进程,这个方法判断进程名或者pid都可以,如果进程名一样那pid肯定也一样

+ public boolean isRunProcess() {

+ ActivityManager am = ((ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE));

+ List infos = am.getRunningAppProcesses();

+ String mainProcessName ="com.android.launcher3";//getPackageName();

+ //int myPid = android.os.Process.myPid();

+ //info.pid == myPid &&

+ for (ActivityManager.RunningAppProcessInfo info : infos) {

+ if ( mainProcessName.equals(info.processName)) {

+ return true;

+ }

+ }

+ return false;

+ }

+

+

public void notifyBackAction(boolean completed, int downX, int downY, boolean isButton,

boolean gestureSwipeLeft) {

try {

@@ -753,9 +780,11 @@

}

private void updateEnabledState() {

- mIsEnabled = mContext.getPackageManager().resolveServiceAsUser(mQuickStepIntent,

- MATCH_SYSTEM_ONLY,

- ActivityManagerWrapper.getInstance().getCurrentUserId()) != null;

+ if(mQuickStepIntent!=null){

+ mIsEnabled = mContext.getPackageManager().resolveServiceAsUser(mQuickStepIntent,

+ MATCH_SYSTEM_ONLY,

+ ActivityManagerWrapper.getInstance().getCurrentUserId()) != null;

+ }

}

@Override

@@ -772,7 +801,9 @@

.isCurrentUserSetup());

pw.print(" connectionBackoffAttempts="); pw.println(mConnectionBackoffAttempts);

- pw.print(" quickStepIntent="); pw.println(mQuickStepIntent);

+ if( mQuickStepIntent !=null ){

+ pw.print(" quickStepIntent="); pw.println(mQuickStepIntent);

+ }

pw.print(" quickStepIntentResolved="); pw.println(isEnabled());

pw.print(" mSysUiStateFlags="); pw.println(mSysUiStateFlags);

pw.println(" " + QuickStepContract.getSystemUiStateString(mSysUiStateFlags));

方式2:直接设置为默认桌面

参考:https://blog.csdn.net/qq_27256793/article/details/105413675

在全志10上面,这个方法不行,所以做了些修改

/android/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java

Index: ResolverActivity.java

===================================================================

@@ -287,6 +287,19 @@

supportsAlwaysUseOption);

}

+ private boolean setupDefaultLauncher(String packageName) {

+ DisplayResolveInfo info = mAdapter.getDefaultHome(packageName);

+ if (info == null) {

+ Log.w(TAG, "not find default Home");

+ return false;

+ }

+ onTargetSelected(info, true);

+ MetricsLogger.action(this, MetricsProto.MetricsEvent.ACTION_APP_DISAMBIG_ALWAYS);

+ dismiss();

+ return true;

+ }

+

protected void onCreate(Bundle savedInstanceState, Intent intent,

CharSequence title, int defaultTitleRes, Intent[] initialIntents,

List rList, boolean supportsAlwaysUseOption) {

@@ -334,6 +347,16 @@

return;

}

+ //add start

+ boolean isSetDefLauncher= (Settings.System.getInt(getContentResolver(), "xxx", 0) == 0);

+ if(isSetDefLauncher){

+ if(setupDefaultLauncher("xxx")){

+ Settings.System.putInt(getContentResolver(), "xxx", 1);

+ finish();

+ return;

+ }

+ }

+

final ResolverDrawerLayout rdl = findViewById(R.id.contentPanel);

if (rdl != null) {

rdl.setOnDismissedListener(new ResolverDrawerLayout.OnDismissedListener() {

@@ -1632,6 +1655,29 @@

mResolverListController = resolverListController;

}

+ public DisplayResolveInfo getDefaultHome(String packageName){

+ DisplayResolveInfo otherProfile=null;

+ for (int i = 0; i < mUnfilteredResolveList.size(); i++) {

+ ResolvedComponentInfo info = mUnfilteredResolveList.get(i);

+ for (int j = 0; j < info.getCount(); j++) {

+ ResolveInfo _info = info.getResolveInfoAt(j);

+ Log.w(TAG, "info.activityInfo.packageName ="+_info.activityInfo.packageName);

+ if (_info.activityInfo.packageName.equals(packageName)) {

+ otherProfile = new DisplayResolveInfo(info.getIntentAt(j),

+ info.getResolveInfoAt(j),

+ info.getResolveInfoAt(j).loadLabel(mPm),

+ info.getResolveInfoAt(j).loadLabel(mPm),

+ getReplacementIntent(info.getResolveInfoAt(j).activityInfo,

+ info.getIntentAt(j)));

+ return otherProfile;

+ }

+ }

+ }

+ return otherProfile;

+ }

+

public void handlePackagesChanged() {

rebuildList();

if (getCount() == 0) {

方式3:

/android/packages/apps/Provision/src/com/android/provision/DefaultActivity.java

===================================================================

@@ -22,6 +22,18 @@

import android.os.Bundle;

import android.provider.Settings;

+import android.app.AppOpsManager;

+import android.content.ComponentName;

+import android.content.Intent;

+import android.content.IntentFilter;

+import android.content.pm.PackageInfo;

+import android.content.pm.PackageManager;

+import android.content.pm.PermissionInfo;

+import android.content.pm.ResolveInfo;

+import java.util.ArrayList;

+import java.util.List;

+import android.content.Context;

+

/**

* Application that sets the provisioned bit, like SetupWizard does.

*/

@@ -40,9 +52,112 @@

ComponentName name = new ComponentName(this, DefaultActivity.class);

pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

PackageManager.DONT_KILL_APP);

-

+ setAppPermission("xxx");

+ setHomeDefault("xxx", "xxx");

// terminate the activity.

finish();

}

+

+

+ public void setAppPermission(String pkgName) {

+ PackageManager pm = getApplicationContext().getPackageManager();

+ AppOpsManager mAppOps = (AppOpsManager) getApplicationContext().getSystemService(Context.APP_OPS_SERVICE);

+ try {

+ PackageInfo pkgInfo = pm.getPackageInfo(pkgName, PackageManager.GET_PERMISSIONS);

+ String sharedPkgList[] = pkgInfo.requestedPermissions;

+ for (int i = 0; i < sharedPkgList.length; i++) {

+ String permName = sharedPkgList[i];

+ PermissionInfo permissionInfo;

+ try {

+ permissionInfo = pm.getPermissionInfo(permName, 0);

+ } catch (PackageManager.NameNotFoundException e) {

+ continue;

+ }

+ final int opCode = AppOpsManager.permissionToOpCode(permName);

+ boolean hasAopsCode = opCode > AppOpsManager.OP_NONE && opCode < AppOpsManager._NUM_OP;

+ String aopStr = AppOpsManager.permissionToOp(permName);

+ boolean hasAopsOp = aopStr != null;

+ boolean onlyAops = false;

+ final boolean granted = (pkgInfo.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0;

+ if ((permissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) != PermissionInfo.PROTECTION_DANGEROUS || (permissionInfo.flags & PermissionInfo.FLAG_INSTALLED) == 0 || (permissionInfo.flags & PermissionInfo.FLAG_REMOVED) != 0) {

+ if (permName.startsWith("android.") && (hasAopsCode || hasAopsOp)) {

+ onlyAops = true;

+ android.util.Log.d("SHENJU", "permissionName=" + permName + ",opCode=" + opCode);

+ } else continue;

+ }

+ boolean isAopsAllowed = mAppOps.checkOpNoThrow(opCode, pkgInfo.applicationInfo.uid, pkgInfo.packageName) == AppOpsManager.MODE_ALLOWED;

+ if ((hasAopsCode || onlyAops) && !isAopsAllowed)

+ mAppOps.setMode(opCode, pkgInfo.applicationInfo.uid, pkgInfo.packageName, AppOpsManager.MODE_ALLOWED);

+ if ((hasAopsOp || onlyAops) && !isAopsAllowed)

+ mAppOps.setUidMode(aopStr, pkgInfo.applicationInfo.uid, AppOpsManager.MODE_ALLOWED);

+ if (!granted && !onlyAops) {

+ pm.grantRuntimePermission(pkgName, permName, android.os.Process.myUserHandle());

+ }

+ // set flags

+ pm.updatePermissionFlags(permName, pkgName, PackageManager.FLAG_PERMISSION_USER_FIXED | PackageManager.FLAG_PERMISSION_USER_SET | PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED, 0, android.os.Process.myUserHandle());

+ }

+ List ops = mAppOps.getOpsForPackage(pkgInfo.applicationInfo.uid, pkgName, null,null);

+ if (ops == null || ops.size() == 0) return;

+ for (AppOpsManager.PackageOps packageOps : ops) {

+ List entries = packageOps.getOps();

+ if (entries == null || entries.size() == 0) continue;

+ for (AppOpsManager.OpEntry opEntry : entries) {

+ mAppOps.setMode(opEntry.getOp(), packageOps.getUid(), pkgName, AppOpsManager.MODE_ALLOWED);

+ }

+ }

+ } catch (Exception e) {

+ android.util.Log.e("SHENJU", "++setAppPermission exception ,the packageName is " + pkgName, e);

+ }

+ }

+

+ public void setHomeDefault(String defaultlauncherpckname, String defaultlauncherclsname) {

+ final PackageManager mPm = getApplicationContext().getPackageManager();

+ // 判断指定的 launcher 是否存在

+ if (hasApkInstalled(defaultlauncherpckname)) {

+ // 清除当前默认 launcher

+ ArrayList intentList = new ArrayList();

+ ArrayList cnList = new ArrayList();

+ mPm.getPreferredActivities(intentList, cnList, null);

+ IntentFilter dhIF = null;

+ for (int i = 0; i < cnList.size(); i++) {

+ dhIF = intentList.get(i);

+ if (dhIF.hasAction(Intent.ACTION_MAIN) && dhIF.hasCategory(Intent.CATEGORY_HOME)) {

+ mPm.clearPackagePreferredActivities(cnList.get(i).getPackageName());

+ }

+ }

+ // 获取所有 launcher activity

+ Intent intent = new Intent(Intent.ACTION_MAIN);

+ intent.addCategory(Intent.CATEGORY_HOME);

+ List list = new ArrayList();

+ list = mPm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

+ // get all components and the best match

+ IntentFilter filter = new IntentFilter();

+ filter.addAction(Intent.ACTION_MAIN);

+ filter.addCategory(Intent.CATEGORY_HOME);

+ filter.addCategory(Intent.CATEGORY_DEFAULT);

+ final int N = list.size();

+ // 设置默认 launcher

+ ComponentName launcher = new ComponentName(defaultlauncherpckname, defaultlauncherclsname);

+ ComponentName[] set = new ComponentName[N];

+ int defaultMatch = 0;

+ for (int i = 0; i < N; i++) {

+ ResolveInfo r = list.get(i);

+ set[i] = new ComponentName(r.activityInfo.packageName, r.activityInfo.name);

+ if (launcher.getClassName().equals(r.activityInfo.name)) {

+ defaultMatch = r.match;

+ }

+ }

+ mPm.addPreferredActivity(filter, defaultMatch, set, launcher);

+ }

+ }

+

+ private boolean hasApkInstalled(String pkgname) {

+ try {

+ getApplicationContext().getPackageManager().getPackageInfo(pkgname, 0);

+ } catch (Exception e) {

+ return false;

+ }

+ return true;

+ }

}

泰拉瑞亚boss顺序
Windows 11桌面卡死怎么办?如何解决?