github

mzule / ActivityRouter

  • понедельник, 11 апреля 2016 г. в 03:11:32
https://github.com/mzule/ActivityRouter

Java
Router activities.



ActivityRouter

English README.md here

功能

支持给Activity定义URL,这样可以通过URL跳转到Activity,支持在浏览器以及app中跳入。

image

image

集成

根目录build.gradle

buildscript {
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7'
  }
}

项目app/build.gradle

apply plugin: 'android-apt'

dependencies {
    compile 'com.github.mzule.activityrouter:activityrouter:1.1.1'
    apt 'com.github.mzule.activityrouter:compiler:1.1.1'
}

AndroidManifest.xml配置

<activity
    android:name="com.github.mzule.activityrouter.router.RouterActivity"
    android:theme="@android:style/Theme.NoDisplay">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="mzule" /><!--改成自己的scheme-->
    </intent-filter>
</activity>

在需要配置的Activity上添加注解

@Router("main")
public class MainActivity extends Activity {
    ...
}

这样就可以通过mzule://main来打开MainActivity了。

进阶

支持配置多个地址

@Router({"main", "root"})

mzule://mainmzule://root都可以访问到同一个Activity

支持获取url中?传递的参数

@Router("main")

上面的配置,可以通过mzule://main?color=0xff878798&name=you+are+best来传递参数,在MainActivity#onCreate中通过getIntent().getStringExtra("name")的方式来获取参数,所有的参数默认为String类型,但是可以通过配置指定参数类型,后面会介绍。

支持在path中定义参数

@Router("main/:color")

通过:color的方式定义参数,参数名为color,访问mzule://main/0xff878798,可以在MainActivity#onCreate通过getIntent().getStringExtra("color")获取到color的值0xff878798

支持多级path参数

@Router("user/:userId/:topicId/:commentId")

@Router("user/:userId/topic/:topicId/comment/:commentId")

上面两种方式都是被支持的,分别定义了三个参数,userId,topicId,commentId

支持指定参数类型

@Router(value = "main/:color", intExtra = "color")

这样指定了参数color的类型为int,在MainActivity#onCreate获取color可以通过getIntent().getIntExtra("color", 0)来获取。支持的参数类型有int,long,short,byte,char,float,double,boolean,默认不指定则为String类型。

支持优先适配

@Router("user/:userId")
public class UserActivity extends Activity {
    ...
}

@Router("user/statistics")
public class UserStatisticsActivity extends Activity {
    ...
}

假设有上面两个配置,

不支持优先适配的情况下,mzule://user/statistics可能会适配到@Router("user/:userId"),并且userId=statistics

支持优先适配,意味着,mzule://user/statistics会直接适配到@Router("user/statistics"),不会适配前一个@Router("user/:userId")

支持Callback

public class App extends Application implements RouterCallbackProvider {
    @Override
    public RouterCallback provideRouterCallback() {
        return new SimpleRouterCallback() {
            @Override
            public void beforeOpen(Context context, Uri uri) {
                context.startActivity(new Intent(context, LaunchActivity.class));
            }

            @Override
            public void afterOpen(Context context, Uri uri) {
            }

            @Override
            public void notFound(Context context, Uri uri) {
                context.startActivity(new Intent(context, NotFoundActivity.class));
            }
        };
    }
}

Application中实现RouterCallbackProvider接口,通过provideRouterCallback()方法提供RouterCallback,具体API如上。

支持Http(s)协议

@Router({"http://mzule.com/main", "main"})

AndroidManifest.xml

<activity
    android:name="com.github.mzule.activityrouter.router.RouterActivity"
    android:theme="@android:style/Theme.NoDisplay">
    ...
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" android:host="mzule.com" />
    </intent-filter>
</activity>

这样,http://mzule.com/mainmzule://main都可以映射到同一个Activity,值得注意的是,在@Router中声明http协议地址时,需要写全称。

支持参数transfer

@Router(value = "item", longExtra = "id", transfer = "id=>itemId")

这里通过transfer = "id=>itemId"的方式,设定了url中名称为id的参数会被改名成itemId放到参数Bundle中,类型为long. 值得注意的是,这里,通过longExtra = "id"或者longExtra = "itemId"都可以设置参数类型为long.

支持应用内调用

Routers.open(context, "mzule://main/0xff878798")
Routers.open(context, Uri.parse("mzule://main/0xff878798"))

通过Routers.open(Context, String)或者Routers.open(Context, Uri)可以直接在应用内打开对应的Activity,不去要经过RouterActivity跳转,效率更高。

混淆配置

-keep class com.github.mzule.activityrouter.router.** { *; }