提供一个从一个Activity调用另外一个Activity中方法或向另一个Activity传值的思路

最近在做项目的时候,遇到一个比较纠结的问题,在Activity A有一个监听器,当监听到数据变化时,需要传递给ActivityB.当前ActivityA属于后台运行,界面上显示的是Activity B,所以主要问题就在于如何在不跳转的情况下,Activity A中调用方法将值传递到Activity B中的去。

在查了很多资料后,发现没有特别好的方法,有用界面跳转intent传参的,这种比较适合界面跳转的传值,但我这里用不到界面跳转,而且界面跳转会重新起一个新的task,不符合当前的应用场景。

在这里我主要采用的是单例模式和监听器的方式实现两个界面之间的传值。

即Activity A里获取到改变的数据后,告诉监听器,监听器告诉Activity B,然后Activity调用自身方法去刷新界面或做相关处理。

实现思路就是单例模式+监听器

首先创建一个监听器


/**
 * Created by NingNing on 2018/7/25.
 */

public interface StatusChangeListener {
    /**状态改变时监听器**/
    public void statuschange(String status);
}

然后,创建一个单例模式的类,并在该类中实现对该监听器的注册和方法调用

import android.content.Context;

import com.ning.listener.StatusChangeListener;

/**
 * Created by ThinkPad on 2018/7/25.
 */

public class DataManager {
    Context mContext;
    static DataManager mDatamanager;
    StatusChangeListener mStatusChangeListener;

    public DataManager(Context context){
        this.mContext = context;
    }

    public static DataManager instance(Context context){
        if(mDatamanager == null){
            mDatamanager = new DataManager(context);
        }
        return mDatamanager;
    }

    /**注册监听器**/
    public void setStatusChangeListener(StatusChangeListener Listener){
        this.mStatusChangeListener = Listener;
    }

    /**调用监听器中的方法**/
    public void StatusChange(String data){
        mStatusChangeListener.statuschange(data);
    }
    

}

第三步,在ActivityB中实现监听器

public class ActivityB extends Activity {

    public DataManager datamanager;

    public StatusListener mstatuslisntener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mstatuslisntener= new StatusListener();    //初始化监听函数
        datamanager= DataManager.instance(getApplication());   //创建Datamanager实例
        Datamanager.setStatusChangeListener(mstatuslisntener);   //注册监听器
    }


    public classStatusListener implements StatusChangeListener {
        @Override
        public void statuschange(String status) {
            Message msg = Message.obtain();
            msg.what = ResponseCode.StatusUpdate;
            msg.obj = status;
            mHandler.sendMessage(msg);
        }
    }

}

第四步,在ActivityA中数据变化时,调用方法。

public class ActivityA extends Activity {

    public DataManager datamanager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        datamanager= DataManager.instance(getApplication());   //创建Datamanager实例
        Datamanager.StatusChange("传递数据");   
    }

}

好啦,这个模式的整体思路其实就在于这个单例模式的存活期,因为ActivityA和ActivityB中都用到了这个实例,并且他们调用的是同一个对象,所以可以通过在B中注册监听,在A中调用该实例的方法来实现。

通过这种模式,成功实现了传值,反正解决了我的问题~

如果也有遇到同样难题的小伙伴,可以借鉴一下,我写下来也是为了方便以后遇到类似情况的时候知道怎么处理。

猜你喜欢

转载自blog.csdn.net/qq_31490071/article/details/81207043