コンポーネント化/モジュール化のクイックスタートと使用:AlibabaルーティングフレームワークARouterの基本的な使用法。

序文:このモジュール化およびコンポーネント化された記事は、2つの記事で紹介されます。一部の人々はインターネット上にすでに記事があると思うかもしれないので、なぜそれらを書いてください。まず、自分の法線を記録するために、音符とみなすことができます。第二に、インターネットには良い記事がありますが、最近150件以上のいいね記事を読んだのですが、序文が曖昧で多くの知識ポイントが省略されています。この記事の焦点は、すぐに始めて、理解して使用できるようにすることです。

このモジュール化/コンポーネント化の説明は2つの記事に分かれています(最初にARouter、またはサードパーティのルーティングフレームワークを理解する必要があります):
1. AlibabaルーティングフレームワークARouterの基本的な使用
2. Gradle の管理によるAndroidコンポーネント化;およびARouterとの連携、自由自在にジャンプして切り替え

ここでルーティングフレームワークを使用する理由は?たとえば、モジュールが相互に通信できるようにするために、プロジェクトではモジュールAを導入しています。同時に、モジュールBが導入されました。プロジェクトはAとBに同時にアクセスできます。しかし、AがBを訪問したいとし、BがAを訪問したい場合はどうでしょうか。現時点では、それを解決するためにルーティングフレームワークが必要です。これは一面に過ぎません。

1.依存関係を追加する

最初にARouterのgithubアドレス

アプリのbuild.gradle依存関係タグに加えて

 implementation 'com.alibaba:arouter-api:1.3.1'
 annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'


javaCompileOptionsをandroidタグの下のdefaultConfigに追加します。

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

    }
    
}

2.初期化

アプリケーションで初期化し、オンラインバージョンをリリースし、ログを閉じてデバッグすることを忘れないでください。コードは次のとおりです。

public class MyApplication extends Application {
    
    
    //ARouter 调试开关
    private boolean isDebugARouter = true;

    @Override
    public void onCreate() {
    
    
        super.onCreate();
        context = this;
        if (isDebugARouter) {
    
    
            //下面2行必须卸载ARouter init 之间,否则无效
            //打印日志
            ARouter.openLog();
            //开启调试模式(如果在InstantRun的模式下必须开启,线上必须关闭)
            ARouter.openDebug();
        }

        // 官方建议在Application中初始化
        ARouter.init(this);
    }

    @Override
    public void onTerminate() {
    
    
        super.onTerminate();
        ARouter.getInstance().destroy();
    }

}


同時に、ARouterの使用はDagger2に少し似ています。ARouter.getInstance()。inject(Object obj)を呼び出す必要があります。これをBaseにカプセル化します。

public abstract class BaseActivity extends AppCompatActivity {
    
    
    //省略部分代码,便于理解
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(getContentViewId());
        ARouter.getInstance().inject(this);
    }
}

3. @Routeの使用

アクティビティまたはフラグメントで使用します。@Routeアノテーションを使用し、path = "/ x / y"、xはパッケージ名(最後の数字のみを使用)、yは現在のクラス名です。

@Route(path = "/myapplication/MainActivity")
public class MainActivity extends BaseActivity {
    
    
    
}

4. ARouterでのアクティビティ間のジャンプ

アクティビティのジャンプとアクティビティは、次のコードを呼び出すだけです。ビルドのパスは、@ Routeパスでマークしたパスです。

ARouter.getInstance().build("/myapplication/MainActivity").navigation();

上記のコードから、私たちは見つけます。パス "/ myapplication / MainActivity"は定数クラスで管理する必要があります。そうでない場合、次のようにこのように見つけるのは面倒です。

public final class Constance {
    
    
    public static final String ACTIVITY_PATH_MAIN = "/myapplication/MainActivity";
}


