Android Activity与Activity之间的接口回调,完美实现自定义监听器

        Activity虽然是一个java类,可是它并不能new 一个Activity。所以,Activity看上去并不是一个普通的类,它做一些事情的时候需要特殊处理。
       大家用的最多就是View与Activity之间的回调,非常好用,因为在同一个类里面,所以view可以直接获取到他的对象,所以建立回调关系也是十分容易的。
       那么究竟Activity与Activity之间能否建立回调关系呢?答案是可以的,只是Activity需要跨出它的受限范围,思想走到更Activity更前面的一层。这里想到了使用Application,Application在一个进程中是唯一的,也是众多Activity的“爸爸”,“爸爸”当然可以管理关于儿子的一切。
      比如现有这样一个情景,从个人主页跳转到登录界面,当登录结束后个人主页需要监听是否登录成功,并根据结果相应UI。一般都会说,重写onResume()不就行了吗,或者startActivityForResule()处理一下就好了嘛。这种方法当然可以,这里这样做,第一是举一个例子,第二是对比一下区别。


UserActivity(用户详情界面)

LoginActivity(登录界面)

IFun(定义的接口,ps,需要监听LoginActivity做哪些事情)

UserUtils(登录相关的工具类,这个工具类需要放在Application中全局共享,保证当前进程中所有Activity都可以访问的到)

一,一个接口回调的情况,被一个activity 或 fragment 监听:

下面贴出代码

1.先定义接口

public interface IFun {

    public void login(String s);

    public void outLogin(String s);

    public void register(String s);

}


2.实现工具类

public class UserUtils {

    private IFun iFun;

    public UserUtils(){}

    public void setiFun(IFun iFun) {
        this.iFun = iFun;
    }

    public void login(String s){
        if(iFun == null) return;
        iFun.login(s);
    }

    public void outLogin(String s){
        if(iFun == null) return;
        iFun.outLogin(s);
    }

    public void register(String s){
        if(iFun == null) return;
        iFun.register(s);
    }
}


3.重写Application

public class BaseApplication extends Application {

    private UserUtils userUtils;

    @Override
    public void onCreate() {
        super.onCreate();
        userUtils = new UserUtils();
    }

    public UserUtils getUserUtils() {
        return userUtils;
    }
}

4.编写UserInfoActivity

public class UserInfoActivity extends Activity implements IFun {
    TextView textView;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        textView = new TextView(this);
        textView.setBackgroundColor(Color.parseColor("#FFC0CB"));
        textView.setGravity(Gravity.CENTER);
        textView.setText("我是UserInfoActivity\n点击任意地方跳转");
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(UserInfoActivity.this,LoginActivity.class));
            }
        });
        setContentView(textView);
        ((BaseApplication)getApplication()).getUserUtils().setiFun(this);
    }


    @Override
    public void login(String s) {
        textView.setText(s);
    }

    @Override
    public void outLogin(String s) {
        textView.setText(s);
    }

    @Override
    public void register(String s) {
        textView.setText(s);
    }
}


5.编写LoginActivity

public class LoginActivity extends Activity implements View.OnClickListener {

    private Button loginBtn,outLoginBtn,registerBtn;

    private UserUtils userUtils;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loging_activity);
        loginBtn = findViewById(R.id.loginBtn);
        outLoginBtn = findViewById(R.id.outLoginBtn);
        registerBtn = findViewById(R.id.registerBtn);
        loginBtn.setOnClickListener(this);
        outLoginBtn.setOnClickListener(this);
        registerBtn.setOnClickListener(this);
        userUtils = ((BaseApplication)getApplication()).getUserUtils();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.loginBtn:
                userUtils.login("登录了");
                break;
            case R.id.outLoginBtn:
                userUtils.outLogin("退出登录了");
                break;
            case R.id.registerBtn:
                userUtils.register("我注册了");
                break;
        }
        finish();
    }
}

二,多过接口回调的情况,被一个activity 或 fragment 监听:

这种一对多的情况也是可以的,图中LoginActivity 被一个Activity和两个Frament监听了

只需稍微修改一下UserLoginUtils就行了,代码如下:

public class UserUtils {

    private List<IFun> iFuns = new ArrayList<>();

    public UserUtils(){}


    public void addListener(IFun iFun){
        iFuns.add(iFun);
    }

    public void login(String s){
        for(IFun i : iFuns){
            i.login(s);
        }
    }

    public void outLogin(String s){
        for(IFun i : iFuns){
            i.outLogin(s);
        }
    }

    public void register(String s){
        for(IFun i : iFuns){
            i.register(s);
        }
    }
}


转载于:https://blog.csdn.net/qq_33445600/article/details/77993445

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值