我有一个 Preference 包装类,我正在使用如下:
public final class Preferences implements OnSharedPreferenceChangeListener
{
private SharedPreferences sharedPreferences;
Context context;
private final int FB_REQUESTCODE=1;
private final int FB_SELCTFRIENDS=2;
public Preferences(Context context)
{
this.context=context;
this.sharedPreferences=PreferenceManager.getDefaultSharedPreferences(context);
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
public String getFBFriends()
{
return sharedPreferences.getString(Keys.FB_FRIENDS.key, Defaults.FB_FRIENDS);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key)
{
if (key.equals(Keys.FB_FRIENDS.key))
{
String fbFriendsVal = getFBFriends();
if (fbFriendsVal.equals(Consts.FB_FRIENDS_FIRE))
{
if(context instanceof Activity)
{
Activity activity = (Activity) context;
activity.startActivityForResult(new Intent(context,
FriendPickerActivity.class), FB_SELCTFRIENDS);
}
else if (context instanceof Service)
{
Service service=(Service) context;
service.startActivity(new Intent(context,
FriendPickerActivity.class), null);
}
else
{
Log.e(App.TAG, "Could not start FB Friends Activity");
}
}
}
}
}
这里 FB_FRIENDS 指的是ListPreference
. 在用户选择此列表中的特定项目后,我想为结果触发一个活动,这是我在onSharedPreferenceShared
方法中所做的。
问题是context
. 我在我的应用程序中的各个地方使用这个首选项类,例如Activty
和Service
。由于在服务内部,我不维护活动上下文,我只是传递服务上下文。
现在的问题是,startActivityForResult
显然不适用于服务类,那是我得到的时候ClassCastException
(如果我不放检查实例类的逻辑)。
我想了几个解决方案:
直接维护对 MainActivity 的引用,而不是 Context,例如
MainActivity context
:而不是Context context;
但是,这意味着我无法从服务访问我的首选项。或者我可能保持对服务和 MainActivity 的引用如下
public Preferences(MainActivity context1, Service context2) { if(context1!=null) this.context=context1; else this.context=context2 this.sharedPreferences=PreferenceManager.getDefaultSharedPreferences(context); sharedPreferences.registerOnSharedPreferenceChangeListener(this); }
即使在这种情况下,我也会将服务中的首选项实例化为
new Preferences(null, this);
我不能说StartActivityForResult
这是我的最终目标。
在这种情况下,最干净的解决方案是什么?