1

文档指出:

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

我的问题实际上是一个与上下文相关的问题——我不太清楚广播接收器(在myapp.receivers包中)接收到的上下文,我在某些活动或服务中(分别在myapp.activitiesmyapp.services分别)中获得的上下文是否将委托给同一个 SharedPreferences 实例。

注意幕后 getDefaultSharedPreferences(context)调用getSharedPreferences(context.getPackageName(), MODE_PRIVATE)

顺便说一句,据报道,从快捷方式而不是菜单启动应用程序会提供不同的默认首选项

4

2 回答 2

1

普通应用程序可以访问的上下文被分配给应用程序、活动、服务和广播接收器(我错过了什么吗?)。从任何上下文,您都可以通过调用进入应用程序上下文getApplicationContext()(也可以安全地调用应用程序上下文)。

单个应用程序中的包对上下文没有任何影响。我不知道那个链接的问题是关于什么的,但getPackageName()本质上是给你清单中定义的包名称(实际上它返回应用程序PackageInfo对象中的名称)。

BroadcastReceiver Context 有一个不同的包名是合理的(尽管我强烈怀疑)。更重要的是,您仍然可以获取应用程序上下文,因此只需从任何地方执行此操作即可。

于 2013-05-01T22:47:24.807 回答
0

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

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

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

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

于 2013-05-02T16:50:51.693 回答