1. ActivityRouter

来源:互联网 发布:软件代码编写招聘 编辑:程序博客网 时间:2024/05/20 13:14

一、综述

在 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>
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 格力空调显示e1怎么办 ae崩溃了没保存怎么办 电脑下面的状态栏没了怎么办 游戏32位不兼容怎么办 电脑开机dos红屏怎么办 win7进入dos红屏怎么办 手机玩游戏屏幕卡住不动怎么办 魔域英文版换中文版怎么办 党员培养期不足一年怎么办 出生证明日期错了怎么办 毕业生登记表写错了怎么办 高等学校毕业生登记表写错了怎么办 眼睛里迷了东西怎么办 眼睛迷了怎么办小绝招 isf货物离港申报怎么办 非农户口没住房怎么办 在工厂上班很累怎么办 退货运费太贵了怎么办 悬肘写字手抖怎么办 护士成绩合格证明丢了怎么办 找工作真难找好烦怎么办 大夫说身体不适合怀孕有了怎么办 不知道要做什么工作怎么办 红米note4x闪退怎么办 魅蓝note3闪退怎么办 红米note2闪退怎么办 安卓不支持计步怎么办 银行多扣了钱怎么办 网络配置器没了怎么办 班里丢钱了应该怎么办 初级会计考过了怎么办 教师职称证丢了怎么办 会计初级证丢了怎么办 工作遭同事不满否认质疑怎么办 单位领导不让进收入财务怎么办 事业单位50岁不愿退休的怎么办 回美国i20丢了怎么办 i20忘签字美国入境怎么办 社保基数报错了怎么办 公司合同没给我怎么办 给客户报错价格怎么办