ARouter基本使用の詳細


会社のプロジェクトが分割されたので、弊社はアリのこのARouterフレームワークを使いました.なぜこのフレームワークを使用するのか、多くの人が原因を知っていると信じています.アリの雲生コミュニティの一節を借ります.私たちが使用している原生ルーティングスキームは一般的に明示的intentと暗黙的intentの2つの方法で実現されていますが、明示的intentの場合、直接的なクラス依存の問題が存在するため、結合が非常に深刻になります.暗黙的なintentの場合、ルールの集中的な管理が発生し、コラボレーションが非常に困難になります.また、一般的に構成ルールはManifestにあり、拡張性が低下します.それ以外に、オリジナルのルーティングスキームを使用すると、StartActivity()を使用するとどの部分にも手を出すことができず、システム管理に任せるしかないため、ジャンプに失敗した場合に降格できず、運営レベルの異常を直接投げ出すことになります.この場合、カスタムルーティングコンポーネントを使用することを考慮すると、URLインデックスによってクラス依存の問題を解決することができるなど、以上の問題を解決することができる.分散管理ページ構成により、暗黙的intentにおける集中的な管理Pathの問題を解決することができる.自身がルーティングプロセス全体を実現することも良好な拡張性を有し、AOPによってジャンププロセスが制御できない問題を解決し、同時に非常に柔軟なダウングレード方式を提供することができる.それではARouterの使い方をまとめてみます.
実は以下のすべての説明はARouerのドキュメントの中で検索することができますが、個人的にはドキュメントが卵が痛いと感じています.多くの概念はただ持っているだけです.自分で踏んだ穴と合わせて、自分の使い方を書きます.
構成:
build.gradeでの構成:

android {
	...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName: project.getName()]
            }
        }
    }

dependencies {
  compile 'com.alibaba:arouter-api:1.2.2'
  annotationProcessor 'com.alibaba:arouter-compiler:1.1.3'
}

次の操作を行います.
初期化:
一般的にApplication.onCreate()の初期化:
if (isDebug()) {           //        init  ,       init      
    ARouter.openLog();     //     
    ARouter.openDebug();   
    //       (   InstantRun     ,        !        ,       )
}
ARouter.init(mApplication); //     ,   Application    

####注釈の追加:ルーティングが必要なActivityに対してはRoute注釈を使用する必要があり、Route注釈に対してはpathループ力を初期化する必要があり、pathは少なくとも2つ以上存在しなければならない.すなわち/xx/xx....例は以下の通りである.
@Route(path = "/simple/simple1Activity")
public class Simple1Activity extends AppCompatActivity {
}

このActivityをルーティングするには、次の方法を使用します.
ARouter.getInstance().build("/simple/simple1Activity").navigation();

最も基本的なルーティングスキームはすでによくなっており、コンパイルすれば使用できます.そう、簡単です.
####ルーティングパラメータ:上記の簡単なルーティングはすでに完了していますが、ターゲットActivity転送パラメータが必要な場合は?ルーティングコマンドを参照してください.
 ARouter.getInstance().
                build("/simple/simpledata").
                withString("name","zhangsan").
                withInt("age",18).
                withParcelable("test",new TestParcelable("Tom",12)).
                navigation();

では、ターゲットのActivityは?ソースコードは次のとおりです.
@Route(path = "/simple/simpledata")
public class SimpleDataActivity extends AppCompatActivity {

    TextView tv ;

    @Autowired()
    String name ;

    @Autowired(name = "age")
    int age ;

    @Autowired
    TestParcelable test ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple_data);

        //inject
        ARouter.getInstance().inject(this);

        tv = (TextView) findViewById(R.id.id_tv);
        tv.setText("name:" + name +",age:" + age  + ",test:"+test);
    }
}

パラメータにフィールドを宣言し、@Autowired注記で表す必要があります.@Autowiredはname IDを記入し、URLの異なるパラメータを順番にマッピングすることができます.最後にARouterを使います.getInstance().inject(this);メソッドは、@Autowired注記のフィールドを初期化するためにinjectに来ます.結局貼らないので、これは簡単です.
startActivity ForResultスキーム:
多くの場合、ターゲットActivityにルーティングし、通常書き換えられているstartActivity ForResult&onActivity Resultメソッドに戻る必要があります.ARouterを使うのも簡単です.以下のようにします.
ARouter.getInstance().build("/simple/simpledata").
                withString("name","zhangsan").
                withInt("age",18).
                withParcelable("test",new TestParcelable("Tom",12)).
                navigation(this,100);

navigation()メソッドにパラメータを追加するだけで、最初のパラメータはActivityでなければなりません.2番目のパラメータは私たちのrequestCodeです.
ルーティング結果の取得:
ルーティングを行うたびに、ルーティングが受け入れられるかどうか、失われたかどうか、ブロッカーによってブロックされているかどうかを知る必要がある場合は、navigation()メソッドのリロード関数を使用します.
ARouter.getInstance().build("/test/simple_interceptor").navigation(this, new NavCallback() {
            @Override
            public void onArrival(Postcard postcard) {  //        
                Log.d("MainActivity" , "onArrival : " + postcard.getPath());
            }

            @Override
            public void onInterrupt(Postcard postcard) {  //        
                Log.d("MainActivity" , "onInterrupt : " + postcard.getPath());
            }

            @Override
            public void onLost(Postcard postcard) {   //        
                Log.d("MainActivity" , "onLost : " + postcard.getPath());
            }

            @Override
            public void onFound(Postcard postcard) {  //          
                Log.d("MainActivity" , "onLost : " + postcard.getPath());
            }
        });

