0

我有一个 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. 我在我的应用程序中的各个地方使用这个首选项类,例如ActivtyService。由于在服务内部,我不维护活动上下文,我只是传递服务上下文。

现在的问题是,startActivityForResult显然不适用于服务类,那是我得到的时候ClassCastException(如果我不放检查实例类的逻辑)。

我想了几个解决方案:

  1. 直接维护对 MainActivity 的引用,而不是 Context,例如
    MainActivity context:而不是Context context;
    但是,这意味着我无法从服务访问我的首选项。

  2. 或者我可能保持对服务和 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这是我的最终目标。

在这种情况下,最干净的解决方案是什么?

4

1 回答 1

2

最干净的解决方案是发送一个接口,就像LocalPreferenceChangeCallback在你的类中定义的那样:

public static interface LocalPreferenceChangeCallback {
    void onPreferenceChanges();
}

服务类和活动都将实现此接口 - 随意添加您希望此方法的任何参数;最重要的主题是要有接口:

  1. 该活动将调用startActivityForResult
  2. 该服务可能会调用startActivity

将该接口作为参数发送,而不是context

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来实例化sharedPreferences对象,但您只是因为这个事实而发送它,您无需担心如何处理首选项更改。最后,这是一个OOP问题......

此外,由于Preferencesjava.utils.prefs.Preferences.

于 2013-10-23T08:49:23.953 回答