建立一个网站需要多少钱?,jquery网站后台模板,南通城市建设集团有限公司网站,企业网站建设公司排名在掘金上看到这篇文章#xff1a;android 关于先登录成功后再进入目标界面的思考,作者对实现登录成功后再跳转到目标界面功能作了比较详细的分析#xff0c;对比了一些已有的实现方案并指出存在的问题。最终#xff0c;作者实现了一个可同时添加多个条件判断拦截的方案… 在掘金上看到这篇文章android 关于先登录成功后再进入目标界面的思考,作者对实现登录成功后再跳转到目标界面功能作了比较详细的分析对比了一些已有的实现方案并指出存在的问题。最终作者实现了一个可同时添加多个条件判断拦截的方案思路很新颖。 这篇文章的阅读量和喜欢数都很多看来大家对这个需求的关注度很高这里将我们在使用 CC框架 过程中实现这个功能的方案跟大家分享一下。 快速了解CC 是一套基于组件总线的组件化实施方案 一静一动开发时运行2个app业务环境始终是完整的 静主App (通过跨App的方式调用单组件App内的组件)动正在开发中的单组件App (通过跨App的方式调用主App内的组件) 支持渐进式组件化改造 解耦只是过程而不是前提CC框架基因中自带支持组件层面的AOP 在定义组件时实现IComponent.onCall(cc)方法并根据cc中的参数来执行组件中的具体逻辑如页面跳转等。 可以在调用具体逻辑之前对该功能进行AOP实现例如登录、页面数据预加载等 用CC框架实现必须先登录再进入目标页面功能 目标页面所在的组件在执行页面跳转前调用登录组件(用户中心组件)获取用户信息若未登录则登录后返回用户信息。 这里有2个点
1. 若用户已登录则直接返回用户信息同步方式实现即可
2. 若用户未登录则跳转到登录页面需要执行完登录操作(或取消)后才能获得结果使用异步方式实现。以打开订单列表页面前需要登录为例 先定义用户组件提供一个强制获取用户登录信息的功能若未登录则打开登录界面并在用户登录后返回登录结果(取消登录也是一种结果)//用户中心组件类
public class UserComponent implements IComponent {Overridepublic String getName() {return demo.component.user;}Overridepublic boolean onCall(CC cc) {String actionName cc.getActionName();// ... // 强制获取用户信息若未登录则跳转到登录并将登录结果返回if (forceGetLoginUser.equals(actionName)) {if (!TextUtils.isEmpty(Global.loginUserName)) {//已登录同步实现直接调用CC.sendCCResult(...)并返回返回falseCCResult result CCResult.success(Global.KEY_USERNAME, Global.loginUserName);CC.sendCCResult(cc.getCallId(), result);return false;}//未登录打开登录界面在登录完成后再回调结果异步实现Context context cc.getContext();Intent intent new Intent(context, LoginActivity.class);if (!(context instanceof Activity)) {//调用方没有设置context或app间组件跳转context为applicationintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}//将cc的callId传给Activity登录完成后通过这个callId来回传结果intent.putExtra(callId, cc.getCallId());context.startActivity(intent);//异步实现不立即调用CC.sendCCResult,返回truereturn true;}//...return false;}} 模拟的登录页面点击按钮模拟登录直接返回文本框中的信息作为登录成功的信息若未登录直接返回则视为取消登录/*** 模拟登录页面*/
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {private EditText editText;private String callId;Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.id.activity_login);callId intent.getStringExtra(callId);//init views}Overridepublic void onClick(View v) {//模拟登录点击按钮获取文本框内容并作为用户登录信息返回String username editText.getText().toString().trim();if (TextUtils.isEmpty(username)) {Toast.makeText(this, R.string.demo_b_username_hint, Toast.LENGTH_SHORT).show();} else {//登录成功返回Global.loginUserName username;finish();}}Overrideprotected void onDestroy() {super.onDestroy();//判断是否为CC调用打开本页面if (callId ! null) {CCResult result;if (TextUtils.isEmpty(Global.loginUserName)) {result CCResult.error(login canceled);} else {result CCResult.success(Global.KEY_USERNAME, Global.loginUserName);}//为确保不管登录成功与否都会调用CC.sendCCResult在onDestroy方法中调用CC.sendCCResult(callId, result);}}
} 在订单组件中进行登录验证登录成功则跳转到订单列表页登录失败则返回调用失败的结果//订单组件
public class OrderComponent implements IComponent {Overridepublic String getName() {return demo.component.order;}Overridepublic boolean onCall(CC cc) {CCResult result CC.obtainBuilder(demo.component.user).setActionName(forceGetLoginUser).build().call();CCResult ccResult;// 根据登录状态决定是否打开页面// 这里也可以添加更多的前置判断逻辑if (result.isSuccess()) {ccResult CCResult.success();//登录成功打开目标页面startOrderListActivity(cc);} else {//登录失败返回失败信息ccResult result;}//调用方不需要获得额外的信息只需要知道调用状态//所以这个组件采用同步实现同步调用CC.sendCCResult(...) 并且返回falseCC.sendCCResult(cc.getCallId(), ccResult);return false;}private void startOrderListActivity(CC cc) {Context context cc.getContext();Intent intent new Intent(context, OrderListActivity.class);if (!(context instanceof Activity)) {// context maybe an application object if caller dose not setContext// or call across appsintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}context.startActivity(intent);}
} 至此打开订单页面必须登录的功能已全部完成。 这样实现的好处 登录组件只管登录自身的逻辑跟其它逻辑完全不耦合调用订单组件的地方无需添加额外的代码可以添加任意的前置条件判断登录条件的判断可用于任意组件而无需修改登录组件的逻辑支持跨app组件调用时的前置条件判断了解更多关于CC框架的信息 Github源码 持续维护更新中 欢迎watch、fork、star、pr、提issue 系列文章 CC基于组件总线的Android组件化开源框架 CC框架实践(1)实现登录成功再进入目标界面功能 CC框架实践(2)Fragment和View的组件化 CC框架实践(3): 让jsBridge更优雅