我想知道的是,是否有办法从一个活动更新多个活动。
例如,从我的 activityC (在我的情况下为EditProfileActivity)中,我更新了用户个人资料。 activityC 是 activityB 的孩子,是 activityA 的孩子,并且是从mainActivity的navdrawer打开的。我还可以从 activityC 和 activityF 打开 activityE ,可以从 activityA 打开。我想更新所有这些内容。
当我更改用户名,照片,关于或其他任何内容时,即使不关闭 activityC ,我也希望发送更改的信息。如果我从它返回或前进,它应该已经更新了用户信息。如果用户没有更改任何内容,则不应更新这些活动。
如果只是一项活动,我会通过intent
或onActivityResult
进行。
有没有办法在没有shared preferences
或startActivityForResult
和onActivityResult
的情况下执行此操作?
答案 0 :(得分:4)
您可以将事件总线用于此目的,例如this解释:
你可以创建这样的事件:
public static class UpdateEvent { /* your getter and setter */ }
准备订阅者:声明并注释您的订阅方法,可选择指定线程模式:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onUpdateEvent(UpdateEvent event) {
/* event fire here when you post event from other class or fragment */
};
注册 - 取消注册您的订阅者。
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);//Register
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);//unregister
}
像这样的火灾事件:
EventBus.getDefault().post(new UpdateEvent());
答案 1 :(得分:2)
你也可以使用,在我看来比EventBus更容易和更好的是使用{{1}}。它允许您在整个应用程序中发送可由一个或多个活动接收的广播。我猜它几乎就是你想要的。
文档:
https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html
答案 2 :(得分:1)
简单的解决方案是Broadcast Reciever
试试这个
在您的其他活动类中声明此
BroadcastReceiver broadCastNewMessage = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do your stuff here
}
};
现在onCreate()
注册了这个
registerReceiver(this.broadCastNewMessage, new IntentFilter("bcNewMessage"));
并在onDestroy()
unregisterReceiver(broadCastNewMessage);
现在从您想要更新其他活动的活动中调用此方法
sendBroadcast(new Intent().setAction("bcNewMessage"));
答案 3 :(得分:0)
您可以在sharedprefences中设置信息,并可以在任何活动中获取获取信息
我创建了这个用于在sharedprefrences中保存对象的类
public class DroidPrefs
{
public static boolean contains(Context context, String key) {
return getDefaultInstance(context).contains(key);
}
public static <T> T get(Context context, String key, Class<T> cls) {
return getDefaultInstance(context).get(key, cls);
}
public static void apply(Context context, String key, Object value) {
getDefaultInstance(context).apply(key, value);
}
public static void commit(Context context, String key, Object value) {
getDefaultInstance(context).commit(key, value);
}
public static DroidPrefs getDefaultInstance(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return new DroidPrefs(sp);
}
private Gson mGson;
private SharedPreferences mSharedPrefs;
public DroidPrefs(SharedPreferences sharedPrefs)
{
mGson = new Gson();
mSharedPrefs = sharedPrefs;
}
public boolean contains(String key) {
return mSharedPrefs.contains(key);
}
public <T> T get(String key, Class<T> cls) {
if (contains(key)) {
return mGson.fromJson(mSharedPrefs.getString(key, null), cls);
}
try {
return cls.newInstance();
}
catch (Exception e) {
throw new IllegalArgumentException("class must have an empty constructor");
}
}
public void apply(String key, Object value) {
put(key, value).apply();
}
public void commit(String key, Object value) {
put(key, value).commit();
}
@SuppressLint("CommitPrefEdits")
private SharedPreferences.Editor put(String key, Object value) {
SharedPreferences.Editor e = mSharedPrefs.edit();
e.putString(key, mGson.toJson(value));
return e;
}
public void clear(){
SharedPreferences.Editor e = mSharedPrefs.edit();
e.clear().apply();
}
}
您可以使用apply或commit方法将值保存到任何键
DroidPrefs.apply(context, "your key", yourobject);
您可以使用get方法
获取值yourobject= DroidPrefs.get(this,"your key",yourclass.class);