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

时间:2018-03-13 11:06:55

标签: java android android-intent onactivityresult android-sharedpreferences

我想知道的是,是否有办法从一个活动更新多个活动。

例如,从我的 activityC (在我的情况下为EditProfileActivity)中,我更新了用户个人资料。 activityC activityB 的孩子,是 activityA 的孩子,并且是从mainActivity的navdrawer打开的。我还可以从 activityC activityF 打开 activityE ,可以从 activityA 打开。我想更新所有这些内容。

当我更改用户名,照片,关于或其他任何内容时,即使不关闭 activityC ,我也希望发送更改的信息。如果我从它返回或前进,它应该已经更新了用户信息。如果用户没有更改任何内容,则不应更新这些活动。

如果只是一项活动,我会通过intentonActivityResult进行。

有没有办法在没有shared preferencesstartActivityForResultonActivityResult的情况下执行此操作?

4 个答案:

答案 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);