interceptorブロッキング:
ARouterには、ターゲットページへのルーティング時に、ユーザーがログインしているかどうかを確認し、ユーザー権限が満たされているかどうかを確認し、満たされていない場合は、対応するログインインタフェースまたは対応するルーティングインタフェースにルーティングするなど、多くの用途があります.ARouterのブロッキングは奇抜で、Iinterceptorインタフェースを実装し@Interceptor注釈を使用するだけで、登録する必要はありません.もちろん、ルーティングのたびにブロックを介してブロックされるというデメリットもありますが、プログラムの実行効率が低下するのは明らかです.Interceptorは、ログインチェックブロッカーの定義、権限チェックブロッカーの定義など、複数を定義できます.ブロッカーの優先度はpriority定義を使用し、優先度が大きいほど先に実行されます.遮断器内部にはcallbackが使用する.onContiune()/callback.onInterrupt()は、前者はブロッキングタスクが完了し、ルーティングを継続することを示す.後者はルートの終了を示す.例:
@Interceptor(priority = 4)
public class TestInterceptor implements IInterceptor {

    @Override
    public void process(final Postcard postcard, final InterceptorCallback callback) {
        Log.d("interceptor",postcard.getPath() + ".." + postcard.getGroup());
		
	//        	
	//callback.onContinue(postcard);
	or
	//callback.onInterrupt(postcard)
    }

    @Override
    public void init(Context context) {
        Log.d("init",TestInterceptor.class.getSimpleName() + " has been inited");
    }
}

ここでの論理判断は,例えばユーザがログインしているかどうかを判断し,ログインしている場合は放行し,そうでない場合はログインルートを行う.
 if(Constant.isLogin()) {
    callback.onContinue(postcard);
  }else {
    callback.onInterrupt(null);
    ARouter.getInstance().build("/router/login").navigation();
  }

もちろん、一部のルーティングがブロックを通過しないことを望んでいる場合、ARouterはグリーンチャネル関数を親切に提供してくれます.greenChannel()を使用すると、すべてのInterceptorが失効します.
ARouter.getInstance().build("/test/simple_interceptor").greenChannel().navigation();

グローバル・ダウングレード・ポリシーのカスタマイズ:
これは比較的大きく、一般的に言えば、私たちのappがNativeで書かれている場合、ある日私たちの隠れたIntentがすべてのActivityに一致しない場合、私たちのActivityは間違って報告され、さらに悪い結果は崩壊を招くことになります.ダウングレードポリシーは、この問題を解決するために行われます.このルーティングが存在しない場合は、ホームページに戻るか、エラーページに戻るかなど、これらのエラーを集中的に処理することができます.ダウングレードポリシーでは、DegradeServiceインタフェースを実装し、@Route注記を使用して、どのルーティングが処理される必要があるかを示します.ダウングレードポリシーは複数あります.例を挙げます.
@Route(path = "/user/*")
public class LoginDegradeServiceImpl implements DegradeService {

    Context mContext;

    @Override
    public void onLost(Context context, Postcard postcard) {
	    //
	    LogUtils.d("onLost:" + postcard);
        ARouter.getInstance().build("/router/login").navigation();
    }

    @Override
    public void init(Context context) {
        this.mContext = context ;
    }
}

これは,ログインを定義する際に,誤ったルーティング方式を用いた場合,ログインインタフェースにルーティングする.path=「/user/**」に注意すると、二次的なuserの誤ったルーティングであれば、ここに渡されることを示します.プロジェクトには多くのモジュールが存在するため、ここで定義した「/user/*」はユーザーモジュールを識別するだけで、他のモジュールに影響します.
サービス管理:
個人的には、この機能はあまり使われていないような気がしますが、ARouterはそれなりの方法を提供しています.ここでは簡単に紹介します.ここのサービスはAndroidの4つのコンポーネントの言うようなサービスではなく、より適切に言えば、ARouter依存注入によってその実装クラスを見つけ、インタフェースの方法を使用するインタフェースであるべきだ.サービスインタフェースはIProviderを継承する必要があります:
public interface HelloService  extends IProvider{
    void sayHello(String name);    
}

インプリメンテーションクラスを取得し、@Routeバインドpath:

@Route(path = "/service/helloservice")
public class HelloServiceImpl implements HelloService {

    Context mContext;

    @Override
    public void sayHello(String name) {
        Toast.makeText(mContext, "hello " + name, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void init(Context context) {
        this.mContext = context ;
        Log.d("HelloServiceImpl" , "the context is " + mContext);
    }
}

では、使用するには、Nameで取得する方法と、Typeで取得する方法と、Nameで取得する方法の2つがあります.
 ((HelloService)ARouter.getInstance().build("/service/helloservice").navigation()).sayHello("micro name ");

Typeで取得した場合:
ARouter.getInstance().navigation(HelloService.class).sayHello("micro type ");

どちらの方式でもHelloServiceインタフェースを呼び出しsayHelloメソッドを実行できます.個人的には卵の役に立たないような気がしますが、私はこのような実現案が必要です.いったい何をしますか.個人の今のプロジェクトでは、このような方法はまだ使えないでしょう.
まとめ:
プロジェクトでは基本的にこれらを使っていますが、もちろん転場アニメーションのような概念もありますが、一時的なプロジェクトでは使われていないので、まとめません.基本的にはARouterの使い方もこれだけです.