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>
- 1. ActivityRouter
- ActivityRouter
- 组件化开发小帮手activityRouter
- 1.
- 1.
- 1.
- 1.
- 1.
- -1.#IND0 1.#qnan0
- 1.EdgeDetection_1.1.DeepEdge
- 1.#INF,-1.#IND,1.#INF000,-…
- 1.基本概念
- 1. Introduction
- 1.ShowWindow
- 1. Scope
- 1. 人员
- 1.method:
- 1. Foreword
- 34、第一个只出现一次的字符
- PartitionAssignor分析
- 【详细内容】GM8284DD:28位LVDS图像接收器
- windows dos命令配置JAVA环境变量
- spark设置本地运行模式
- 1. ActivityRouter
- hive UDF函数
- Linux系统设置 history 相关系统变量(包括显示时间、history条数)
- 01 Mybatis整合Spring 由于版本引起的BUG
- [置顶] 【重点推荐】iOS开发之芝麻信用SDK的超详细使用教程
- 【Java】ArrayList<String>转化为String数组问题
- App的启动过程(7)BufferQueue的申请分配
- SQL Server 最开始的知识
- vs 2013 error RC2108: expected numerical dialog constant