2012-08-03 55 views
1

我试图实现this great technique跨两个不同的应用程序共享首选项,同时仍MODE_PRIVATE。在同一个APK中可能有两个包?

我的问题是第一个应用程序不能假设第一个应用程序安装(反之亦然)等:

Context c = createPackageContext("com.app.first", MODE_PRIVATE); 

必须替换为:

Context c = createPackageContext("com.app.shared", MODE_PRIVATE); 

但是,任务增加那com.app.shared是真的,它转换成第二个APK?

换句话说,有只有一个AndroidManifest.xml每APK和只有一个<manifest package= >每清单文件。因此,每个APK只有一个实际包装?

我不希望每个应用程序有2个APK,我只希望每个应用程序有一个APK。

有没有办法做到这一点?

回答

2

我试图实现这种跨两个不同的应用程序共享首选项,同时仍然MODE_PRIVATE的伟大技术。

其实,这是一个反伟大的技术,我刚刚删除了我的答案。使用android:sharedUserId是有风险的,对于已经部署的应用程序来说完全不可能。自从我在那里发布我的答案后的两年中,我了解到我的方式错误。

此外,该技术无法可靠运行,因为您无法控制用户安装哪些应用程序并卸载。如果应用程序A和应用程序B通过使用应用程序A的副本共享偏好,则当用户卸载应用程序A时,应用程序B被洗掉。

因此,每个APK只有一个实际包?

正确。

我不希望每个应用程序有2个APK,我只希望每个应用程序有一个APK。

对于两个应用程序,您有两个APK文件,每个文件都有自己的包名称。

+0

谢谢你救了我一个灾难性的方法。我现在意识到,尽管“共享”偏好的“广告”可用性,但它需要很多解决方法和技巧,因此这必定有些不安全。我现在认为,通过[内容提供商](http://developer.android.com/guide/topics/providers/content-providers.html),在应用程序之间共享任何内容的正确方法。我在正确的方向吗? – ef2011 2012-08-03 23:06:04

+2

@ ef2011:在应用程序之间共享信息的方式有很多 - “ContentProvider”是一种可能性。就个人而言,在这种情况下,当应用程序的首选项发生更改时,我会发送许可保护的广播,以便由其他应用程序获取并应用于其自己的副本。这样,通过两个应用程序镜像设置,您就不必担心一个应用程序被卸载,并且同时使用这两个应用程序的设置。此外,你不关心哪个应用程序首先安装。而且,作为一个附带的好处,它可以无缝地扩展到三个或更多的应用程序,如果需要的话。 – CommonsWare 2012-08-03 23:22:44

+0

不幸的是,由于[INSTALL_FAILED_CONFLICTING_PROVIDER](http://stackoverflow.com/q/6273592/722603)限制(即两个不同的包不能共享相同的内容提供者),ContentProvider甚至不可能。所以,看起来**唯一的方法就是你建议的“许可保护广播”。任何可以了解更多信息的链接? – ef2011 2012-08-07 18:08:20

相关问题