当前位置: 首页 > news >正文

和田网站建设外贸手机网站

和田网站建设,外贸手机网站,wordpress 仿百度,社区推广经验做法应用场景 在Android 中部分软件需要登录才能使用#xff0c;但是有的页面又不需要登录#xff0c;Android不同于Web可以直接拦截重定向路由#xff0c;因此如果在Android中如果需要检测是否登录#xff0c;如果没登录跳转登录的话就需要再每个页面中判断#xff0c;当然也…应用场景 在Android 中部分软件需要登录才能使用但是有的页面又不需要登录Android不同于Web可以直接拦截重定向路由因此如果在Android中如果需要检测是否登录如果没登录跳转登录的话就需要再每个页面中判断当然也可以写成公共方法但是这样的方式还是比较麻烦。这里讲一个自定义注解实现这个需求的方法 编写注解 先直接编写一个注解 Target(value {ElementType.TYPE,ElementType.METHOD}) Retention(value RetentionPolicy.RUNTIME) //运行时有效 public interface NeedLogin {/*** 开关可以不需要但是我觉得还有有比较好看个人需求默认为不开启检测是否登录*/boolean enable() default false; }编写公共代码 我们可以再onStart生命周期中进行检测是否启用注解和是否登录记得写在BaseActivity中这样后面继承BaseActivity时方法自动生效在需要登录拦截的Activity中只需要添加一个注解就可以实现自动拦截、登录、回显 是否启动注解这里需要一点自定义注解的理论知识请自行学习 private boolean isNeedLogin() {// 通过反射或注解处理器获取当前 Activity 是否需要登录boolean isAnnotation getClass().isAnnotationPresent(NeedLogin.class);if (!isAnnotation) {return false;}NeedLogin needLogin getClass().getAnnotation(NeedLogin.class);if (needLogin null) {return false;}return needLogin.enable();}是否登录这个没任何讲解的你是使用SharedPreferences还是MMKV还是别的存储登录信息都可以无所谓简单写个示例 private boolean checkLogin() {// 检查登录状态的逻辑true代表已登录false代表未登录return !errorService.isLogin();}然后在onStart生命周期方法中进行检测 Overrideprotected void onStart() {super.onStart();if (errorService null) {return;}//不包含注解或者登录注解未开启if (!isNeedLogin()) {return;}//已登录则跳转登录if (!checkLogin()) {return;}//TODO 这里可以跳转登录了}提出疑问 如果想登录成功后再回调这个页面然后刷新页面怎么实现跳转页面的时候是否可以保持原参数的传递登录页怎么写 问题解决 思考问题 如果想跳转回来肯定需要告知登录页我当前页面的路径那么我们跳转登录的时候就必须要传递过去那么我们定义一个参数存储这个当前页面路径TARGET_ACTIVITY /*** 跳转目标Activity页面目前用于自动检测登录的作用*/public static final String TARGET_ACTIVITY targetActivity;那么我稍微修改下跳转登录修改完善一下上面的onStart Overrideprotected void onStart() {super.onStart();if (errorService null) {return;}//不包含注解或者登录注解未开启if (!isNeedLogin()) {return;}//已登录则跳转登录if (!checkLogin()) {return;}//如果未登录跳转登录并且把当前页的信息传递过去以便于登录后回传Bundle bundle getIntent().getExtras();if (bundle null) {bundle new Bundle();}bundle.putString(ConstantsHelper.TARGET_ACTIVITY, getClass().getName());errorService.toLogin(this, bundle);//就是一个简单的Intent跳转finish();}完善登录页面代码 简单思考一下我们再登录页需要跳转到哪几个目标页首页、指定目标页、返回上一页 那么我们编写几个接口方法 public interface UserView extends BaseView {/*** 直接返回上个页面*/void toLast();/*** 是否有需要跳转的目标页面* return true有目标页面*/boolean hasTarget();/*** 跳转到目标页面结合hasTarget使用*/void toTarget();/*** 跳转到主页*/void toMain();/*** 关闭键盘*/void hideKeyboard(); }我们在登录页实现接口然后模拟下登录操作 点击登录 public MutableLiveDataUserInfo getLiveData() {return liveData;}//点击按钮触发的方法仅用于模拟public void loginClick(View v, RequestLoginBean requestLoginBean, String password) {int id v.getId();if (id R.id.login_submit) {if (StringUtil.isEmpty(requestLoginBean.getUsername())) {baseView.showToast( 请填写用户名);return;}if (StringUtil.isEmpty(password)) {baseView.showToast( 请填写密码);return;}try {requestLoginBean.setPassword(MD5Util.md5Encode(password));} catch (Exception e) {e.printStackTrace();baseView.showToast(密码加密异常);} // iRepository.login(requestLoginBean, liveData);//模拟登录情况baseView.showLoading(正在登录请稍后...);UserAccountHelper.setToken(this is token !!!);UserAccountHelper.setRefreshToken(this is refresh_token !!!);UserInfo userInfo new UserInfo() {{setId(1);setAvatar(https://img2.baidu.com/it/u2948556484,2204941832fm253fmtautoapp120fJPEG?w655h436);setEmail(fzkf3318163.com);setName(张三);setPhone(15210230000);setRealName(张韶涵);setRoleName(演员);setSex(1);}};new Handler(Looper.getMainLooper()).postDelayed(() - {baseView.hideLoading();liveData.setValue(userInfo);}, 3000);}}LoginActivity中监听liveData mViewModel.getLiveData().observe(this, userInfo - mViewModel.loginCallback(userInfo, binding.userEdit.getText().toString()));//mViewModel中public void loginCallback(UserInfo userInfo, String userName) {//存储登录信息和登录状态UserAccountHelper.saveLoginState(userInfo, true);//这里只是判断本地账号和上次账号是否为同一个如果不是同一个则不能继续之前操作则需要返回App首页刷新并且同事判断下当前app是不是只有当前登录页一个页面if (TextUtils.isEmpty(userName) || !userName.equals(UserAccountHelper.getAccount()) ||AppManager.getAppManager().getActivityStack().size() 1) {UserAccountHelper.saveAccount(userName);//打开MainActivitybaseView.toMain();return;}//存储本地登录的账号UserAccountHelper.saveAccount(userName);if (baseView.hasTarget()) {baseView.toTarget();return;}baseView.toLast();}现在完善一下LoginActivity SuppressLint(UnsafeIntentLaunch)Overridepublic void toLast() {showToast(登录成功);setResult(RESULT_OK, getIntent().putExtras(bundle));finish();}Overridepublic boolean hasTarget() {String targetActivity bundle.getString(ConstantsHelper.TARGET_ACTIVITY);if (TextUtils.isEmpty(targetActivity)) {return false;}try {//是否报错不报错说明目标页面存在Class.forName(targetActivity);return true;} catch (ClassNotFoundException e) {return false;}}Overridepublic void toTarget() {String targetActivity bundle.getString(ConstantsHelper.TARGET_ACTIVITY);if (TextUtils.isEmpty(targetActivity)) {toLast();return;}try {//是否报错不报错说明目标页面存在Intent intent new Intent(this, Class.forName(targetActivity));intent.putExtras(bundle);startActivity(intent);finish();} catch (ClassNotFoundException e) {toLast();}}Overridepublic void toMain() {showToast(登录成功);AppManager.getAppManager().finishAllActivity();startActivity(errorService.getMainActivity());}编写案例测试效果 编写一个页面 NeedLogin(enable true) AndroidEntryPoint public class TargetActivity extends BaseActivityEmptyViewModel, ActivityTargetBinding {public final static String ARGS ARGS;Overrideprotected int getLayoutId() {return R.layout.activity_target;}Overridepublic String setTitleBar() {return 测试登录拦截;}Overridepublic void initView(Bundle savedInstanceState) {binding.buttonLogin.setOnClickListener(v- errorService.toLogin(this));}Overridepublic void initData(Bundle bundle) {String args bundle.getString(ARGS);binding.tvArgs.setText(TextUtils.isEmpty(args) ? 暂无参数 : args);} } ?xml version1.0 encodingutf-8? layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdata/dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.activity.TargetActivityTextViewandroid:idid/tv_argsandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textColorcolor/auto_colorandroid:textSizedimen/font_18app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /Buttonandroid:idid/button_loginandroid:text前往登录android:textColorcolor/auto_colorandroid:textSizedimen/font_18app:layout_constraintStart_toStartOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintTop_toBottomOfid/tv_argsandroid:layout_widthwrap_contentandroid:layout_heightwrap_content//androidx.constraintlayout.widget.ConstraintLayout /layout效果图 完结 代码地址 https://github.com/fzkf9225/mvvm-componnent-master/blob/master/app/src/main/java/com/casic/titan/demo/activity/TargetActivity.java
http://www.hkea.cn/news/14593551/

