android 7.1 缺少设置directBootAware导致无法启动指定Launcher

简介: android 7.1 缺少设置directBootAware导致无法启动指定Launcher

平台:


Amlogic s905X + Android 7.1

问题:


内置指定应用作为Launcher并默认启动(PS: 同时存在MboxLauncher).
开机后, 无法进入指定Launcher, 但是, 在输入HOME键后, 却可以显示存在两个Launcher, 
通过代码检测, 也可以检测出指定Launcher存在.

分析:


|–frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

boolean startHomeActivityLocked(int userId, String reason) {
        if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
                && mTopAction == null) {
            // We are running in factory test mode, but unable to find
            // the factory test app, so just sit around displaying the
            // error message and don't try to start anything.
            return false;
        }
//新增代码:
  Intent intent = null;
  ActivityInfo aInfo = null;
  final String spPkg = "com.android.launcher";
  final String spCls = "com.android.launcher.Launcher";
  if(!android.text.TextUtils.isEmpty(spPkg) && !android.text.TextUtils.isEmpty(spCls)){
/*源码中Launcher2的Intent包含:
*    <action android:name="android.intent.action.MAIN" />
*               <category android:name="android.intent.category.HOME" />
*               <category android:name="android.intent.category.DEFAULT" />
*               <category android:name="android.intent.category.MONKEY"/>
*/
    intent = new Intent(mTopAction);
    intent.addCategory(Intent.CATEGORY_HOME);
//指定包类名
    intent.setComponent(new ComponentName(spPkg, spCls));
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_DEBUG_TRIAGED_MISSING);
    try{
    List<ResolveInfo> ris = AppGlobals.getPackageManager().queryIntentActivities(intent, null, 0, userId).getList();
//异常时:ris.size == 0, 即找不到所想要的Activity组件
//正常时:ris.size == 1
    if(ris != null && ris.size() > 0){
      ResolveInfo rinfo = ris.get(0);
      if(rinfo != null)aInfo = rinfo.activityInfo;
    }
    }catch(Exception e){e.printStackTrace();}
  }
//以下为原有代码
  if(aInfo == null){
    intent = getHomeIntent();
    aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
  }
        if (aInfo != null) {
            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);
                mActivityStarter.startHomeActivityLocked(intent, aInfo, reason);
            }
        } else {
            Slog.wtf(TAG, "No home screen found for " + intent, new Throwable());
        }
        return true;
    }

逻辑上并没有问题, 问题的根本原因在:

|-- device/amlogic/XXX/overlay/vendor/amlogic/apps/MboxLauncher2/AndroidManifest.xml

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:directBootAware="true" >
        <activity
            android:name=".Launcher"
            android:clearTaskOnLaunch="true"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:stateNotNeeded="true" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY" />
            </intent-filter>
        </activity>
    </application>

指定Launcher 缺少了上面 android:directBootAware="true" 定义.

加入此属性后测试, 解决!

参考:


https://blog.csdn.net/ch853199769/article/details/78666187

相关文章
|
5月前
|
XML API Android开发
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
本文介绍了如何使用androidx.preference库快速创建具有一级和二级菜单的Android设置界面的步骤和示例代码。
155 1
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
|
4月前
|
Android开发
Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
本文介绍了 `SpannableString` 在 Android 开发中的强大功能,包括如何在单个字符串中应用多种样式,如颜色、字体大小、风格等,并提供了详细代码示例,展示如何设置文本颜色、添加点击事件等,助你实现丰富文本效果。
337 3
|
5月前
|
Java 网络安全 开发工具
UNITY与安卓⭐一、Android Studio初始设置
UNITY与安卓⭐一、Android Studio初始设置
|
6月前
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
159 12
|
4月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
164 0
|
5月前
|
开发工具 Android开发
Android项目架构设计问题之外部客户方便地设置回调如何解决
Android项目架构设计问题之外部客户方便地设置回调如何解决
35 0
|
5月前
|
数据可视化 Java 数据挖掘
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
42 0
|
6月前
|
Java Android开发
android 设置系统时间的流程
android 设置系统时间的方法
457 2
|
7月前
|
Android开发
Android Studio(2022.3.1)设置阿里云源-新旧版本
Android Studio(2022.3.1)设置阿里云源-新旧版本
1310 1
|
7月前
|
XML Java Android开发
Android RecyclerView用代码动态设置item的selector
Android RecyclerView用代码动态设置item的selector
52 0