一、概述
在 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>
网友评论