Android默认桌面设置终级大招

最近研究桌面程序开发,遇到一个难题,就是按Home键没法选择自己的桌面作为默认桌面,经过一番辛苦的查找组合,终于从各个旮旯挖出代码,然后组合修改,调试,终于修成正果。各位看官,直接看代码:


import android.app.Activity;
import android.app.WallpaperManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.provider.Contacts;
import android.provider.Settings;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.GridLayout;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.RelativeSizeSpan;
import android.text.style.SuperscriptSpan;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.DigitalClock;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;


import com.disney.sclocker.R;
import com.disney.sclocker.alarm.ClockAlarmActivity;
import com.disney.sclocker.locker.ScreenLockService;
import com.disney.sclocker.util.Utils;
import com.disney.sclocker.widget.DisneyAnalogClockV1;
import com.disney.sclocker.widget.GuideViewPager;


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;


public class DesktopActivity extends Activity {
    


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        


        setContentView(R.layout.activity_desktop);
        
        //HOME键侦测
        IntentFilter homeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        registerReceiver(homeReceiver, homeFilter);
        Log.d("123", "android.os.Build.MANUFACTURER=" + android.os.Build.MANUFACTURER);
    }




    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                return true;
            case KeyEvent.KEYCODE_HOME:
                return true;
        }
        return super.onKeyDown(keyCode, event);
    }




    //Home键侦测---[----
    private final BroadcastReceiver homeReceiver = new BroadcastReceiver() {
        final String SYS_KEY = "reason"; // 标注下这里必须是这么一个字符串值


        final String SYS_HOME_KEY = "homekey";// 标注下这里必须是这么一个字符串值


        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra(SYS_KEY);
                if (reason != null && reason.equals(SYS_HOME_KEY)) {
                    Log.i("TT", "home键监听");
                    String currentHome = getHomeLauncher();
                    Log.i("TT", "currentHome="+currentHome);
                    if (isDefaultHome()) {
                        return;
                    }
                    setDefaultL();




                }
            }
        }
    };


    private void setDefaultL(){


        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory("android.intent.category.HOME");
        try {
            intent.setComponent(new ComponentName("android","com.android.internal.app.ResolverActivity"));
            startActivity(intent);
        }catch (Exception e){//这里就是为了处置华为手机的
            try {

intent.setComponent(new ComponentName("com.huawei.android.internal.app", "com.huawei.android.internal.app.HwResolverActivity"));//这个类有些华为手机找不到
                startActivity(intent);
            } catch (Exception e1){
                e1.printStackTrace();
                try {
                    startHuaweiSettingActOfDefLauncher();//开启桌面设置
                }catch(Exception e2){
                    e2.printStackTrace();
                    intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);//还不行,就只能应用程序设置了
                    startActivity(intent);
                }


            }
        }
    }


    /**
     * 判断自己是否为默认桌面
     */
    public final boolean isDefaultHome() {
        Intent intent = new Intent(Intent.ACTION_MAIN);//Intent.ACTION_VIEW
        intent.addCategory("android.intent.category.HOME");
        intent.addCategory("android.intent.category.DEFAULT");
        PackageManager pm = getPackageManager();
        ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
        boolean isDefault = getPackageName().equals(info.activityInfo.packageName);
        return isDefault;
    }


    public void startHuaweiSettingActOfDefLauncher() {
        IntentFilter localIntentFilter = new IntentFilter();
        localIntentFilter.addAction(Intent.ACTION_MAIN);//"android.intent.action.MAIN"
        localIntentFilter.addCategory(Intent.CATEGORY_HOME);//"android.intent.category.HOME"
        Intent localIntent3 = new Intent(localIntentFilter.getAction(0));
        localIntent3.addCategory(localIntentFilter.getCategory(0));
        Intent localIntent4 = new Intent();
        localIntent4.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        localIntent4.setClassName("com.android.settings", "com.android.settings.Settings$PreferredSettingsActivity");
        localIntent4.putExtra("preferred_app_package_name", getPackageName());
        localIntent4.putExtra("preferred_app_class_name", DesktopActivity.class.getName());
        localIntent4.putExtra("is_user_confirmed", true);
        localIntent4.putExtra("preferred_app_intent", localIntent3);
        localIntent4.putExtra("preferred_app_intent_filter", localIntentFilter);
        localIntent4.putExtra("preferred_app_label", "默认桌面设置");
        startActivity(localIntent4);
    }


    


    private String getHomeLauncher() {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, 0);
        String currentHomePackage = resolveInfo.activityInfo.packageName;
        return currentHomePackage;
    }


    @Override
    protected void onDestroy() {
        unregisterReceiver(homeReceiver);
        super.onDestroy();
    }
  
}

