android – 在自定义ROM中初始设备设置/启动时的同类应用程序的首选应用程序

我们正在使用最新版本的Lollipop构建我们自己的AOSP /自定义ROM.

我们试图建立的是在设备上预装两个主屏幕来构建自定义ROM.
一个将是标准的Andoid“Launcher3”,另一个是我们自己的主屏幕应用程序“foobarhome”.到现在为止还挺好 :-)

我们当前的初始设备启动阶段大致如下:
– 设备启动动画
– GMS SetupWizard(Wi-Fi,语言,Google帐户设置等)
****设备达到设置完成状态****
– ResolverActivity开始显示我们自己的家庭应用程序“foobarhome”和Launcher3(>> BAD GUY<<)之间的选择
– 我们必须选择“foobarhome”来运行“always”
– 我们的主屏应用程序已启动并正在运行

问题:不幸的是,我们将在GMS SetupWizard完成后立即获得ResolverActivity.
ResolverActivity让我们在Launcher3和我们的主屏幕应用程序之间进行选择,我们必须手动选择我们的家庭应用程序(始终运行).
目标:直接启动我们的家庭应用程序,中间没有ResolverActivity.

水面浮油:
在构建自定义ROM并执行我们所有的Androids make文件时,我们将所谓的preferred-activities-home.xml复制到设备上的system / etc / preferred-apps /.

在我们的whatever.mk中,我们有以下代码行:
首选应用设置:

PRODUCT_COPY_FILES += \
    myLocalPath/preferred_activities/preferred-activities-home.xml:system/etc/preferred-apps/preferred-activities-home.xml

这些preferred-activities-home.xml的内容如下所示:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<preferred-activities>
    <item name="com.example.foobarhome/.MainActivity" match="100000" set="2">
        <set name="com.android.launcher3/com.android.launcher3.Launcher" />
        <set name="com.example.foobarhome/.MainActivity" />
        <filter>
            <action name="android.intent.action.MAIN" />
            <cat name="android.intent.category.HOME" />
            <cat name="android.intent.category.DEFAULT" />
        </filter>
    </item>
</preferred-activities>

您可能知道frameworks / base / services / core / java / com / andoid / server / pm / PackageManagerService.java和./Settings.java类正在处理此类配置.

我们的分析:
1)GMS SetupWizard刚刚启动(选择语言页面)
   – >执行adb“shell dumpsys package preferred-xml”或在设备文件dir上检查文件内容:data / system / users / 0 / package-restrictions.xml
   – >寻找xml节点块:

<preferred-activities> ... </preferred-activities>

我们的输出是:

<item name="com.example.foobarhome/.MainActivity" match="100000" always="true" set="4">
    <set name="com.android.settings/.CryptKeeper" />
    <set name="com.google.android.setupwizard/.SetupWizardActivity" />
    <set name="com.example.foobarhome/.MainActivity" />
    <set name="com.android.launcher3/com.android.launcher3.Launcher" />
    <filter>
        <action name="android.intent.action.MAIN" />
        <cat name="android.intent.category.HOME" />
        <cat name="android.intent.category.DEFAULT" />
    </filter>
</item>

2)GMS SetupWizard完成,SetupWizard UI消失,并显示ResolverActivity
   – >可能的选择:

  Use foobarhome as HOME
  buttons "always" and "just once"
  --------------------------------
  Use a different app
  Launcher3

– >再次检查设备中的package-restrictions.xml文件
  输出是:

<item name="com.example.foobarhome/.MainActivity" match="100000" always="false" set="0">
    <filter>
        <action name="android.intent.action.MAIN" />
        <cat name="android.intent.category.HOME" />
        <cat name="android.intent.category.DEFAULT" />
    </filter>
</item>

为什么Launcher3迷路了呢?

3)在选择我们的foobarhome应用程序以便总是运行之后,我们再次检查package-restrictions.xml并且看到 – 我们期望在GMS SetupWizard完成之后看到它.
输出是:

<item name="com.example.foobarhome/.MainActivity" match="100000" always="true" set="2">
    <set name="com.example.foobarhome/.MainActivity" />
    <set name="com.android.launcher3/com.android.launcher3.Launcher" />
    <filter>
        <action name="android.intent.action.MAIN" />
        <cat name="android.intent.category.HOME" />
        <cat name="android.intent.category.DEFAULT" />
    </filter>
</item>

通常,这些preferred-activities.xml方法可以工作,但不知何故它在初始设备启动/设置期间不起作用.
我们想知道为什么我们在去ResolverActivity的途中松开了package-restrictions.xml中的第二个家庭应用程序(Launcher3).

问题:
Q1:有没有办法在Settings.apk(packages / apps / Settings)中预先选择一个主屏幕应用程序,可能是通过aosp_root / frameworks / base / core / java / android / content / res / Configuration.java.
这可能解决了这个问题吗?

Q2:在data / system / users / 0 / package-restrictions.xml中的设备上,我们看到了Lollipop引入的两个新的xml节点(与KitKat相比).
    这些被称为< persistent-preferred-activities />和< crossProfile-intent-filters />.
    它们是什么以及如何使用?
    < persistent-preferred-activities /&gt ;?中子元素的语法是什么?
    关于它的任何公开可用的android文档?

主要问题:如果我们在初始设备启动/设置期间没有获得ResolverActiviy,我们怎能解决这个问题?

最佳答案
对于Q1:我认为你可以像ChooseActivity那样做.关键是要在Launcher之前找到合适的执行时间,我知道,Provision是最好的地方.
你可以调用PackageManager携带的addPreferredActivity()
在供应禁用之前.

转载注明原文:android – 在自定义ROM中初始设备设置/启动时的同类应用程序的首选应用程序 - 代码日志