getDefaultSharedPreferences() - 多包应用程序的上下文是什么?

时间:2013-05-01 22:01:52

标签: android android-preferences android-context

docs表示:

  

获取一个SharedPreferences实例,该实例指向首选框架在给定上下文中使用的默认文件。

我的问题确实是与上下文相关的问题 - 我不太清楚BroadcastReceiver(在myapp.receivers包中)收到的上下文,我在某些活动或服务中获得的上下文(在myapp.activities中)并且myapp.services将分别委托给相同的SharedPreferences实例。

请注意behind the scenes getDefaultSharedPreferences(context)来电getSharedPreferences(context.getPackageName(), MODE_PRIVATE)

顺便说一下它也是reported从快捷方式启动应用程序而不是菜单提供不同的默认首选项

2 个答案:

答案 0 :(得分:1)

普通应用程序可以访问的上下文被分配给应用程序,活动,服务和BroadcastReceivers(我是否错过了?)。在任何上下文中,您都可以通过调用getApplicationContext()来访问应用程序上下文(也可以安全地调用应用程序上下文)。

单个应用中的软件包对Context没有任何影响。我不知道该链接问题是什么,但getPackageName()本质上为您提供了清单中定义的包名称(实际上它在应用程序的PackageInfo对象中返回名称)。

有可能BroadcastReceiver Context有不同的包名(虽然我强烈怀疑)。更重要的是,您仍然可以获取应用程序上下文,所以只需从任何地方进行操作。

答案 1 :(得分:0)

清单广播接收器: Manifest BroadcastReceiver运行的上下文是android.app.ReceiverRestrictedContext。此上下文启用了有限的功能,但它确实具有packageName(注册接收器)。在BroadcastReceiver中使用getDefaultSharedPreferences应该不是问题,因为在此受限制的上下文中可以获取检索默认共享首选项(即包名称)所需的信息。

动态注册的广播接收器 动态注册的广播接收器(使用resgisterReceiver注册)在活动或注册接收器的服务的上下文中运行。

我找不到任何直接文档提及广播接收器中的上下文细节,这是我的经验和试验的结果。

另外,关于getDefaultSharedPreferences行为差异的观察,如果从菜单vs快捷方式启动,我从未遇到过这样的问题,也无法在网上找到对此类问题的引用。因此,此问题很可能仅限于SDK,设备,Mod的特定组合。