支持给Activity定义 URL,这样可以通过 URL 跳转到Activity,支持在浏览器以及 app 中跳入。
请根据项目的历史情况选择合适的集成方式
dependencies {
compile 'com.github.mzule.activityrouter:activityrouter:1.2.2'
annotationProcessor 'com.github.mzule.activityrouter:compiler:1.1.7'
}根目录 build.gradle
buildscript {
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}项目 app/build.gradle
apply plugin: 'android-apt' dependencies { compile 'com.github.mzule.activityrouter:activityrouter:1.2.2' apt 'com.github.mzule.activityrouter:compiler:1.1.7' }
在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://main和mzule://root都可以访问到同一个Activity
@Router("main")
上面的配置,可以通过mzule://main?color=0xff878798&name=you+are+best来传递参数,在MainActivity#onCreate中通过getIntent().getStringExtra("name")的方式来获取参数,所有的参数默认为String类型,但是可以通过配置指定参数类型,后面会介绍。
@Router("main/:color")
通过:color的方式定义参数,参数名为color,访问mzule://main/0xff878798,可以在MainActivity#onCreate通过getIntent().getStringExtra("color")获取到 color 的值0xff878798
@Router("user/:userId/:topicId/:commentId") @Router("user/:userId/topic/:topicId/comment/:commentId")
上面两种方式都是被支持的,分别定义了三个参数,userId,topicId,commentId
@Router(value = "main/:color", intParams = "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")
public class App extends Application implements RouterCallbackProvider { @Override public RouterCallback provideRouterCallback() { return new SimpleRouterCallback() { @Override public boolean beforeOpen(Context context, Uri uri) { context.startActivity(new Intent(context, LaunchActivity.class)); // 是否拦截,true 拦截,false 不拦截 return false; } @Override public void afterOpen(Context context, Uri uri) { } @Override public void notFound(Context context, Uri uri) { context.startActivity(new Intent(context, NotFoundActivity.class)); } @Override public void error(Context context, Uri uri, Throwable e) { context.startActivity(ErrorStackActivity.makeIntent(context, uri, e)); } }; } }
在Application中实现RouterCallbackProvider接口,通过provideRouterCallback()方法提供RouterCallback,具体 API 如上。
@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/main和mzule://main都可以映射到同一个 Activity,值得注意的是,在@Router中声明http协议地址时,需要写全称。
@Router(value = "item", longParams = "id", transfer = "id=>itemId")
这里通过transfer = "id=>itemId"的方式,设定了 url 中名称为id的参数会被改名成itemId放到参数Bundle中,类型为long. 值得注意的是,这里,通过longParams = "id"或者longParams = "itemId"都可以设置参数类型为long.
Routers.open(context, "mzule://main/0xff878798") Routers.open(context, Uri.parse("mzule://main/0xff878798")) Routers.openForResult(activity, "mzule://main/0xff878798", REQUEST_CODE); Routers.openForResult(activity, Uri.parse("mzule://main/0xff878798"), REQUEST_CODE); // 获取 Intent Intent intent = Routers.resolve(context, "mzule://main/0xff878798")
通过Routers.open(Context, String)或者Routers.open(Context, Uri)可以直接在应用内打开对应的 Activity,不去要经过 RouterActivity 跳转,效率更高。
getIntent().getStringExtra(Routers.KEY_RAW_URL);
@Router("logout") public static void logout(Context context, Bundle bundle) { }
在任意参数为 Context 和 Bundle 的静态公共方法上, 通过 @Router 标记即可定义方法的 url. @Router 使用方式与上述一致。
- 每个包含 activity 的 module 都要添加 apt 依赖
- 每个 module(包含主项目) 都要添加一个 @Module(name) 的注解在任意类上面,name 是项目的名称
- 主项目要添加一个 @Modules({name0, name1, name2}) 的注解,指定所有的 module 名称集合
-keep class com.github.mzule.activityrouter.router.** { *; }
Apache License 2.0
任何相关问题都可以通过以下方式联系我。
- 提 issue
- qq:158096757
- 微信:sbtjfdn
- 邮件 sbtjfdn@hotmail.com