如何从单个 activity 更新多个活动
How to update multiple activities from a single activity
我想知道是否有一种方法可以从一个 activity.
更新多个活动
例如,从我的 activityC(在我的例子中是 EditProfileActivity)我更新了用户配置文件。 activityC 是 activityB 的子代,而 B 是 [=44 的子代=]A,然后从mainActivity的navdrawer打开。我还有 activityE 可以从 activityC 和 [=44= 打开]F可以从activityA打开。我要全部更新。
当我更改用户名、照片、关于或其他任何内容时,即使不关闭 activityC,我也想发送更改后的信息。如果我从它返回或前进,它应该已经更新了用户信息。如果用户没有更改任何内容,则不应更新这些活动。
如果只有一个 activity 我会通过 intent
或 onActivityResult
.
没有 shared preferences
或 startActivityForResult
和 onActivityResult
有没有办法做到这一点?
您可以将事件总线用于此目的,如 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());
你还可以使用,而且在我看来比 EventBus 更容易和更好的是使用 LocalBroadcastManager
。它将允许您在您的应用程序中发送可以被一个或多个活动接收的广播。我想这几乎就是你想要的。
文档:
https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html
您可以在 sharedprefences 中设置信息,并且可以在任何 activity
中获取 fetch 信息
我创建了这个 Class 用于在 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);
简单的解决方案是 Broadcast Reciever
试试这个
在你的其他 activity class 声明这个
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);
现在从您要更新其他 activity
的 activity 调用此方法
sendBroadcast(new Intent().setAction("bcNewMessage"));
我想知道是否有一种方法可以从一个 activity.
更新多个活动例如,从我的 activityC(在我的例子中是 EditProfileActivity)我更新了用户配置文件。 activityC 是 activityB 的子代,而 B 是 [=44 的子代=]A,然后从mainActivity的navdrawer打开。我还有 activityE 可以从 activityC 和 [=44= 打开]F可以从activityA打开。我要全部更新。
当我更改用户名、照片、关于或其他任何内容时,即使不关闭 activityC,我也想发送更改后的信息。如果我从它返回或前进,它应该已经更新了用户信息。如果用户没有更改任何内容,则不应更新这些活动。
如果只有一个 activity 我会通过 intent
或 onActivityResult
.
没有 shared preferences
或 startActivityForResult
和 onActivityResult
有没有办法做到这一点?
您可以将事件总线用于此目的,如 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());
你还可以使用,而且在我看来比 EventBus 更容易和更好的是使用 LocalBroadcastManager
。它将允许您在您的应用程序中发送可以被一个或多个活动接收的广播。我想这几乎就是你想要的。
文档:
https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html
您可以在 sharedprefences 中设置信息,并且可以在任何 activity
中获取 fetch 信息我创建了这个 Class 用于在 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);
简单的解决方案是 Broadcast Reciever
试试这个
在你的其他 activity class 声明这个
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);
现在从您要更新其他 activity
的 activity 调用此方法sendBroadcast(new Intent().setAction("bcNewMessage"));