私は次のように使用しているプリファレンスラッパークラスを持っています:
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
(インスタンスクラスをチェックするロジックを入れていない場合)。
私はそれについていくつかの解決策を考えました:
Context ではなく MainActivity への参照を直接維持します。たとえば、次のようになります
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); }
この場合でも、Preferences をサービスからインスタンス化します。
new Preferences(null, this);
StartActivityForResult
どれが私の究極の目的かは言えません。
この場合、最もクリーンなソリューションは何でしょうか?