Android集中式登录架构设计思想
方案有两种,一种是hook到AMS拦截startActivity
中的intent,在启动activity的时候判断是否登录,如果没有对intent做动态替换,另一种就是通过AOP实现方法添加判断登录代码片段。hook对系统有兼容性,需要考虑到各个版本的api是否改动,而AOP的实现方式与版本没有任何兼容性问题,所以最后采用AOP的方式去实现app集中式登录。
所有的登录请求都会回调到ILogin接口,这也意味着登录事件只有一个统一的入口,这也就是集中式登录架构的核心好处。
如果我们嫌弃在需要判断登录状态的按钮上加入@LoginFilter()
注解麻烦,而是想实现启动一个Activity自动判断是否登录,如果没有登录就回调到ILogin
接口,那么只需要创建一个LoginFilterActivity
如下:
//直接过滤登陆,不需要加注解,则继承`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
接口,这就是集中式登录架构。
public class ExtendsLoginFilterActivity extends LoginFilterActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_extends_login_filter);
}
}
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/18/design-concept-of-android-centralized-login-architecture/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论