将PreferenceScreen与applicationIdSuffix一起使用

Sal*_*lem 5 android gradle preferenceactivity android-manifest

我在制作PreferenceScreenapplicationIdSuffix合作方面遇到了一些问题.

假设我的应用程序包/ applicationIdcom.myapp在摇篮和在AndroidManifest.xml,并且applicationIdSuffix被定义为:

buildTypes {
    debug {
        applicationIdSuffix '.dev'
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我定义PreferenceScreen如下

<PreferenceScreen
    android:key="key_about" android:summary="something" android:title="About">
    <intent
        android:targetClass="com.myapp.activities.AboutActivity"
        android:targetPackage="com.myapp" />
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)

当启动应用程序的调试版本时,我得到一个例外

java.lang.SecurityException: Permission Denial: starting Intent { (...) } from ProcessRecord{(...)} (pid=13658, uid=10105) not exported from uid 10067
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为我正在尝试从不同的应用程序启动一个活动.问题是我无法找到一种方法来启动Android正确的活动.

如果我更改targetClass为".activities.AboutActivity",它仍然无法找到该活动

ActivityNotFoundException: Unable to find explicit activity class {com.myapp.dev/.activities.AboutActivity}
Run Code Online (Sandbox Code Playgroud)

我甚至尝试使用正确的包为每个版本定义一个值:

android:targetClass="@string/classname"
android:targetPackage="@string/packagename"
Run Code Online (Sandbox Code Playgroud)

但它找不到合适的活动:

ActivityNotFoundException: Unable to find explicit activity class
    {com.myapp.dev/com.myapp.dev.activities.AboutActivity};
have you declared this activity in your AndroidManifest.xml?
Run Code Online (Sandbox Code Playgroud)

那我怎么能做这个呢?

Bla*_*der 6

您的困惑来自于这样一个事实,即applicationIdSuffix只更改应用程序的包名称(其唯一ID),但不会更改应用程序内的类的java包名称,包括您的Activity.

这意味着您应该在您的偏好中声明:

android:targetClass="com.myapp.activities.AboutActivity"
android:targetPackage="@string/packagename"
Run Code Online (Sandbox Code Playgroud)

哪里targetClass始终相同,同时targetPackage取决于您的构建类型,可以是com.myappcom.myapp.dev.