Java 活动与服务的上下文
我有一个首选项包装器类,我正在使用它,如下所示:Java 活动与服务的上下文,java,android,Java,Android,我有一个首选项包装器类,我正在使用它,如下所示: public final class Preferences implements OnSharedPreferenceChangeListener { private SharedPreferences sharedPreferences; Context context; private final int FB_REQUESTCODE=1; private final int FB_SELCTFRIENDS
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\u FRIENDS指的是ListPreference
的一个键。当用户选择此列表中的特定项时,我想为结果触发一个活动,我正在onSharedPreferenceShared
方法中执行此操作
问题在于上下文
。我在应用程序中的不同位置使用此首选项类,例如Activty
和Service
。因为在服务内部,我不维护活动上下文,我只是传递服务上下文
现在的问题是,startActivityForResult
显然不适用于服务类,这时我得到了ClassCastException
(如果我不把检查实例类的逻辑放进去的话)
我想了一些解决方案:
main活动上下文
;而不是上下文代码>
但是,这意味着我无法从服务访问我的首选项
public Preferences(MainActivity context1, Service context2)
{
if(context1!=null)
this.context=context1;
else
this.context=context2
this.sharedPreferences=PreferenceManager.getDefaultSharedPreferences(context);
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
新首选项(空,此选项)代码>
我不能调用StartActivityForResult
,这是我的最终目标
在这种情况下,最干净的解决方案是什么?最干净的解决方案是发送一个接口,类似于类中定义的LocalPreferenceChangeCallback
:
public static interface LocalPreferenceChangeCallback {
void onPreferenceChanges();
}
服务类和活动都将实现这个接口——可以随意为这个方法添加任何参数;最重要的主题是要有接口:
该活动将调用startActivityForResult
该服务可能会调用startActivity
将该接口作为参数发送,而不是作为上下文发送:
public final class Preferences implements OnSharedPreferenceChangeListener
{
private SharedPreferences sharedPreferences;
private LocalPreferenceChangeCallback prefCallback;
private final int FB_REQUESTCODE=1;
private final int FB_SELCTFRIENDS=2;
public Preferences(Context appContext, LocalPreferenceChangeCallback prefCallback)
{
this.prefCallback = prefCallback;
this.sharedPreferences=PreferenceManager.getDefaultSharedPreferences(appContext);
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(prefCallback != null) {
prefCallback.onPreferenceChanges();
}
}
}
}
public static interface LocalPreferenceChangeCallback {
void onPreferenceChanges();
}
}
无论如何,您都需要发送某种Context
来实例化SharedReferences
对象,但您之所以发送它,只是因为这个事实,您不需要担心如何处理首选项更改。最后,这是一个OOP问题
另外,由于首选项与@MadhurAhuja冲突,类命名错误。可能重复@MadhurAhuja:您找到解决方案了吗?