Androidのページジャンプは通常、インテントでコンポーネント名を直接指定することで行われますが、複数のモジュールが開発されている場合、この方法では各モジュールの結合が深刻になり、コードが煩雑になり、モジュールを完全に分離する目的を達成できません。ページジャンプ、つまりページルーティングを完了するには、暗黙的インテントを使用する必要があります。ARouterはAndroidルーティングソリューションです。
使い方は簡単
1.依存関係と構成を追加する
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
...
}
// 旧版本gradle插件(< 2.2),可以使用apt插件,配置方法见文末'其他#4'
// Kotlin配置参考文末'其他#5'
2.注釈を追加する
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
3. SDKを初期化します
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
4.ルーティング操作を開始する
// 1. 应用内简单的跳转(通过URL跳转在'进阶用法'中)
ARouter.getInstance().build("/test/activity").navigation();
// 2. 跳转并携带参数
ARouter.getInstance().build("/test/1")
.withLong("key1", 666L)
.withString("key3", "888")
.withObject("key4", new Test("Jack", "Rose"))
.navigation();
カスタムオブジェクトを渡す場合は、jsonのシリアル化と逆シリアル化を実装する必要があることに注意してください。
@Route(path = "/service/json")
public class JsonServiceImpl implements SerializationService {
@Override
public void init(Context context) {
}
@Override
public <T> T json2Object(String text, Class<T> clazz) {
return JSON.parseObject(text, clazz);
}
@Override
public String object2Json(Object instance) {
return JSON.toJSONString(instance);
}
}
URLジャンプ
ARouterのページジャンプもuriジャンプをサポートしています。パスが正しい限り、ターゲットインターフェースにジャンプできます。そのため、インターフェースにジャンプするときに、次のようにジャンプすることもできます。
Uri uri = Uri.parse("arouter://m.aliyun.com/test/Main2Activity");
ARouter.getInstance().build(uri).navigation();
スキームとホストは、必要に応じて任意に指定できます。
これを使用する最も重要な方法は、WebページからAPPにジャンプするときです。
// 新建一个Activity用于监听Schame事件,之后直接把url传递给ARouter即可
public class SchameFilterActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri uri = getIntent().getData();
ARouter.getInstance().build(uri).navigation();
finish();
}
}
AndroidManifest.xml
<activity android:name=".activity.SchameFilterActivity">
<!-- Schame -->
<intent-filter>
<data
android:host="m.aliyun.com"
android:scheme="arouter"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
このようにして、WebページからAPPにジャンプするすべてのユーザーがSchameFilterActivityフィルターを通過し、その後、実際のアクティビティにジャンプします。
Webページのジャンプリンクは次のとおりです。
<a href="router://m.aliyun.com/test/Main2Activity">跳转</a>
Webページの背後にパラメーターを追加することもできます。
<a href="router://m.aliyun.com/test/Main2Activity?name=xuyu">跳转</a>
次に、以下の方法でパラメーターを初期化します。
@Route(path = "/test/Main2Activity")
public class Main2Activity extends AppCompatActivity
{
@Autowired
String name;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
ARouter.getInstance().inject(this);
Log.e("Main2Activity", name + "");
}
}
この方法で取得されたパラメーターは、URLを介して渡されるパラメーターであり、データによって伝達されるパラメーターであり、インテントによって直接伝達されるのではないことに注意してください。元の取得方法は次のとおりです。
getIntent().getData().getQueryParameter("name");
ただし、元のARouterジャンプで取得したデータは空になります。ジャンプURIは次のようにして取得できます。
getIntent().getStringExtra(ARouter.RAW_URI)
実際、ARouterはURIのストリングをバンドルを介して次のインターフェースに送信します。
ページのブロック
最初にインターセプターを定義します。
@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)
{
}
}
次に、アクティビティでインターセプターを指定します。
@Route(path = "/test/SecondActivity",priority = 8)
このようにして、このアクティビティにジャンプすると、ジャンプを続行するために転送するかどうかを決定するためにインターセプターによってインターセプトされます。
ARouter.getInstance().build("/test/SecondActivity").navigation(FirstActivity.this, new NavigationCallback()
{
@Override
public void onInterrupt(Postcard postcard)
{
Log.e("FirstActivity", "onInterrupt" + (postcard != null ? postcard.toString() : "null"));
}
});
インターセプターが処理するターゲットページで追加の情報を構成することもできます。たとえば、インターフェースでログインして携帯電話番号をバインドする必要がある場合は、次のように記述します。
//用二进制最低位判断是否登录,次高位判断是否绑定手机号
@Route(path = "/test/SecondActivity",priority = 8,extra=3)
次に、インターセプターで判断します。
//获取目标页面的extras,注意这里不可以使用postcard.getExtras()
//他是获取传到目标页面bundle信息的方法
int extra=postcard.getExtra()
if(((extra & 2) > 0) & ((extra & 1) > 0));
{
//目标界面需要登录且绑定手机号
}
if((extra & 2) > 0)
{
//目标界面仅需要绑定手机号(业务上不应该有这个状态)
}
if((extra & 1) > 0)
{
//目标界面需要仅登录
}
グループ管理
ARouterはページルーティングパスをグループで管理します。デフォルトでは、書き込むパスはグループ名です。たとえば、
@Route(path = "/test/SecondActivity")
グループ名はtestです。これは、グループ名が特定のパスの場合、パケット内の特定のパスに初めてアクセスしたときにのみ、パケットが初期化されます。
次のように手動でグループ化することもできます。
@Route(path = "/test/1", group = "app")
グループを作成した後、グループジャンプを指定する必要があります。
ARouter.getInstance().build("/test/1", "app").navigation();
ARouterは手動でグループを指定することを推奨しません。
注:ARouterでは、モジュールで複数のグループを使用できますが、複数のモジュールで同じグループを使用できないため、マッピングファイルで競合が発生します。