ActivityRouter路由框架:通过注解实现URL打开Activity

通过注解方式来实现URL打开Activity功能,并支持在WebView和外部浏览器使用,支持多级Activity跳转,支持Bundle、Uri参数注入并转换参数类型。

特点

  1. 支持注解方式、手动方式注册Activity。
  2. 支持注入Bundle、Uri的参数并转换格式。
  3. 支持多级跳转。
  4. 支持外部浏览器打开。
  5. 支持HTTP协议。
  6. 支持目标Activity的URL构造器访问。

项目地址

[图片上传失败...(image-9abb02-1525053844418)]

https://github.com/joyrun/ActivityRouter

简单例子

@RouterActivity("second")
public class SecondActivity extends Activity {
    @RouterField("uid")
    private int uid;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Routers.inject(this);
        Log.e("uid", String.valueOf(uid));
    }
}
Routers.init("joyrun");//设置Scheme
// 方式一
RoutersHelper.getSecondActivityHelper().withUid(24).start(this);
// 方式二
Routers.startActivity(context, "joyrun://second?uid=233");
// 方式三
// 如果AndroidManifest.xml注册了RouterCenterActivity,也可以通过下面的方式打开,如果是APP内部使用,不建议使用。
// startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("joyrun://second?uid=233")));

目标Activity的URL构造器访问

使用URL访问有一个缺点就是难以得以目标Activity所需要的参数,同时也需要手工生成URL,使用并不友好,填写的参数名称也容易出错。所以我们就做了一个用于生成目标Activity的URL构造器,减少我们写参数名的代码。会根据注解了RouterField的成员变量生成构造器。

// Routers.startActivity(context, "joyrun://second?uid=233&name=Wiki");
RoutersHelper.getSecondActivityHelper().withUid(233).withName("Wiki").start(this);
// Routers.startActivityForResult(context, "joyrun://second?uid=233&name=Wiki",1);
RoutersHelper.getSecondActivityHelper().withUid(233).withName("Wiki").startForResult(this,1);

多级跳转

@RouterActivity("third")
public class ThirdActivity extends BaseActivity {
    @RouterField("uid")
    private int uid;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
        Routers.inject(this);
        Log.e("uid", String.valueOf(uid));
    }
}
// 先打开SecondActivity,再打开ThirdActivity
Routers.startActivity(context, "joyrun://second/third?uid=233");

Bundle、Uri参数注入(支持单独使用)

Routers.inject(this)方法可以单独使用,可以实现注入Bundle、Uri的参数,由于Uri的参数是String类型,所以该框架还支持把String格式的类型转换为目标类型。目前该方法支持double、float、int、boolean、String数据类型。

// Bundle
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("uid", "233");
startActivity(intent);
// Uri
Intent intent = new Intent(this, SecondActivity.class);
intent.setData(Uri.parse("joyrun://second?uid=233"));
startActivity(intent);
// Bundle、Uri
Intent intent = new Intent(this, SecondActivity.class);
intent.setData(Uri.parse("joyrun://second?uid=233"));
intent.putExtra("name", "Wiki");
startActivity(intent);
@RouterActivity("second")
public class SecondActivity extends Activity {
    @RouterField("uid")
    private int uid;
    @RouterField("name")
    private String name;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Routers.inject(this);
        Log.e("uid", String.valueOf(uid));
        Log.e("name", String.valueOf(name));
    }
}

从外部浏览器、其它APP打开

只要在AndroidManifest.xml注册了RouterCenterActivity,即可变成经典的Uri打开,可以支持外部浏览器、其它APP打开内部的Activity。

<activity android:name="com.thejoyrun.router.RouterCenterActivity">
    <intent-filter>
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="joyrun" />
    </intent-filter>
</activity>
// Java代码调用
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("joyrun://second?uid=233&name=Wiki")));
// HTML方式,系统浏览器(不支持微信)
<a href="joyrun://second?uid=233&name=Wiki">打开JoyrunApp的SecondActivity</a>

支持HTTP协议

<activity android:name="com.thejoyrun.router.RouterCenterActivity">
    <intent-filter>
        <category android:name="android.intent.category.DEFAULT" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:host="www.thejoyrun.com" android:scheme="http" />
        <data android:scheme="joyrun" />
    </intent-filter>
</activity>

如果支持HTTP协议,那么URL的结构就要做些修改

// joyrun://second?uid=233
// =>
http://www.thejoyrun.com/second?uid=233

使用方式

配置根目录的build.gradle

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

配置app module的build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    compile 'com.github.joyrun.ActivityRouter:router:0.3.1'
    apt 'com.github.joyrun.ActivityRouter:router-compiler:0.3.1'
}

初始化

建议在Application进行初始化

// 必填,填写独特的scheme,避免和其它APP重复
Routers.init("joyrun");
// 可选,如果需要支持HTTP协议就需要填写
Routers.setHttpHost("www.thejoyrun.com");
// 可选,手工注册Activity
Routers.register(new ActivityRouteTableInitializer() {
    @Override
    public void initRouterTable(Map<String, Class<? extends Activity>> router) {
        router.put("second2", SecondActivity.class);
        router.put("other://www.thejoyrun.com/second", SecondActivity.class);
    }
});
// 可选,针对自己的业务做调整
Routers.setFilter(new Filter() {
    public String doFilter(String url) {
        //return url.replace("joyrun://www.thejoyrun.com/","joyrun://");
        return url;
    }
});

配置AndroidManifest

如果需要从外部浏览器打开,就要注册

<activity android:name="com.thejoyrun.router.RouterCenterActivity">
    <intent-filter>
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <action android:name="android.intent.action.VIEW" />
        <data android:host="www.thejoyrun.com" android:scheme="http" />
        <data android:scheme="joyrun" />
    </intent-filter>
</activity>

其它说明

多对一映射

一个Activity支持配置多个路径,也支持完整的URL配置

@RouterActivity({"second", "second2", "other2://www.thejoyrun.com/second", "joyrun://www.thejoyrun.com/second"})
public class SecondActivity extends Activity {}

手工注册Activity

手工注册,也支持路径注册,也支持完整路径注册,支持多种scheme

Routers.register(new ActivityRouteTableInitializer() {
    @Override
    public void initRouterTable(Map<String, Class<? extends Activity>> router) {
        router.put("second2", SecondActivity.class);
        router.put("other://www.thejoyrun.com/second", SecondActivity.class);
    }
});

URL过滤器

通过URL过滤器可以对URL进行过滤,可以通过过滤器对URL进行修改,也可以拦截URL,不让路由器打开。

Routers.setFilter(new Filter() {
    public String doFilter(String url) {
        //return url.replace("joyrun://www.thejoyrun.com/","joyrun://");
        return url;
    }
});
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,638评论 18 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,377评论 0 17
  • 2.1 Activity 2.1.1 Activity的生命周期全面分析 典型情况下的生命周期:在用户参与的情况下...
    AndroidMaster阅读 3,031评论 0 8
  • 1.什么是Activity?问的不太多,说点有深度的 四大组件之一,一般的,一个用户交互界面对应一个activit...
    JoonyLee阅读 5,729评论 2 51
  • 文/十月云 大学寝室的姐妹 一米七五 高高在上 沉着大气 幽默开朗 狮子座的女王 做事利落又豪爽 有件事情 让我至...
    十月云阅读 771评论 17 49