0

私は次のように使用しているプリファレンスラッパークラスを持っています:

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。サービス内ではアクティビティ コンテキストを維持しないため、単純に Service コンテキストを渡します。

問題は、startActivityForResult明らかにサービスクラスには適用できないためです。それが私が得たときですClassCastException(インスタンスクラスをチェックするロジックを入れていない場合)。

私はそれについていくつかの解決策を考えました:

  1. Context ではなく MainActivity への参照を直接維持します。たとえば、次のようになります
    MainActivity contextContext 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);
     }
    

この場合でも、Preferences をサービスからインスタンス化します。 new Preferences(null, this);

StartActivityForResultどれが私の究極の目的かは言えません。

この場合、最もクリーンなソリューションは何でしょうか?

4

1 に答える 1