2日目のARouterの紹介と使用

公式の指示

公式ウェブサイト
https://github.com/alibaba/ARouter/blob/master/README_CN.md
アリババが独自に開発したルーティングフレームワーク。主にコンポーネントとモジュール間のインターフェイスジャンプの問題を解決します。

典型的なアプリケーション

  1. 外部URLから内部ページへのマッピング、およびパラメーターの受け渡しと解析
  2. モジュール間のページジャンプ、モジュール間のデカップリング
  3. ジャンププロセスをインターセプトし、ログイン、ポイントの埋め込みなどのロジックを処理します。
  4. クロスモジュールAPI呼び出し、制御の反転によるコンポーネントの分離

基本機能

1、依存関係と構成を追加します

android {
    defaultConfig {
        ...
        //每一个用的build.都要加
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
}

構成

dependencies {
    
    
 
    implementation 'com.alibaba:arouter-api:1.5.1'
	annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'
    ...
}

注:構成が構成されていない場合に発生するエラー

错误: ARouter::Compiler An exception is encountered, [These no module name, at 'build.gradle', like :

2SDKを初期化します

public class App extends Application {
    
    

    @Override
    public void onCreate() {
    
    
        super.onCreate();
        ARouter.openLog();     // 打印日志
        ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
        ARouter.init(this); // 尽可能早,推荐在Application中初始化
    }
}

マニフェストファイルにname属性設定します。

2、コメント構成パスを追加します(パラメーターなし)

注釈の追加(注釈の追加)
ターゲットページを追加して@Route注釈
パス:テンプレートページパス、パス
グループの3つ以上のレベルでスラッシュで開始する必要があります:ページグループ、デフォルトは名前としてのモジュール名です

// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/Xxx_module/XxxActivity")
public class XxxActivity extend Activity {
    ...
}

/**
 * 配置路径
 */
@Route( path = "/shop/main2")
public class Main2Activity extends AppCompatActivity {

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

ジャンプページ(ルーティングを開始します)

//Activity跳转
ARouter.getInstance().build("/Xxx_module/XxxActivity").navigation();
//Fragment引入
Fragment fragment = (Fragment) ARouter.getInstance().build("/Xxx_module/XxxFragment").navigation();

3.ジャンプしてパラメータを運ぶ

ルーティングを開始する
Jumpwith parametersパラメーターはwithXXX()メソッドによって実行され、対応するデータ型パラメーターを伝達します。
特別な指示:withObject()を直接使用することはできません。使用方法を参照してください。以下を参照してください。

ARouter.getInstance().build("/test/1")
            .withString("key3", "888")
            .navigation();

3.1オブジェクトを使用したパラメーターの実行(パラメーターを使用してルーティングジャンプを開始する)
ページがジャンプしてカスタムオブジェクトパラメーターを渡す場合、シリアル番号サービスを作成する必要があります。
すごい-。-パブリックシリアル化サービスを作成する方法。ツールクラスとして一度作成するだけで済みます。
1. ARouterインターフェースSerializationServiceを実装します
。2。対応するメソッドの実装を完了するために、JSONまたはGSONを使用してメソッドを実装し、オブジェクトと文字列を変換できます。

@Route(path = "/service/gson")
public class GosnServiceImp implements SerializationService {
    
    
    private Gson gson;
    @Override
    public <T> T json2Object(String input, Class<T> clazz) {
    
    
        return gson.fromJson(input, clazz);
    }
    @Override
    public String object2Json(Object instance) {
    
    
        return gson.toJson(instance);
    }
    @Override
    public <T> T parseObject(String input, Type clazz) {
    
    
        return gson.fromJson(input, clazz);
    }
    @Override
    public void init(Context context) {
    
    
        gson = new Gson();
    }
}

4.パラメータの受信


@Route(path = "/app/main3")
public class Main3Activity extends AppCompatActivity {
    
    
    @Autowired
    String key3;    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        //注入
        ARouter.getInstance().inject(this);
        Toast.makeText(this, key3, Toast.LENGTH_SHORT).show();
    }
}

5コンポーネント間をジャンプする

ARouter.getInstance()。build( "/ news / main")。navigation();
linkメソッドは同じです。
ジャンプするモジュールのみを現在のプロジェクトにライブラリに追加する必要があります。
計算管理を使用する場合は、直接ジャンプできます。
そうでない場合は、ライブラリを手動で追加します。


calcesを使用して管理する場合、マニフェストファイルがマージされるため、同じクラス名との競合が発生することに注意してください。

6オブジェクトの配信

ARouter.getInstance().build("/app/main3")
                .withString("key3", "888")
                .withObject("test",new Test("hehe","haha")) //对象
                .navigation();

6.1は主にインターフェースを実装するためのものです


@Route(path = "/transerver/gson")
public class JSonBean implements SerializationService {
    
    
    private Gson gson;

    @Override
    public <T> T json2Object(String input, Class<T> clazz) {
    
    
        return gson.fromJson(input,clazz);
    }

    @Override
    public String object2Json(Object instance) {
    
    
        return gson.toJson(instance);
    }

    @Override
    public <T> T parseObject(String input, Type clazz) {
    
    
        return gson.fromJson(input,clazz);
    }

    @Override
    public void init(Context context) {
    
    
        gson = new Gson();
    }
}

このインターフェースのパスは任意です。その主な目的は、文字列とオブジェクトを相互に直接変換することです。
これは、ロジックを実装するためのフレームワークを提供します。たとえば、GsonまたはFastJsonを使用できます。

7、ルーティングを使用してフラグメントを動的に追加します

フラグメントを作成する

@Route(path = "/fragment/blank")
public class BlankFragment extends Fragment {
    
    
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
    
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }
}

ルートルックアップを使用する

 public void btn3(View view) {
    
    

        Fragment fragment = (Fragment) ARouter.getInstance().build("/fragment/blank").navigation();

       getSupportFragmentManager().beginTransaction().add(R.id.ll,fragment).commit();

8インターセプターの実装

// 比较经典的应用就是在跳转过程中处理登陆事件,这样就不需要在目标页重复做登陆检查
// 拦截器会在跳转之间执行,多个拦截器会按优先级顺序依次执行
@Interceptor(priority = 8, name = "测试用拦截器")
public class TestInterceptor implements IInterceptor {
    
    
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
    
    
    ...
    callback.onContinue(postcard);  // 处理完成,交还控制权
    // callback.onInterrupt(new RuntimeException("我觉得有点异常"));      // 觉得有问题,中断路由流程

    // 以上两种至少需要调用其中一种,否则不会继续路由
    }

    @Override
    public void init(Context context) {
    
    
    // 拦截器的初始化,会在sdk初始化的时候调用该方法,仅会调用一次
    }
}

応用:

ARouter.getInstance().build("/news/main").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) {
    
    
                runOnUiThread(new Runnable() {
    
    
                    @Override
                    public void run() {
    
    
                        Toast.makeText(MainActivity.this, "拦截了", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

ARouterとCalcesを組み合わせる

特記事項:

引き続きcalcesを使用してプロジェクトを実行すると、Main2Activityファイルが見つからない可能性があります。
これは2か所で変更する必要があります。1つはです。

app {
    
    
            applicationName '.App'
            modules ':news',':shop'
        }

スタートアップにアプリを追加します。これはARouterの初期化に使用されます。もう
1つは、マニフェストファイルにMain2Activityがない場合、プロジェクトディレクトリの下のsrcフォルダーの下にあるマニフェストファイルに追加する必要があります。カルスのファイル。

プロジェクトをモジュールに変える

1)アプリにbuild.gradleを入れます

プラグインを適用します:「com.android.application」は
次のように置き換えられます

プラグインを適用します: 'com.android.library'
2)build.gradleファイルのapplicationIdを確認します

3)アプリは2つのプログラムエントリを持つことができないため、アプリのAndroidManifestファイルでMainActivityをコメントアウトします。そうしないと、デスクトップに2つのアイコンが表示されます。

4)モジュールをインポートして、このモジュールを他のプロジェクトにインポートします

アプリ自体もモジュールから変更する必要があります

apply plugin: 'calces.modules'
appConfig {
    
    

    //调试开关,控制所有app能不能独立运行
    debugEnable true

    apps {
    
    

        //把app也改成moudle .然后id和name都不能少.
        //可以少name 报错看看
        app {
    
    
            applicationId "com.fenghongzhang.feng2"
            applicationName ".App"
            modules ':shop'
        }
    }

    //所有组件
    modules {
    
    
        //注意事项:
        //如果设定了applicationId 则要原来的applicationId删除相关 否则报错
		//isRunAlone 必须是false 才能跳转.因为false就是moudle了
        shop {
    
    
            name ':shop'
            applicationId "com.fenghongzhang.shop"
            mainActivity ".MainActivity"
            isRunAlone true
        }
    }
}

おすすめ

転載: blog.csdn.net/shuai_ge_feng/article/details/108586984