备案 网站 漏接 电话WordPress前端发布文章
备案 网站 漏接 电话,WordPress前端发布文章,互联网教育网站开发,专业推广企业网站公司修改下之前的demo#xff0c;测试下ARouter拦截器。页面如下#xff1a;未登录状态#xff0c;点击下面红色按钮#xff0c;跳转登录页面#xff1a;输入一个名字点击登录按钮跳转到下面用户中心页面#xff1a;回到首页#xff0c;点击退出登录#xff0c;重新点击最下…修改下之前的demo测试下ARouter拦截器。页面如下未登录状态点击下面红色按钮跳转登录页面输入一个名字点击登录按钮跳转到下面用户中心页面回到首页点击退出登录重新点击最下面按钮直接跳转到用户中心页面ok. 代码如下在业务模块新增LoginActivitypackage com.example.module_2; import android.os.Bundle; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.alibaba.android.arouter.facade.annotation.Autowired; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.launcher.ARouter; import com.example.common.LoginService; import com.example.module_2.R; /** * 登录页面 */ Route(path /login/login) public class LoginActivity extends AppCompatActivity { Autowired(name goto_path) String gotoPath; // 登录成功后要跳转的路径 private EditText etUsername; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 注入参数 ARouter.getInstance().inject(this); // 创建简单的 UI LinearLayout layout new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.setPadding(50, 100, 50, 100); etUsername new EditText(this); etUsername.setHint(请输入用户名); etUsername.setTextSize(16); Button btnLogin new Button(this); btnLogin.setText(登录); btnLogin.setTextSize(16); btnLogin.setPadding(20, 30, 20, 30); layout.addView(etUsername); layout.addView(btnLogin); setContentView(layout); // 设置登录按钮点击事件 btnLogin.setOnClickListener(v - { String username etUsername.getText().toString().trim(); if (username.isEmpty()) { Toast.makeText(this, 请输入用户名, Toast.LENGTH_SHORT).show(); return; } // 执行登录 LoginService.login(username); Toast.makeText(this, 登录成功欢迎 username, Toast.LENGTH_LONG).show(); if (gotoPath ! null) { ARouter.getInstance().build(gotoPath).navigation(); // 跳转到目标页面 finish(); } else { finish(); } }); } }个人中心页面package com.example.module_2; import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import com.alibaba.android.arouter.facade.annotation.Route; import com.example.common.LoginService; /** * 需要登录才能访问的页面 * * 路径以 /needlogin/ 开头会被 LoginInterceptor 拦截检查 */ Route(path /needlogin/personal) public class PersonalCenterActivity extends AppCompatActivity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView new TextView(this); textView.setText(String.format(个人中心页面\n\n %s, LoginService.getUsername())); textView.setTextSize(18); textView.setPadding(50, 100, 50, 100); setContentView(textView); } }拦截器也写在该业务模块如下package com.example.module_2.interceptor; import android.content.Context; import android.util.Log; import com.alibaba.android.arouter.facade.Postcard; import com.alibaba.android.arouter.facade.annotation.Interceptor; import com.alibaba.android.arouter.facade.callback.InterceptorCallback; import com.alibaba.android.arouter.launcher.ARouter; /** * 日志记录拦截器 * * 作用记录所有路由跳转的详细信息调试用 * * 优先级数字小的优先级高先执行 */ Interceptor(priority -1, name 日志记录拦截器) public class LoggerInterceptor implements com.alibaba.android.arouter.facade.template.IInterceptor { private static final String TAG ARouter-Logger; Override public void process(Postcard postcard, InterceptorCallback callback) { // 记录路由信息 Log.d(TAG, ); Log.d(TAG, 路由跳转开始); Log.d(TAG, 目标路径 postcard.getPath()); // 打印所有参数 if (postcard.getExtras() ! null !postcard.getExtras().isEmpty()) { Log.d(TAG, 携带参数:); for (String key : postcard.getExtras().keySet()) { Object value postcard.getExtras().get(key); Log.d(TAG, key value); } } else { Log.d(TAG, 无参数); } // 继续处理传递自定义回调 callback.onContinue(postcard); // 交给下一个拦截器处理 } Override public void init(Context context) { Log.d(TAG, LoggerInterceptor 初始化完成); } }package com.example.module_2.interceptor; import android.content.Context; import android.util.Log; import android.widget.Toast; import com.alibaba.android.arouter.facade.Postcard; import com.alibaba.android.arouter.facade.annotation.Interceptor; import com.alibaba.android.arouter.facade.callback.InterceptorCallback; import com.alibaba.android.arouter.launcher.ARouter; import com.example.common.LoginService; /** * 登录检查拦截器 * * 作用拦截所有需要登录的页面如果未登录则跳转到登录页 * */ Interceptor(priority 1, name 登录检查拦截器) public class LoginInterceptor implements com.alibaba.android.arouter.facade.template.IInterceptor { private static final String TAG LoginInterceptor; private Context context; Override public void process(Postcard postcard, InterceptorCallback callback) { Log.d(TAG, LoginInterceptor 开始处理。 \n 嘿嘿); // 获取目标路径 String path postcard.getPath(); // 只拦截特定路径以 /needlogin/ 开头的路径都需要登录 if (path ! null path.startsWith(/needlogin/)) { Log.d(TAG, 检测到需要登录的路径 path); // 检查是否已登录 if (!LoginService.isLogin()) { Log.d(TAG, 用户未登录准备跳转到登录页); // 保存原始请求信息 // postcard.withString(goto_path, path); // 和47行路由传参一样调用一处就行。 // 重定向到登录页 ARouter.getInstance() .build(/login/login) .withString(goto_path, path) .navigation(); // 中断路由流程 callback.onInterrupt(new RuntimeException(请先登录哈)); // 显示提示信息 if (context ! null) { Toast.makeText(context, 请先登录哦, Toast.LENGTH_SHORT).show(); } return; } else { Log.d(TAG, 用户已登录允许通过); } } else { Log.d(TAG, 该路径不需要登录验证 path); } // 继续处理下一个拦截器或目标页面 callback.onContinue(postcard); } Override public void init(Context context) { this.context context; Log.d(TAG, LoginInterceptor 初始化完成); } }主模块注册业务模块的activity主页MainActivity关键代码测试需要校验登录的页面即个人中心页面// 测试拦截器 - 访问需要登录的页面 View btnNeedLogin findViewById(R.id.btnNeedLogin); if (btnNeedLogin ! null) { btnNeedLogin.setOnClickListener(v - { Log.d(MainActivity, 准备访问需要登录的页面); ARouter.getInstance() .build(/needlogin/personal) .navigation(); }); }ok. 看下未登录时点击跳转个人中心拦截器日志ok. 日志拦截器先打印了路由信息。然后登录拦截器校验了未登录重定向到登录页面。然后登录页面登录成功跳转个人中心的时候拦截器日志如下ok. 这次允许通过成功跳转到个人中心页面。ok. 拦截器挺有用。能用于实现一些公共功能。