android - PreferenceScreen 中不同包的 targetClass 时的 ActivityNotFoundException

标签 android package preference

应用程序的默认包是“example.app”。

目标 Activity 的包是“example.app.abc”。

在 java 代码中为“example.app.abc.TheActivity”调用 startActivity() 可以正常工作,

但在preference.xml 上指定它不起作用:

<PreferenceScreen android:key="key"
    android:title="@string/title"
>
    <intent android:action="android.intent.action.MAIN"
        android:targetPackage="example.app.abc"
        android:targetClass="TheActivity"
/>
</PreferenceScreen>

我尝试了 android:targetClass="example.app.abc.TheActivity"但它也不起作用。

是否可以优先启动非默认包的 Activity ?

最佳答案

我在尝试使用 custom preference screen 时遇到了同样的问题来自 AccountManager 帐户设置的库项目。无论我如何尝试调整 targetPackage 和 targetClass 属性,它都会引发异常(除了,因为它是一个帐户,它会使手机崩溃)。

我认为我们只需要假设这是 Android 的限制。这很笨拙,但您真正需要做的就是在应用程序的命名空间中为 Activity 声明一个包装类:

public class MyPreferences extends ActualPreferences {
}

在你的 AndroidManifest.xml 中声明它

<activity android:name=".MyPreferences"/>

然后你可以在你的 Intent 中指定类

<intent android:targetPackage="com.my.package"
        android:targetClass="com.my.package.MyPreferences" />

顺便说一句,语法非常繁琐,至少对于帐户偏好而言。所有这些变体都失败了:

<!-- fails --> <intent android:targetClass="com.my.package.MyPreferences" />
<!-- fails --> <intent android:targetClass="MyPreferences" 
                       android:targetPackage="com.my.package"/>
<!-- fails --> <intent android:targetClass=".MyPreferences"
                       android:targetPackage="com.my.package"/>
<!-- fails --> <intent android:targetClass="settings.MyPreferences"
                       android:targetPackage="com.my.package"/>
<!-- fails --> <intent android:targetClass=".settings.MyPreferences"
                       android:targetPackage="com.my.package"/>
<!-- fails --> <intent android:targetClass="com.my.other.package.MyPreferences"
                       android:targetPackage="com.my.package"/>

关键因素显然是 android:targetPackage 属性与应用程序包匹配。如果需要,可以将 Activity 放在子包中。这有效:

<intent android:targetPackage="com.my.package"
        android:targetClass="com.my.package.settings.MyPreferences" />

关于android - PreferenceScreen 中不同包的 targetClass 时的 ActivityNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4360100/

相关文章:

java - Gson 反序列化预期为 BEGIN_ARRAY,但实际为 STRING

R 包 data.table 无法在 R 3.5.1 系统上安装/编译

java - 如何获取最新的共享首选项

java - 来自不同类的自定义 SeekBarPreference setProgress?

android - 如何更改 TextInputLayout 中的提示文本大小

java - 在 Java/Android 中显示天数差异

android - 如何正确设置 ZXingScannerView 的选项?

java - 如何使类可以从不同的包访问,但不能从java中的不同库/jar访问?

Python Pylearn2 包 "ImportError: No module named pylearn2.utils"

android - 从 Preference fragment 中打开 fragment ;从 Android 上的嵌套首选项屏幕更改操作栏布局