Java 如何从单个活动更新多个活动
我想知道的是,是否有一种方法可以从一个活动更新多个活动 例如,从myactivityC(在我的例子中是EditProfileActivity)我更新用户配置文件activityC是activityB的子项,它是activityA的子项,并从mainActivity的导航抽屉打开。我还有活动e可以从活动c打开,而活动f可以从活动a打开。我想更新所有这些 当我更改用户名、照片、关于或任何其他内容时,我希望在不关闭activityC的情况下发送更改后的信息。如果我从它返回或前进,它应该已经更新了用户信息。若用户未更改任何内容,则不应更新这些活动 如果只是一项活动,我会通过Java 如何从单个活动更新多个活动,java,android,android-intent,onactivityresult,android-sharedpreferences,Java,Android,Android Intent,Onactivityresult,Android Sharedpreferences,我想知道的是,是否有一种方法可以从一个活动更新多个活动 例如,从myactivityC(在我的例子中是EditProfileActivity)我更新用户配置文件activityC是activityB的子项,它是activityA的子项,并从mainActivity的导航抽屉打开。我还有活动e可以从活动c打开,而活动f可以从活动a打开。我想更新所有这些 当我更改用户名、照片、关于或任何其他内容时,我希望在不关闭activityC的情况下发送更改后的信息。如果我从它返回或前进,它应该已经更新了用户信
intent
或onActivityResult
来完成
有没有一种方法可以在没有
共享首选项
或startActivityForResult
和onActivityResult
的情况下实现这一点?您可以使用事件总线实现此目的,如下所述:
您可以创建如下事件:
public static class UpdateEvent { /* your getter and setter */ }
EventBus.getDefault().post(new UpdateEvent());
准备订阅服务器:声明并注释订阅方法,可以选择指定线程模式:
@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
}
火灾事件如下:
public static class UpdateEvent { /* your getter and setter */ }
EventBus.getDefault().post(new UpdateEvent());
您还可以使用
LocalBroadcastManager
,我认为这比EventBus更简单、更好。它将允许您通过应用程序发送广播,这些广播可由一个或多个活动接收。我想这正是你想要的
文件:
您可以在SharedReferences中设置信息,也可以在任何活动中获取获取信息 我创建这个类是为了在SharedReferences中保存对象
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();
}
}
您可以使用get方法获取值
yourobject= DroidPrefs.get(this,"your key",yourclass.class);
简单的解决方案是
广播接收器
试试这个
在其他活动类中声明
BroadcastReceiver broadCastNewMessage = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do your stuff here
}
};
现在在onCreate()
中注册这个
registerReceiver(this.broadCastNewMessage, new IntentFilter("bcNewMessage"));
在ondestory()中
现在从要更新其他活动的活动中调用此方法
sendBroadcast(new Intent().setAction("bcNewMessage"));
不可以,因为SharedReference不是用于在组件之间传递数据,而是用于存储您希望应用程序在关闭后检索的数据。