美文网首页
1. ActivityRouter

1. ActivityRouter

作者: 东方未曦 | 来源:发表于2017-06-01 14:41 被阅读1188次

一、概述

在 Android 开发中,我们打开页面的方式主要是 startActivity()。使用startActivity()的缺点是需要打开的那个 Activity 的类已经存在,否则无法通过编译,但是在协同开发中,这往往是无法得到满足的。那么如何来解决这一问题呢,我们是否也能够像在Web开放中一样使用一个url来打开一个Activity呢?
面对这种情况,我们可以使用 ActivityRouter 框架,它不仅仅局限于打开 Activity,打开 Activity 只是框架中的一种行为实现,框架包含了 Activity 以及其它比较常用的路由。并支持使用者自己添加自己的路由。
Github地址:ActivityRouter框架

二、集成

配置根目录 build.gradle

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'
        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.6.2'
    apt 'com.github.joyrun.ActivityRouter:router-compiler:0.6.2'
}

三、示例

1. Activity 跳转

首先我们做一个最简单的 Activity 跳转,看一下 ActivityRouter 是如何识别 Activity 以及如何携带参数的。

配置 Application

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Router.init("frames"); // 填写自己独特的 scheme,避免与其他 app 重复
    }
}

Activity 代码
在 MainActivity 中添加一个按钮用于跳转到另一个 Activity。
在 Activity 的最上方有一行注释@RouterActivity("main"),其中的 main 就是 Activity 的地址。我们可以通过这个地址,从别的 Activity 甚至是 WebView 跳转到这里。
RouterActivity 支持配置多个地址,比如这样:@RouterActivity({"main", "root"})

MainActivity 代码如下,我们在跳转时指定了路径,就是 FirstActivity 的路径 first,同时还加上了一个类似 get 请求的参数。

@RouterActivity("main")
public class MainActivity extends AppCompatActivity {

    private Button main_btn_1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Router.inject(this);

        main_btn_1 = (Button) findViewById(R.id.main_btn_1);

        setListener();
    }

    private void setListener() {
        main_btn_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Router.startActivity(MainActivity.this, "frames://first?uid=100");
            }
        });
    }
}

FirstActivity 代码如下,其中有一个 int 变量 uid,给这个变量加上定义@RouterField("uid")后,uid 就可以在跳转时接收到参数。
你可以通过getIntent().getStringExtra("name")来获取其他地方传入的参数。但我试了一下,不用这行代码也能获取到。

@RouterActivity("first")
public class FirstActivity extends AppCompatActivity {

    @RouterField("uid")
    private int uid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        Router.inject(this);

        Log.e("TAG", String.valueOf(uid));
    }
}

2. Bundle、Uri 参数注入

Router.inject(this)方法可以单独使用,可以实现注入Bundle、Uri的参数,由于Uri的参数是 String 类型,所以该框架还支持把 String 格式的类型转换为目标类型。目前该方法支持 double、float、int、boolean、String 数据类型。
也就是说,即使我们在跳转时使用 startActivity() 方法,也可以直接在目标 Activity 获取传入的 Bundle、Uri 参数。

新建 SecondActivity

@RouterActivity("second")
public class SecondActivity extends AppCompatActivity {

    @RouterField("uid")
    private int uid;
    @RouterField("name")
    private String name;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Router.inject(this);

        Log.e("TAG", String.valueOf(uid));
        Log.e("TAG", name);
    }
}

** MainActivity 增加一个跳转**

main_btn_2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        intent.setData(Uri.parse("frames://second?uid=666"));
        intent.putExtra("name", "Lister");
        startActivity(intent);
     }
});

3. 从浏览器打开 Activity

在 AndroidManifest.xml 文件中注册 RouterCenterActivity

<activity android:name="com.thejoyrun.router.RouterCenterActivity">
    <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="frames" />
    </intent-filter>
</activity>

通过 WebView 打开连接
在 MainActivity 中添加一个 WebView,让它加载存放在 assets 中的 html 文件。

main_web_view.loadUrl("file:///android_asset/a.html");
WebSettings wSet = main_web_view.getSettings();
wSet.setJavaScriptEnabled(true);

a.html 文件中只有一个超链接,通过它就可以打开 SecondActivity。

<a href="frames://second?uid=233&name=Wiki">打开SecondActivity</a>

相关文章

  • 1. ActivityRouter

    一、概述 在 Android 开发中,我们打开页面的方式主要是 startActivity()。使用startAc...

  • ActivityRouter源码解析

    ActivityRouter :https://github.com/mzule/ActivityRouter H...

  • ActivityRouter源码解析

    ActivityRouter :https://github.com/mzule/ActivityRouter H...

  • ARouter源码解析(一)

    arouter-api version : 1.4.1 前言 之前对 ActivityRouter 的源码做了一次...

  • Android组件化开发路由的设计

    调研了一下目前的路由框架,ARouter(阿里的),ActivityRouter都使用了apt技术 编译时注解,个...

  • 手把手实现一个超简单版本的 Activity 路由框架

    最初的时候,在学习路由框架时,发现了 ActivityRouter,但是这个项目只有代码实现和使用方法,缺少实现原...

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

    通过注解方式来实现URL打开Activity功能,并支持在WebView和外部浏览器使用,支持多级Activity...

  • 1.

    午间的太阳晒得尤其刺热,菜市场上的楼房也显得闷热无比。 保罗的余光瞄见一个老妇,老妇登着载满废食的三轮车,充满...

  • 1.

    “好了,校会到此结束,请各班有序带回,开始班会。” 正在台下打盹的白子含被后面的同学叫醒,“子含,校会结束了。”...

  • 1.

    最随和、最友好、最善解人意的人,往往是最受伤、最抑郁的人。

网友评论

      本文标题:1. ActivityRouter

      本文链接:https://www.haomeiwen.com/subject/snbsfxtx.html