您的位置:首页 > 其它

Activity与Activity之间的回调

2017-09-15 17:46 501 查看
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都可以访问的到)

下面贴出代码



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();
}
}










这种一对多的情况也是可以的,图中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);
}
}
}










源码在这里

代码连接


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息