Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[help wanted]登录拦截以及登录后再跳转回具体页面 #76

Closed
zhangchaoxu opened this issue Mar 31, 2018 · 2 comments
Closed

Comments

@zhangchaoxu
Copy link

zhangchaoxu commented Mar 31, 2018

需求:

类似web中登录后跳转到具体页面,在app的某个位置NormalActivity(fragment/activity),点击进入另外一个需要登录才能访问的页面(NeedLoginActivity)。判断发现用户未登录,跳到登录页面(LoginActivity)。登录成功以后希望跳转到NeedLoginActivity,并且带有原始调用NeedLoginActivity时候的bundle requestCode等参数。

思路:

  1. 在NeedLoginActivity中添加登录拦截器
@Route(value = {"NeedLoginActivity"}, interceptors = {"Login"})
public class NeedLoginActivity
  1. 定义登录拦截器,并且在拦截器中判断是否登录
public class LoginInterceptor implements RouteInterceptor {

    @Override
    public boolean intercept(Context context, RouteRequest routeRequest) {
        boolean isUserLogin = App.getInstance().isUserLogin();
        if (!isUserLogin) {
            // 未登录则跳转到登录页面,不直接将routeRequest传递是因为routeRequest中bundle无法序列化
            Router.build("Login")
                    .with("routeExtras", routeRequest.getExtras())
                    .with("routePath", routeRequest.getUri().toString())
                    .with("routeRequestCode", routeRequest.getRequestCode())
                    .requestCode(RequestCode.USER_LOGIN)
                    .go(context);
            ToastUtils.showLong(R.string.login_request);
        }
        return !isUserLogin;
    }
}
  1. 在登录页面,登录成功以后
@Route({"Login"})
public class LoginActivity extends AppBaseActivity {

    @InjectParam
    Bundle routeBundle;
    @InjectParam
    String routePath;
    @InjectParam
    int routeRequestCode;
    
     /**
     * 登录成功,处理登录结果
     */
    private void loginSuccess(final LoginResult result) {
        App.getInstance().saveUserLogin(result);
       
        Intent intent = new Intent();
        intent.putExtra("routePath", routePath);
        intent.putExtra("routeBundle", routeBundle);
        intent.putExtra("routeRequestCode", routeRequestCode);

         setResult(Activity.RESULT_OK, intent);
         finish();
        }
    }
 
}
  1. 在NormalActivity的onActivityResult捕获LoginActivity中返回的route信息,并再次尝试跳转到NeedLoginActivity
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == RequestCode.USER_LOGIN && resultCode == Activity.RESULT_OK && null != data) {
            Bundle routeBundle = data.getBundleExtra("routeBundle");
            String routePath = data.getStringExtra("routePath");
            int routeRequestCode = data.getIntExtra("routeRequestCode", 0);
            if (!StringUtils.isEmpty(routePath)) {
                IRouter iRouter = Router.build("routePath");
                if (null != routeBundle) {
                    iRouter.with(routeBundle);
                }
                if (0 != routeRequestCode) {
                    iRouter.requestCode(routeRequestCode);
                }
                iRouter.go(this);
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

遇到的问题

  1. route跳转会带有bundle requestcode anim等信息,需要挨个传递到LoginActivity,比较麻烦。直接传递RouteRequest会报RouteRequest中的bundle无法序列化的错误
  2. 如果跳转的初始页面是一个activity还ok,上述整个流程都可以走通,但是如果是一个fragment就会出现一个问题,那就是拦截器中intercept(Context context, RouteRequest routeRequest)方法中的content是这个fragment附属的activity,也就是说LoginActivity登录结果只能再附属的activity中onActivityResult获取,无法再该fragment的onActivityResult获取。

上述1只是麻烦一点,还可以解决。2的话有点麻烦。

@chenenyu 不知道我上述描述是否清晰,对于这个需求这个思路是否正确,另外就是在拦截器的intercept中是否可以获取到原始go()带有的content/fragment?
谢谢

@chenenyu
Copy link
Owner

chenenyu commented Apr 2, 2018

抱歉才看到,我仔细想下再回复你。

@zhangchaoxu
Copy link
Author

补充一下对于问题1的log,我将LoginInterceptor修改为直接传递RouterRequest,报错信息如下

@Interceptor("Login")
public class LoginInterceptor implements RouteInterceptor {

    @Override
    public boolean intercept(Context context, RouteRequest routeRequest) {
        boolean isUserLogin = App.getInstance().isUserLogin();
        if (!isUserLogin) {
            // 未登录则跳转到登录页面,不直接将routeRequest传递是因为routeRequest中bundle无法序列化
            /*Router.build("Login")
                    .with("routeExtras", routeRequest.getExtras())
                    .with("routePath", routeRequest.getUri().toString())
                    .with("routeRequestCode", routeRequest.getRequestCode())
                    .requestCode(RequestCode.USER_LOGIN)
                    .go(context);*/
            Router.build("Login")
                    .with("routeRequest", routeRequest)
                    .requestCode(RequestCode.USER_LOGIN)
                    .go(context);
            ToastUtils.showLong(R.string.login_request);
        }
        return !isUserLogin;
    }
}

错误信息

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.chenenyu.router.RouteRequest)
        at android.os.Parcel.writeSerializable(Parcel.java:1394)
        at android.os.Parcel.writeValue(Parcel.java:1341)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
        at android.os.Bundle.writeToParcel(Bundle.java:1034)
        at android.os.Parcel.writeBundle(Parcel.java:669)
        at android.content.Intent.writeToParcel(Intent.java:7485)
        at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2411)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1496)
        at android.app.Activity.startActivityForResult(Activity.java:3745)
        at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
        at android.support.v4.app.ActivityCompat.startActivityForResult(ActivityCompat.java:230)
        at com.chenenyu.router.RealRouter.go(RealRouter.java:480)
        at com.idogfooding.exchange.user.LoginInterceptor.intercept(LoginInterceptor.java:36)
        at com.chenenyu.router.RealRouter.intercept(RealRouter.java:458)
        at com.chenenyu.router.RealRouter.finalizeIntent(RealRouter.java:255)
        at com.chenenyu.router.RealRouter.getIntent(RealRouter.java:235)
        at com.chenenyu.router.RealRouter.go(RealRouter.java:506)
        at com.idogfooding.exchange.news.NewsListFragment.lambda$cfgAdapter$0$NewsListFragment(NewsListFragment.java:66)
        at com.idogfooding.exchange.news.NewsListFragment$$Lambda$0.onItemClick(Unknown Source)
        at com.chad.library.adapter.base.BaseQuickAdapter.setOnItemClick(BaseQuickAdapter.java:976)
        at com.chad.library.adapter.base.BaseQuickAdapter$5.onClick(BaseQuickAdapter.java:956)
        at android.view.View.performClick(View.java:4780)
        at android.view.View$PerformClick.run(View.java:19866)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.io.NotSerializableException: android.os.Bundle
        at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344)
        at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
        at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959)
        at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360)
        at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054)
        at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384)
        at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
        at android.os.Parcel.writeSerializable(Parcel.java:1389)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants