【问题标题】:How to update multiple activities from a single activity如何从单个活动更新多个活动
【发布时间】:2018-08-21 14:47:33
【问题描述】:

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

例如,从我的 activityC(在我的情况下为 EditProfileActivity)我更新用户配置文件。 activityCactivityB 的子节点,activityBactivityA 的子节点,从 mainActivity 的 navdrawer 中打开。我还有可以从activityC打开的activityE和可以从activityA打开的activityF。我想全部更新。

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

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

没有shared preferences,或startActivityForResultonActivityResult,有没有办法做到这一点?

【问题讨论】:

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


    【解决方案1】:

    您可以为此目的使用事件总线,如 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());
    

    【讨论】:

      【解决方案2】:

      您还可以使用LocalBroadcastManager,在我看来比 EventBus 更容易和更好。它将允许您在您的应用程序中发送广播,这些广播可以被一个或多个活动接收。我想这几乎就是你想要的。

      文档:

      https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

      【讨论】:

        【解决方案3】:

        简单的解决方案是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"));
        

        【讨论】:

          【解决方案4】:

          您可以在 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);
          

          【讨论】:

          • 不,您不能,因为 SharedPreferences 不是用于在组件之间传递数据,而是存储您希望应用在关闭后检索的数据。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多