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都可以访问的到)
下面贴出代码
![](https://img-blog.csdn.net/20170915165123820?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM0NDU2MDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
1.先定义接口
2.实现工具类
3.重写Application
4.编写UserInfoActivity
5.编写LoginActivity
![](https://img-blog.csdn.net/20170915174337550?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM0NDU2MDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170915174343862?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM0NDU2MDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170915174349091?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM0NDU2MDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170915174353226?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM0NDU2MDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这种一对多的情况也是可以的,图中LoginActivity 被一个Activity和两个Frament监听了
只需稍微修改一下UserLoginUtils就行了
![](https://img-blog.csdn.net/20170915174451411?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM0NDU2MDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170915174457098?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM0NDU2MDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170915174502268?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM0NDU2MDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170915174507148?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM0NDU2MDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
源码在这里
代码连接
所以,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); } } }
源码在这里
代码连接
相关文章推荐
- 自定义Adapter的接口,方便回调。Adapter与Activity之间的回调
- Fragment与Activity之间的传值和接口回调
- Activity之间回调传值
- Android中Fragment和Activity之间的通信(含接口回调)
- 回调接口实现Activity与Fragment之间的通信
- 自定义Adapter的接口,方便回调。Adapter与Activity之间的回调
- 不相邻activity之间的消息传递,回调机制
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
- Android中接口的回调,Activity或Fragment与普通类之间的互相调用
- 在Activity和Service之间使用Binder和回调接口进行通信
- Activity之间的回调
- Activity 之间的回调得不到结果
- activity 之间信息的传递 Intent 回调参数startActivityForResult
- Fragment 的静态方式和动态方式以及动态方式中fragment之间通过activity传递 数据(接口回调 ):
- fragment与activity之间的回调,用于数据更新操作(是fragment向activity里传值)
- Fragment和Activity之间的通信(含接口回调)
- 两个Activity之间用接口回调进行通信
- Activity之间传递值
- Parcelable序列化类在Activity、Fragment之间通信
- activity之间传递bean类型数据