ここでのパスジャンプに加えて、彼のパラメータータイプから、Uriジャンプも確認できます。

        Uri uri = Uri.parse(Constance.ACTIVITY_PATH_MAIN);
        ARouter.getInstance().build(uri).navigation();

5.パラメータでジャンプしてパラメータを取得

パラメータでジャンプ

渡したいすべての型を含む.withString()に従うだけです

ARouter.getInstance()
                .build("/myapplication/MainActivity")
                .withString("name", "lihang")
                .withInt("age", 27)
                .withSerializable("human", new Person("力哈", "11"))
                .navigation();

パラメータを取得する

[パラメーターの取得]ページで、ここに大きな穴があることに注意してください。

@Route(path = "/myapplication/SimpleActivity")
public class SimpleActivity extends BaseActivity {
    
    
    @Autowired()
    String name;
    @Autowired(name = "age")
    int mAge;
    //    @Autowired(name = "human")这里注意,如果是传Serializable,注解是得不到的。除非是Paceable
    Person mPerson;

    @Override
    public int getContentViewId() {
    
    
        return R.layout.activity_simple;
    }

    @Override
    public void progressLogic() {
    
    
//        mPerson = (Person) getIntent().getSerializableExtra("human");
    }
}

ここでパラメータを取得するには3つの方法があります。

  • @Autowiredアノテーションが使用された後、以下の値は、値を渡すためのキーです。
@Autowired()
String name;
  • @Autowiredアノテーションを使用した後、name = key、nameはその間に渡されるキーに等しく、以下のパラメーター名は任意です
@Autowired(name = "age")
int mAge;
  • シリアライゼーションには特別なものがあります。Parcelableタイプの場合は、上記のメソッドを使用して取得できます。しかし、それがSerializable型である場合は、それを取得する方法がないことがわかります。しかし、ここでは、従来のgetIntentでも取得できます。
mPerson = (Person) getIntent().getSerializableExtra("human");

6.アニメーションでジャンプ

アニメーションジャンプを導入する前に、overridePendingTransition(int anim_in、int anim_out);を使用する必要があります。これもここで提供されていますが、大きな穴があります。

ARouter.getInstance()
                .build(Constance.ACTIVITY_PATH_SIMPLE)
                .withTransition(R.anim.alpha_activity_in, R.anim.alpha_activity_out)
                //navigation里,一定要加上当前的Context,不然动画不起效
                .navigation(MainActivity.this, 99);


同時に、ARouterは新しいバージョンのアニメーションも提供しますが、それを使用するにはapi> = 16が必要です。

        if (Build.VERSION.SDK_INT >= 16) {
    
    
            ActivityOptionsCompat compat = ActivityOptionsCompat.
                    makeScaleUpAnimation(btn, btn.getWidth(), btn.getHeight(), 0, 0);
            ARouter.getInstance()
                    .build(Constance.ACTIVITY_PATH_SIMPLE)
                    .withOptionsCompat(compat)
                    .navigation();
        }else {
    
    
            ToastUtils.showToast("api <16,不支持新版动画");
        }

7、ActivityのstartActivityForResult(Intent intent、int requestCode)に似ています。

requestCodeでジャンプ

.navigation()にもあります。requestCodeを持っている限り、問題ありません。その後、onActivityResultは通常の使用と同じです。

ARouter.getInstance()
                .build(Constance.ACTIVITY_PATH_SIMPLE)
                .navigation(Context context, int requestCode);

setResultがインターフェイスに戻ります。そのとおりです。複雑です。

        Postcard postcard = ARouter.getInstance().build(Constance.ACTIVITY_PATH_MAIN);
        LogisticsCenter.completion(postcard);
        Class<?> destination = postcard.getDestination();
        Intent intent = new Intent(SimpleActivity.this, destination);
        setResult(1, intent);
        finish();

8.フラグメントの使用

