Java 如何从单个活动更新多个活动

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的情况下发送更改后的信息。如果我从它返回或前进,它应该已经更新了用户信

我想知道的是,是否有一种方法可以从一个活动更新多个活动

例如,从myactivityC(在我的例子中是EditProfileActivity)我更新用户配置文件activityCactivityB的子项,它是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不是用于在组件之间传递数据,而是用于存储您希望应用程序在关闭后检索的数据。