2015-06-29 36 views
3

我在製作PreferenceScreenapplicationIdSuffix時遇到一些問題。將PreferenceScreen與applicationIdSuffix一起使用

假設我的應用程序包/ applicationId是在搖籃和在AndroidManifest.xml com.myapp,和applicationIdSuffix被定義爲:

buildTypes { 
    debug { 
     applicationIdSuffix '.dev' 
    } 
} 

如果我定義了一個PreferenceScreen如以下

<PreferenceScreen 
    android:key="key_about" android:summary="something" android:title="About"> 
    <intent 
     android:targetClass="com.myapp.activities.AboutActivity" 
     android:targetPackage="com.myapp" /> 
</PreferenceScreen> 

啓動時該應用程序的調試版本我得到一個異常

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

這是有道理的,因爲我試圖從不同的應用程序啓動一項活動。問題是,我無法找到一種方法來Android啓動正確的活動。

如果我改變targetClass爲「.activities.AboutActivity」它仍然無法找到活動

ActivityNotFoundException: Unable to find explicit activity class {com.myapp.dev/.activities.AboutActivity} 

我甚至試圖界定各自的版本與正確的包值:

android:targetClass="@string/classname" 
android:targetPackage="@string/packagename" 

但它無法找到合適的活動:

ActivityNotFoundException: Unable to find explicit activity class 
    {com.myapp.dev/com.myapp.dev.activities.AboutActivity}; 
have you declared this activity in your AndroidManifest.xml? 

那麼我該如何做這項工作?

+0

根據這裏的例外情況,我認爲它說你應該在清單中定義你的AboutActivity。 – mike20132013

回答

5

您的困惑來自applicationIdSuffix僅更改應用程序的軟件包名稱(其唯一標識符),但不會更改應用程序中類(包括您的活動)的Java軟件包名稱。

這意味着你應該在你的喜好聲明:

android:targetClass="com.myapp.activities.AboutActivity" 
android:targetPackage="@string/packagename" 

哪裏targetClass始終是相同的,而targetPackage取決於你構建類型,可以是com.myappcom.myapp.dev

+0

這不會失敗,鑑於applicationId不會有後綴? – takecare

+0

您應該在與聲明的構建類型相匹配的2個不同文件夾中定義字符串常量,併爲該字符串提供與應用程序ID相同的值(帶和不帶後綴)。不幸的是,現在還不可能將applicationId作爲資源中的變量,只能在清單中執行。 – BladeCoder

0

我在我的應用程序中所做的是將onPreferenceClickListener附加到其主機活動中的首選項,並在該偵聽器的方法中構建意圖。通過從代碼生成意圖,您可以直接引用目標類,並且包的問題永遠不會出現。

相關問題