アクティビティとフラグメントの両方を@Routeとパスでマークする必要があると述べました。
ここでのFragmentの使用はActivityと同じですが、唯一の違いは、Activityがジャンプであり、FragmentがFragmenをインスタンス化するインスタンスであることです。

//记得要强转一下,这里传值什么的和Activity的用法一样。
HomeFragment homeFragment = (HomeFragment)ARouter.getInstance().build(Constance.Fragment_PATH_SIMPLE).navigation();

9.インターセプターの使用

まず、インターセプターコードの一部を見てみましょう。

@Interceptor(priority = 1)
public class FirstInterceptor implements IInterceptor {
    
    
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
    
    
        if (postcard.getPath().equals(Constance.ACTIVITY_PATH_SIMPLE)){
    
    
            LogUtils.i("ARouter拦截器", "FirstInterceptor 开始拦截 ======");
        }
        callback.onContinue(postcard);
    }
    @Override
    public void init(Context context) {
    
    
        LogUtils.i("ARouter拦截器", "first init");
    }
}

1.インターセプターの使用は非常に独特であり、コードでこのクラスを作成する限り、機能します。@Interceptorがaptが私たちに多くのことをしたとマークしたと推定されます。

2. @Interceptorの最初のマーク、(優先度= 1)優先度、優先度が小さいほど、早く実行されます。

3. IInterceptorインターフェイスを実装します。2つのメソッドが実装されています:init()、process()。

4.プロジェクトの開始時にinit()メソッドが最初に実行され、アクティビティがジャンプしたときにprocess()メソッドが呼び出されます。

5.インターセプターにハンサムな選択条件を追加する場合は、Postcardを渡すことができます

6.インターセプターが設定されている限り、callback.onContinue(postcard)はここでは呼び出されず、現在のインターセプターでスタックされます。もちろん、ジャンプは現在のページで止まっています。


10.ジャンプ時に監視を追加し、インターセプターで使用する

コードに直接移動します。コード内のコメント

        ARouter.getInstance()
                .build(Constance.ACTIVITY_PATH_SIMPLE)
                .navigation(MainActivity.this, new NavigationCallback() {
    
    
                    @Override
                    public void onFound(Postcard postcard) {
    
    
                        //路由目标被发现时调用(Activity执行跳转代码,第一个执行)
                        //group 为路径的组。如果不自定义,会默认成path的/x/y的x
                        //group 可以自定义,如:@Route(path = Constance.ACTIVITY_PATH_MAIN,group = Constance.GROUP_FIRST)
                        //当然自定义组之后,跳转的时候要带上组名。
                        String group = postcard.getGroup();
                        //path 为全路径@Route(path = Constance.ACTIVITY_PATH_MAIN)
                        String path = postcard.getPath();
                        LogUtils.i("ARouter拦截器", "onFound ------>  group == " + group + "    " + "path == " + path);
                    }

                    @Override
                    public void onArrival(Postcard postcard) {
    
    
                        //路由到达后调用(注意这里是所有拦截器执行完之后才会调用)
                        String group = postcard.getGroup();
                        String path = postcard.getPath();
                        LogUtils.i("ARouter拦截器", "onArrival ------>  group == " + group + "    " + "path == " + path);
                    }

                    @Override
                    public void onLost(Postcard postcard) {
    
    
                        //路由被丢失时调用
                        LogUtils.i("ARouter拦截器", "onLost");
                    }

                    @Override
                    public void onInterrupt(Postcard postcard) {
    
    
                        //路由被拦截时调用
                        LogUtils.i("ARouter拦截器", "onInterrupt");

                    }

                });

結論:これがARouterの使用方法です。現在クレイジーラーニング中。志を同じくする、または私と一緒に勉強したい場合は、QQグループ209010674を追加してください。また、来年のアクセス向上に向けて準備を進めています。それもあなたに役立つなら、私に好きを与えて、私を励ましてください。

おすすめ

転載: blog.csdn.net/leol_2/article/details/100700079
おすすめ