Androidモジュール化のログイン業務処理

8338 ワード

Androidモジュール化の基本的な方法を先に紹介しましたが、各モジュールが単独で動作することを保証できます.見たことがない場合は、ここを押してください.Androidモジュール化の簡単なチュートリアルです.しかし、これらは最も基本的なもので、1つのプロジェクトのモジュール化の過程で多くの問題に直面します.最も重要なのはログイン問題です.私たちがモジュールを単独で実行するとき、私たちの前提はログイン操作を行わなければなりません.どのようにして各モジュールを実行する前にログインモジュールを実行しますか?ここには2つのシナリオがあります.サンプルコードはここを見てください.
シナリオ1:BaseActivityブロック(本シナリオのコードはgit履歴を参照)
  • ログインモジュールにおいてログイン状態をグローバルデータに記録する心DataCenter.getInstance().setLogin(true);
  • .
  • BaseActivityで
  • に登録するか否かを判断する.
    if(!DataCenter.getInstance().isLogin()){
                String curUrl = ConstantRouter.getCurRouter(this.getClass().getSimpleName());
                ARouter.getInstance().build(ConstantRouter.LOGIN_ACTIVITY)
                        .withString("targetUrl",curUrl)
                        .navigation();
                finish();
            }
    

    BaseActivityでは、まずログインしたかどうかを判断し、ログインして自然に歩き続け、ログインしていない場合はログインページにジャンプしてログインし、現在のページを終了します.ここでは、ログインページにジャンプする際に現在のページのアドレス(ARouter構成のアドレス)を持っていくことで、ログインが完了してから現在のページにジャンプすることができます.
  • 登録登録登録後のジャンプアドレス2ステップ目では、現在のページのurlをLoginActivityに転送しますが、このジャンプをBaseActivityで処理し、各urlはサブactivityで構成されており、BaseActivityではこのurlは取得できません.この問題を解決するために,ログイン時にジャンプするルーティングテーブルを統一した:
  • public class ConstantRouter {
        public static MapactivityRouterMap = new HashMap<>();
        //  
        public static final String APP_MAINACTIVITY = "/app/MainActivity";
        //      
        public static final String IM_MAINACTIVITY = "/im/InstantMessagingMainActivity";
        //    
        public static final String NEW_HOUSE_MAINACTIVITY = "/new_house/NewHouseMainActivity";
    
        //     
        public static final String SECOND_HOUSE_MAINACTIVITY = "/second_house/SecondHouseMainActivity";
    
        /**
         *   
         */
        public static final String LOGIN_ACTIVITY = "/common_business/LoginActivity";
    
        static{
            activityRouterMap.put(getActivityName(APP_MAINACTIVITY),APP_MAINACTIVITY);
            activityRouterMap.put(getActivityName(IM_MAINACTIVITY),IM_MAINACTIVITY);
            activityRouterMap.put(getActivityName(NEW_HOUSE_MAINACTIVITY),NEW_HOUSE_MAINACTIVITY);
            activityRouterMap.put(getActivityName(SECOND_HOUSE_MAINACTIVITY),SECOND_HOUSE_MAINACTIVITY);
            activityRouterMap.put(getActivityName(LOGIN_ACTIVITY),LOGIN_ACTIVITY);
        }
    
        private static String getActivityName(String routerUrl){
            int pos = routerUrl.lastIndexOf("/");
            return routerUrl.substring(pos+1);
        }
    
        public static String getCurRouter(String activityName){
            return activityRouterMap.get(activityName);
        }
    }
    

    ARouterのurlを構成するとき、私たちは原則に従います.urlの最後は必ずActivityのクラス名です.その後、Activityの名前と彼のARouterのurlを静的マッピングします.これにより、BaseActivityでは、実行時のクラス名でurl:String curUrl = ConstantRouter.getCurRouter(this.getClass().getSimpleName());を取得することで、現在のページのurlをLoginActivityに渡すことができます.
  • ログインモジュールのジャンプ処理
  • @Route(path = "/common_business/LoginActivity")
    public class LoginActivity extends CommonBaseActivity{
    
        @Autowired
        String targetUrl;
        @BindView(R2.id.progressBar)
        ProgressBar progressBar;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            ARouter.getInstance().inject(this);
            if(targetUrl == null){
                //     MainActivity
                targetUrl = ConstantRouter.APP_MAINACTIVITY;
            }
            //          
            progressBar.postDelayed(new Runnable() {
                @Override
                public void run() {
                    DataCenter.getInstance().setLogin(true);
                    ARouter.getInstance().build(targetUrl).navigation();
                    LoginActivity.this.finish();
                }
            },2000);
        }
    }
    

    LoginActivityでログインが完了したら、前のページに直接ジャンプすればいいです.
    方案二:登録モジュールのジャンプ判定
    本方案の核心思想は各モジュールが統一的に先にログインする流れであり、ログインが完了した後、現在実行されているどのモジュールがそのモジュールのトップページにジャンプするかに基づいている.1.各moduleの単独運転時のAndroid Manifest.xmlでは、activityを起動するためのログインモジュールを指定します.
     
            
                
                    
                    
                
            
            
            
    
        
    

    2.現在稼働しているのはそのModuleだと判断するLoginActivityはCommonBusinessモジュールの中にあるので、ただのサブModuleにすぎない.このモジュールで現在稼働しているModuleを取得するのは難しい.ここでは、各Moduleのdebug時のAndroid Manifestを利用する方法を提供する.xmlでlabelを指定し、サブmoduleでこのlabelを取得することで、現在実行されているモジュールを判断できます.
    
            
    

    ここでは、moduleごとにlabelが異なることを確認します.そうしないと、ジャンプエラーが発生します.3.登録ルーティングテーブル各moduleには独自のlabelがあり、その後、labelとモジュールのトップページのurlをマッピングし、ルーティングテーブルを形成し、ジャンプを容易にします.
    public class ConstantRouter {
        //              
        public static MapactivityRouterMap = new HashMap<>();
        //  
        public static final String APP_MAINACTIVITY = "/app/MainActivity";
        //      
        public static final String IM_MAINACTIVITY = "/im/InstantMessagingMainActivity";
        //    
        public static final String NEW_HOUSE_MAINACTIVITY = "/new_house/NewHouseMainActivity";
    
        //     
        public static final String SECOND_HOUSE_MAINACTIVITY = "/second_house/SecondHouseMainActivity";
    
        /**
         *   
         */
        public static final String LOGIN_ACTIVITY = "/common_business/LoginActivity";
    
        static{
            activityRouterMap.put(BaseApplication.getApplication().getString(R.string.label_app),APP_MAINACTIVITY);
            activityRouterMap.put(BaseApplication.getApplication().getString(R.string.label_instant_messaging),IM_MAINACTIVITY);
            activityRouterMap.put(BaseApplication.getApplication().getString(R.string.label_second_house),SECOND_HOUSE_MAINACTIVITY);
            activityRouterMap.put(BaseApplication.getApplication().getString(R.string.label_new_house),NEW_HOUSE_MAINACTIVITY);
        }
    
    
        public static String getCurRouter(String label){
            return activityRouterMap.get(label);
        }
    }
    

    4.LoginActivityでlabelによるジャンプ
     /**
         *                   
         * @return
         */
        private String getCurModuleUrl(){
            String label = null;
            try {
                label = getResources().getString(
                        getPackageManager().getApplicationInfo(getPackageName(), 0).labelRes);
                return ConstantRouter.getCurRouter(label);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
        
         targetUrl = getCurModuleUrl();
            if(targetUrl == null){
                targetUrl = ConstantRouter.APP_MAINACTIVITY;
            }
            //          
            progressBar.postDelayed(new Runnable() {
                @Override
                public void run() {
                    DataCenter.getInstance().setLogin(true);
                    ARouter.getInstance().build(targetUrl).navigation();
                    LoginActivity.this.finish();
                }
            },2000);   
    

    まとめ
    2つのシナリオでは、1つの欠点は、ログインしていない場合、モジュールのトップページがログインページにジャンプして自分を終了することです.これにより、キラキラした状況になるのか、それとも少し明らかになります.もちろん、これは開発時にしか現れません.リリース後は必ずApp全体でリリースされ、Moduleを単独で実行することはありません.このような状況は自然に起こらない.だから、私が採用したのは2つ目の案で、moduleごとのlabelが重複しないことを確保すればいいです.
    最後に私のもう一つの文章を引き続き見ることができます:Androidモジュール化ButterKnifeとDagger 2の使用