Androidコンポーネント最適ルーティング-ARetrofit

7402 ワード

Androidはコンポーネント化された最適なルートで、簡単に作られています.
Githubソース:ARetrofit
テキスト
demo
demo apkダウンロード
紹介する
ネーミングから見ると、Android開発をしている仲間たちは知り合いのように感じているのではないでしょうか...はい、Retrofit、優れたネットフレームワークで、現在多く使われていますが、その使い方はよく知られていると思います.
ARetrofitは、module間通信を簡単に実現できる優れたAndroidコンポーネント化フレームワークです.ここでRetrofitを接尾辞として命名したのは,主にretrofit大神のアーキテクチャ構想を尊重し,開発者の学習と使用コストを低減することを目的としている.
プロジェクトをコンポーネント化している場合は、ARetrofitが選択されません.
二機能紹介
  • Activity Callbackを追加し、1つのパラメータを構成することによってActivityコールバックを実現し、任意のパラメータを返信することができ、onActivity Resultの煩雑な書き方に別れを告げ、より柔軟な
  • を使用する.
  • は直接解析標準URLによるジャンプ
  • をサポートする.
  • はmodule間通信
  • をサポートする.
  • は複数のブロッキングの追加をサポートし、カスタムブロッキング順序
  • をサポートする.
  • は依存注入をサポートし、
  • は単独で依存注入フレームワークとして使用することができる.
  • は、自動登録フレームワークとして単独で使用することができる
  • .
  • InstantRun
  • をサポート
  • MultiDex(Googleスキーム)
  • をサポート
  • ページ、ブロッキング、サービスなどのコンポーネントは、フレーム
  • に自動的に登録する.
  • はFragment
  • の取得をサポートする.
  • Kotlinミキシング
  • をサポート
  • プロセス間通信(完備しなければならない~)IPC業務があればABridgeプロセス間通信の最も牛案の特徴を参考にすることができる:簡単で、低侵入(Activity/Fragment/その他のクラスでルート登録を宣言する必要があるだけ)、使いやすい
  • 原理解析
    二基本用法
    Step 1:依存と構成の追加
  • project gradle file
  • buildscript {
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:x.x.x'
            //      
            classpath "com.sjtu.yifei:auto-inject:1.0.1"
        }
    }
    
    
  • app gradle file
  • // plugin:'com.android.application'       ,      
    apply plugin: 'com.sjtu.yifei.autoinject'
    
  • lib module gradle file
  • dependencies {
       ...
       annotationProcessor "com.sjtu.yifei:auto-complier:1.5.0"
    
       api "com.sjtu.yifei:auto-api:1.5.0"
    }
    
  • kotlin lib module gradle file
  • apply plugin: 'kotlin-kapt' //kotlin       
    
    dependencies {
        ...
        //kotlin  kapt  
        kapt "com.sjtu.yifei:auto-complier:1.5.0"
    
        api "com.sjtu.yifei:auto-api:1.5.0"
    }
    

    Step 2:ルーティング注記の宣言
  • Activity
  • /**
     * this activity in test-module1
     */
    @Route(path = "/test-module1/Test1Activity")
    public class Test1Activity extends AppCompatActivity {
        ...
    }
    
  • Fragment
  • /**
     * this fragment in login-module
     */
    @Route(path = "/login-module/TestFragment")
    public class TestFragment extends Fragment {
        ...
    }
    

    Step 3:インタフェース向けプログラミング:ARetrofitがActivity/Fragment通信をインタフェースに変換
    /**
     * this interface in router-module
     */
    public interface RouteService {
        //Activity   ,        /Flags/requestCode,      android  
        @Flags(Intent.FLAG_ACTIVITY_NEW_TASK)
        @Go("/test-module1/Test1Activity")
        boolean launchTest1Activity(@Extra("para1") String para1, @Extra("para2") int para2);
        @Go("/test-module1/Test1Activity")
        boolean launchTest1ActivityForResult(@Extra("para1") String para1, @Extra("para2") int para2, @RequestCode int requestCode);
    
        //Fragment   ,        ,      android  
        @Go("/login-module/TestFragment")
        Fragment getTestFragment(@Extra("param1") String para1, @Extra("param2") int[] para2);
    }
    

    Step 4:SDKの初期化
        //   application onCreate()   
        Routerfit.init(this);
    

    Step 5:ルーティング操作の開始
    private void launchTest1Activity(String para1, int para2) {
        //    
       Routerfit.register(RouteService.class).launchTest1Activity(para1,para2);
    }
    

    Step 6:Proguardを使用している場合は、混同ルールを追加します.
    -keep class * implements com.sjtu.yifei.ioc.**{*;}
    -keep class * implements com.sjtu.yifei.annotation.AutoRegisterContract{*;}
    

    3 Activity Callbackのサポート
    onActivity Resultに別れを告げ、ログインコールバックなどのコードをより簡潔かつ柔軟にする
    Step 1:ログインインタフェースの登録
    
    public interface RouteService {
        ...
        //    ActivityCallback    Activity  
        @Go("/login-module/LoginActivity")
        boolean launchLoginActivity(@Extra ActivityCallback callback);
    }
    
    

    Step 2:ログインコールバック操作(優雅なログインコールバックの実現)
    
    @Interceptor(priority = 3)
    public class LoginInterceptor implements AInterceptor {
    
        private static final String TAG = "LoginInterceptor";
        @Override
        public void intercept(final Chain chain) {
            //Test2Activity     
            if ("/login-module/Test2Activity".equalsIgnoreCase(chain.path())) {
                Routerfit.register(RouteService.class).launchLoginActivity(new ActivityCallback() {
                    @Override
                    public void onActivityResult(int i, Object data) {
                        if (i == Routerfit.RESULT_OK) {//         
                            Toast.makeText(ActivityLifecycleMonitor.getTopActivityOrApp(), "    ", Toast.LENGTH_LONG).show();
                            chain.proceed();
                        } else {
                            Toast.makeText(ActivityLifecycleMonitor.getTopActivityOrApp(), "    /  ", Toast.LENGTH_LONG).show();
                        }
                    }
                });
            } else {
                chain.proceed();
            }
        }
    
    }
    
    

    四高次用法
  • ログインコンポーネントを例に
  • .
    Step 1ログインサービスの宣言
    /**
     * this interface in router-module
     *       
     */
    public interface ILoginProvider {
        String login();
    }
    

    注意:自分で宣言したサービスは混同を防ぐ必要があります.
    -keep class * implements com.sjtu.yifei.route.ILoginProvider{*;}
    

    Step 2実装サービス
    /**
     * the ILoginProvider in login-module/
     */
    @Route(path = "/login-module/ILoginProviderImpl")
    public class ILoginProviderImpl implements ILoginProvider {
    
        private String para1;
        private int para2;
    
        public ILoginProviderImpl(String para1, int para2) {
            this.para1 = para1;
            this.para2 = para2;
        }
    
        @Override
        public String login() {
            Routerfit.register(RouteService.class).launchLoginActivity();
            return "ILoginProviderImpl para1:" + para1 + ",para2:" + para2;
        }
    }
    

    Step 3サービスインタフェースの登録
    public interface RouteService {
        ...
        //        ,            
        @Go("/login-module/ILoginProviderImpl")
        ILoginProvider getILoginProviderImpl(@Extra("param1") String para1, @Extra("param2") int para2);
    }
    

    Step 4ブロッキング機能
    //         ,       。 :priority    ,        
    @Interceptor(priority = 3)
    public class LoginInterceptor implements AInterceptor {
    
        private static final String TAG = "LoginInterceptor";
    
        @Override
        public void intercept(Chain chain) {
            Log.e(TAG,"path:" + chain.path());
            //   Test2Activity     
            if ("/login-module/Test2Activity".equalsIgnoreCase(chain.path())) {
                if( /**      */) {//    
                    //      
                    ILoginProvider iProvider = Routerfit.register(RouteService.class).getILoginProviderImpl("provider from login-module", 10001);
                    if (iProvider != null) {
                        iProvider.login();
                    } else {
                        //    ,            
                        chain.proceed();
                    }
                }
            } else {
                //    ,            
                chain.proceed();
            }
        }
    }
    

    五ようこそfork、issues