ARouter 與 IProvider服務調用,IInterceptor登陸攔截

參考:

xingfu0809 / ArouterLogin : 基於Arouter的登錄攔截

IProvider

base模塊 : 定義服務接口

import com.alibaba.android.arouter.facade.template.IProvider;

public interface IModuleService extends IProvider {
    /**
     * 獲取用戶名
     *
     * @return 用戶名
     */
    String getUserName();

}

user模塊 : 實現服務接口

import android.content.Context;

import com.alibaba.android.arouter.facade.annotation.Route;

@Route(path = "/user/user_service")
public class UserServiceImpl implements IModuleService {
    @Override
    public String getUserName() {
        return "xq";
    }

    @Override
    public void init(Context context) {

    }
}

video模塊 : 調用服務

//通過path調用服務
String userName1 = ((IModuleService) ARouter.getInstance()
        .build("/user/user_service")
        .navigation()).getUserName();

//通過類名調用服務
String userName2 = ARouter.getInstance()
        .navigation(IModuleService.class)
        .getUserName();

我們還可以在base中處理,然後在調用:

base模塊:

import com.alibaba.android.arouter.launcher.ARouter;

public class ModuleServiceFinder {

    public static String getUserName() {
        IModuleService iModuleService = ARouter.getInstance()
                .navigation(IModuleService.class);
        if (iModuleService != null) {
            return iModuleService.getUserName();
        }
        return "";
    }

}

video模塊 :調用服務


//通過base調用服務
String userName3 = ModuleServiceFinder.getUserName();

IInterceptor

定義攔截器

import android.content.Context;

import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.facade.callback.InterceptorCallback;
import com.alibaba.android.arouter.facade.template.IInterceptor;

public class LoginInterceptorImpl implements IInterceptor {

    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        boolean login = UserCenter.isLogin();
        if (login) {
            //已登陸不攔截
            callback.onContinue(postcard);
        } else {
            String path = postcard.getPath();
            switch (path) {
                //不需要登陸直接進入界面
                case "/video/main":
                case "/picture/main":
                    callback.onContinue(postcard);
                    break;
                default:
                    //需要登陸攔截
                    callback.onInterrupt(null);
                    break;
            }
        }
    }

    @Override
    public void init(Context context) {

    }
}

ReadActivity : 需要登陸的界面


ARouter.getInstance()
        .build("/read/main")
        .withString("msg","我是傳遞到read activity的數據")
        .navigation(this, new NavigationCallback() {
            //找到了
            @Override
            public void onFound(Postcard postcard) {

            }

            //找不到了
            @Override
            public void onLost(Postcard postcard) {

            }

            //跳轉成功了
            @Override
            public void onArrival(Postcard postcard) {

            }

            //被攔截了
            @Override
            public void onInterrupt(Postcard postcard) {
                //跳轉到登陸,
                //把參數和path都傳遞到登陸頁,登陸完成後再跳轉
                String path = postcard.getPath();
                Bundle extras = postcard.getExtras();
                ARouter.getInstance()
                        .build("/login/main")
                        .with(extras)
                        .withString("path", path)
                        .navigation();
            }
        });


LoginActivity : 登陸界面



@Autowired
public String path = "";


//登陸後
if (!TextUtils.isEmpty(path)) {
    ARouter.getInstance()
            //傳遞過來的路徑
            .build(path)
            //傳遞過來的參數
            .with(getIntent().getExtras())
            .navigation();
}
finish();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章