docs表示:
获取一个SharedPreferences实例,该实例指向首选框架在给定上下文中使用的默认文件。
我的问题确实是与上下文相关的问题 - 我不太清楚BroadcastReceiver(在myapp.receivers
包中)收到的上下文,我在某些活动或服务中获得的上下文(在myapp.activities
中)并且myapp.services
将分别委托给相同的SharedPreferences实例。
请注意behind the scenes getDefaultSharedPreferences(context)
来电getSharedPreferences(context.getPackageName(), MODE_PRIVATE)
。
顺便说一下它也是reported从快捷方式启动应用程序而不是菜单提供不同的默认首选项
答案 0 :(得分:1)
普通应用程序可以访问的上下文被分配给应用程序,活动,服务和BroadcastReceivers(我是否错过了?)。在任何上下文中,您都可以通过调用getApplicationContext()
来访问应用程序上下文(也可以安全地调用应用程序上下文)。
单个应用中的软件包对Context没有任何影响。我不知道该链接问题是什么,但getPackageName()
本质上为您提供了清单中定义的包名称(实际上它在应用程序的PackageInfo
对象中返回名称)。
有可能BroadcastReceiver Context有不同的包名(虽然我强烈怀疑)。更重要的是,您仍然可以获取应用程序上下文,所以只需从任何地方进行操作。
答案 1 :(得分:0)
清单广播接收器:
Manifest BroadcastReceiver运行的上下文是android.app.ReceiverRestrictedContext
。此上下文启用了有限的功能,但它确实具有packageName(注册接收器)。在BroadcastReceiver中使用getDefaultSharedPreferences应该不是问题,因为在此受限制的上下文中可以获取检索默认共享首选项(即包名称)所需的信息。
动态注册的广播接收器
动态注册的广播接收器(使用resgisterReceiver
注册)在活动或注册接收器的服务的上下文中运行。
我找不到任何直接文档提及广播接收器中的上下文细节,这是我的经验和试验的结果。
另外,关于getDefaultSharedPreferences行为差异的观察,如果从菜单vs快捷方式启动,我从未遇到过这样的问题,也无法在网上找到对此类问题的引用。因此,此问题很可能仅限于SDK,设备,Mod的特定组合。