【问题标题】:ActivityNotFoundException when different package's targetClass in PreferenceScreenPreferenceScreen 中不同包的 targetClass 时的 ActivityNotFoundException
【发布时间】:2011-05-20 14:15:18
【问题描述】:

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

目标活动的包是“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" 但它也不起作用。

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

【问题讨论】:

  • 我不知道是否可以启动非默认包。为什么不用“。”再试一次。在目标类前面。像 android:targetClass=".TheActivity"
  • 您在哪里看到记录的嵌套&lt;intent&gt; 功能?
  • 它不应该被记录,因为它是不受支持的内部 API。使用它可能会拒绝该应用程序。
  • @Pentium10:它不是无证的,您可以在 API Demos 项目中找到它作为示例。
  • @CommonsWare 提到了here

标签: android package preference


【解决方案1】:

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

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

public class MyPreferences extends ActualPreferences {
}

在你的 AndroidManifest.xml 中声明它

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

然后你可以在你的意图中指定类

<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 属性与应用程序包匹配。如果需要,您可以将活动放在子包中。这有效:

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

【讨论】:

  • 所以你声明了 com.mypackage.MyPreferences.java,但你写了 targetClass="com.my.package.settings.MyPreferences",它有效吗?
【解决方案2】:

如前所述,它不适用于库。以编程方式进行,如下所示:

preference_my_pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                public boolean onPreferenceClick(Preference preference) {
                    Intent intent = new Intent(MyActivity.this, ActivityToStart.class);
                    startActivity(intent);
                    return true;
                }
            });

【讨论】:

  • 您可能想要复制原始意图中的附加内容,例如 newIntent.putExtras(oldIntent)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多