<think>嗯,用户提出了一个关于Android重置默认显示小后发生变化的解决方案或原因分析的问题。用户在上一个查询中提到了Android的显示方向布局和数据库管理选项的引用,但那些看起来是之前对话的残留信息,当前问题聚焦在显示尺寸重置上。用户可能是普通Android用户,遇到了重置显示设置后界面元素小突然改变的问题。ta可能不太熟悉开发者选项等高设置,但已经尝试过重置操作。从ta提问方式看,用户希望得到直接可操作的解决方案,同时也想理解背后的原因。这个问题需要从多个层面分析:首先解释Android显示系统三个核心参数的相互作用(字体小、显示尺寸、屏幕密度),然后提供渐进式解决方案。考虑到用户可能不太熟悉DP、SP等单位,解释时需要避免过多技术术语,而是用"文字小"、"整体缩放"这样直观的描述。解决方案设计上要覆盖:1.最直接的调节路径(设置菜单)2.用户可能需要的深度配置(开发者选项)3.容易忽略的特殊情况(不同品牌定制UI)4.极解决手段(备份后恢复出厂设置)需要特别注意某些品牌的定制化设置可能隐藏较深,比如三星要在"高功能"里找,这点要单独强调。另外第三方启动器的影响也值得提醒,用户可能没意识到第三方桌面应用会覆盖系统显示设置。在原因分析部分,要说明重置操作会同时恢复字体和尺寸设置,而不同Android版本对这两个参数的处理逻辑有差异。特别是Android7.0后这两个设置分离的变化,以及Android12引入的动态尺寸功能可能带来的额外影响。相关问题的延伸要实用:询问品牌能给出针对性建议,询问版本号可以判断是否受Android12+的动态特性影响,而问是否重置其他设置能帮助判断是否为字体小牵连问题。这样后续交互就能更精准定位问题。</think> 针对Android重置默认显示小后界面异常的问题,请按以下步骤排查解决: ### 原因分析 1. **显示尺寸与字体分离** Android 7.0+系统将「显示小」与「字体小」设为独立选项,重置操作可能: - 同时恢复两项默认值 - 导致第三方应用布局异常(部分应用未适配动态尺寸) 2. **系统深度重置** 默认显示尺寸关联系统底层配置(`DisplayMetrics.density`)[^1],重置会清除所有自定义缩放参数。 3. **屏幕密度校准** 设备可能重新读取物理屏幕DPI值,导致缩放倍率变化(常见于系统升后) --- ### 解决方案(逐步操作) #### 📱 基础设置 1. **手动调整显示尺寸** 进入 `设置 > 显示 > 显示小与文字` - 拖动「显示小」滑块(建议从最小档开始测试) - 单独调节「字体小」避免文字错位 2. **强制重绘界面** ```android // 开发者选项中启用强制刷新 adb shell settings put global window_animation_scale 0 adb shell settings put global transition_animation_scale 0 ``` > 注:需先启用「开发者模式」(设置 > 关于手机 > 版本号连点7次) #### ⚙ 高修复 3. **重置系统显示配置** ```terminal adb shell settings delete system display_size adb shell settings delete system font_scale adb shell am restart ``` 4. **恢复出厂显示参数** 删除配置文件: ```terminal adb shell rm /data/system/users/0/settings_display.xml adb reboot ``` #### ⚠ 特殊情况处理 5. **品牌定制系统**(需额外操作) | 品牌 | 特殊路径 | |----------|------------------------------| | 小米 | 设置 > 更多设置 > 无障碍 > 显示小 | | 三星 | 设置 > 高功能 > 屏幕缩放 | | EMUI | 设置 > 智能辅助 > 单手操作 | 6. **修复第三方应用布局异常** 在 `应用信息 > 高 > 兼容性` 中: - 启用「保留小更改」(Android 12+) - 强制应用使用默认显示密度 --- ### 预防措施 1. **备份显示参数**(需Root) 备份 `/data/system/users/0/settings_display.xml` 2. **禁用自动优化** 关闭「开发者选项」中的: ```markdown [ ] 启用自动优化应用(GPU过度绘制) [ ] 强制启用4x MSAA ``` > 如仍异常,可能是系统Bug(多见于Android 10-12),可尝试 **清除系统UI缓存**: > ```terminal > adb shell pm clear com.android.systemui > ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值