Android集中式登录架构设计思想

方案有两种,一种是hook到AMS拦截startActivity中的intent,在启动activity的时候判断是否登录,如果没有对intent做动态替换,另一种就是通过AOP实现方法添加判断登录代码片段。hook对系统有兼容性,需要考虑到各个版本的api是否改动,而AOP的实现方式与版本没有任何兼容性问题,所以最后采用AOP的方式去实现app集中式登录。

所有的登录请求都会回调到ILogin接口,这也意味着登录事件只有一个统一的入口,这也就是集中式登录架构的核心好处。

如果我们嫌弃在需要判断登录状态的按钮上加入@LoginFilter()注解麻烦,而是想实现启动一个Activity自动判断是否登录,如果没有登录就回调到ILogin接口,那么只需要创建一个LoginFilterActivity如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//直接过滤登陆,不需要加注解,则继承`LoginFilterActivity`
public class LoginFilterActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!LoginAssistant.getInstance().getILoginFilter().isLogin(getApplicationContext())) {
Toast.makeText(this, "没有登录!", Toast.LENGTH_SHORT).show();
startActivityForResult(new Intent(this, LoginActivity.class), 0);
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (!LoginAssistant.getInstance().getILoginFilter().isLogin(getApplicationContext())) {
Toast.makeText(this, "登录失败!", Toast.LENGTH_SHORT).show();
finish();
}
}
}

然后我们让需要登录才能进入的Activity继承自LoginFilterActivity即可。假如UserActivity继承LoginFilterActivity,当用户没有登录的时候,启动UserActivity便会回调到ILogin接口,这就是集中式登录架构。

1
2
3
4
5
6
7
8
public class ExtendsLoginFilterActivity extends LoginFilterActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_extends_login_filter);
}
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :