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
(如果我不把检查实例类的逻辑放进去的话)

我想了一些解决方案:

  • 直接维护对MainActivity的引用,而不是上下文,例如:
    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:您找到解决方案了吗?