相关文章:

  • 建设部网站在哪里报名考试网站建设福永附近网络公司
  • 电子商务网站功能设计与分析网站建设 模版
  • 涪城移动网站建设创业平台是什么意思
  • 郑州微网站网站建设结算方式
  • 天河手机建网站深圳南园网站建设
  • 漳州网站建设哪家最正规wordpress the date
  • 鼎豪网站建设django网站开发流程
  • 托管网站费用网站大全免黄
  • 古田网站建设鄂州网站制作企业
  • 网络营销网站网站建设公司后端招聘要求
  • 创造网站的软件网站模板在线预览
  • 宜春网站制作网站搜索引擎收录
  • 基木鱼建站教程网址生成短链接
  • 南通启益建设集团有限公司网站广州服务类拓客软件
  • 贵州企业网站建设案例大连网站制作在线
  • 杭州网站设计公司推荐wordpress底部导航栏
  • 做网站 先上线再调整宁波 商城网站建设
  • 杭州网站做的好公司哪家好网站开发与维护项目招标
  • 做食品网站用什么颜色百度推广开户多少钱
  • 有专业做网站的吗gre考中关村做网站设计的
  • 都匀住房与城乡建设部网站新网站优化怎么做
  • 网站优化的方式徐州网站制作企业
  • 清空回收站 wordpress石家庄市建设局网站首页
  • 广州做网站mxszpt一站式网络营销
  • 怎么查网站流量免费的销售管理系统
  • 外贸柒夜网站建设怎么制作平台网站
  • 艺术品拍卖网站源码php杭州住房和城乡建设厅官网
  • 用凡科做的手机网站版教育门户网站建站
  • 长春企业网站seowordpress怎么建加盟网
  • 搜搜提交网站入口asp网站浏览器兼容