电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android路由框架ARouter的使用示例

瀏覽:8日期:2022-09-18 08:29:25
目錄一、添加依賴和初始化框架1、添加依賴1.1、java版本的依賴1.2、kotlin版本的依賴2、初始化SDK二、ARouter的簡單使用1、界面跳轉1.1、Activity界面跳轉1.2、獲取fragment實例1.3、注意事項2、攜帶基本參數的界面跳轉3、攜帶對象的界面跳轉3.1、攜帶序列化對象的界面跳轉3.2、攜帶無序列化對象的界面跳轉3.3、攜帶集合和數組的界面跳轉4、界面跳轉回調5、未用到的知識點一、添加依賴和初始化框架1、添加依賴

在需要使用ARouter的module中添加如下代碼:

1.1、java版本的依賴

android { defaultConfig {...javaCompileOptions { annotationProcessorOptions {arguments = [moduleName :project.getName() ] } } }}dependencies { api ’com.alibaba:arouter-api:1.5.1’ annotationProcessor ’com.alibaba:arouter-compiler:1.5.1’}1.2、kotlin版本的依賴

plugins { ... id ’kotlin-kapt’}dependencies { ... implementation ’com.alibaba:arouter-api:1.5.1’ kapt ’com.alibaba:arouter-compiler:1.5.1’}

題外話: implementation 和 api 關鍵字,在Android studio3.0版本中,曾經的 compile 關鍵字被棄用,而 api 則是 compile 的替代品, api 與 compile 沒有區別。但最新官方推薦使用 implementation 來代替 compile 關鍵字,據說 implementation 會使Android studio的編譯速度更快呦。

而 implementation 和 api 關鍵字的區別則在于用 implementation 來聲明的依賴包只限于當前module內部使用,對于依賴其module的模塊是無法使用到該依賴包的。而用 api 來聲明依賴包時,依賴于該module的模塊可以正常使用其模塊內的依賴包。

在這里,由于我是將其放入一個公共的module,來讓app module進行依賴,因此使用 api 關鍵字。若沒有對項目進行組件化,則可以使用 implementation 關鍵字進行依賴。

2、初始化SDK

//初始化ARouter框架private boolean isDebugARouter = true;//ARouter調試開關if (isDebugARouter) { //下面兩行必須寫在init之前,否則這些配置在init中將無效 ARouter.openLog(); //開啟調試模式(如果在InstantRun模式下運行,必須開啟調試模式! // 線上版本需要關閉,否則有安全風險) ARouter.openDebug();}//官方推薦放到Application中初始化ARouter.init((Application) mContext);二、ARouter的簡單使用1、界面跳轉1.1、Activity界面跳轉

目標Activity添加注釋(跳轉語句,路由路徑建議寫成常量,創建路由表進行統一管理。)

@Route(path = '/app/login')public class LoginActivity extends AppCompatActivity {

發送Activity實現跳轉到

ARouter.getInstance().build('/app/login').navigation();1.2、獲取fragment實例

//目標界面@Route(path = '/app/fragment')public class EmptyFragment extends BaseFragment {}//啟動界面Fragment fragment= (Fragment) ARouter.getInstance().build('/app/fragment').navigation();FragmentManager manager = getSupportFragmentManager();FragmentTransaction transaction = manager.beginTransaction();transaction.add(R.id.fl_fragment_content, fragment);transaction.commit();1.3、注意事項

如果像我一樣對項目進行了組件化的同學就會發現,此時跳轉并沒有成功,而是彈出錯誤提示。

Android路由框架ARouter的使用示例

這是因為組件化后,即時我們使用了 api 作為依賴的關鍵字,但仍需在使用ARouter的其他module中配置代碼。這里一般習慣的做法是把arouter-api的依賴放在基礎服務的module里面,因為既然用到了組件化,那么肯定是所有的module都需要依賴arouter-api庫的,而arouter-compiler的依賴需要放到每一個module里面。

java

android { defaultConfig {...javaCompileOptions { annotationProcessorOptions {arguments = [moduleName :project.getName() ] } } }}dependencies { annotationProcessor ’com.alibaba:arouter-compiler:1.5.1’}

kotlin

plugins { ... id ’kotlin-kapt’}dependencies { ... kapt ’com.alibaba:arouter-compiler:1.5.1’}

否則無法匹配路由,并且在使用withObject方法攜帶對象時也會報錯,這個后面再說,再試一次發現界面成功跳轉。關于注釋 @Route 的 path 參數,也需要注意規范,必須要以“/”開頭,并且路徑至少為兩級,不然會編譯不通過或者報錯。

Android路由框架ARouter的使用示例

意思是路徑必須以“/”開頭,并且包含的值超過2個“/”。

2、攜帶基本參數的界面跳轉

使用方法如下,傳入鍵值對

Bundle bundle = new Bundle();bundle.putString('bundleStringKey', 'bundleStringValue');ARouter.getInstance().build('/app/login') .withString('stringKey', 'stringValue') .withInt('intKey', 100) .withBoolean('booleanKey', true) .withBundle('bundle', bundle) .navigation();

目標界面使用 @Autowired 注解進行注入

@Route(path = '/app/login')public class LoginActivity extends AppCompatActivity { @Autowired String stringKey; @Autowired int intKey; @Autowired boolean booleanKey; @Autowired Bundle bundle; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);//注入ARouterARouter.getInstance().inject(this);Log.e(TAG, stringKey + '...' + intKey + '...' + booleanKey);Log.e(TAG, bundle.getString('bundleStringKey')); }}

注意:注入的屬性名要和之前攜帶的key值完全相同,并且要在需要注入的界面通過ARouter.getInstance().inject(this)注入ARouter,否則無法注入成功。建議將ARouter.getInstance().inject(this)操作放在BaseActivity的onCreate方法中進行。既然有注入,就一定有資源的釋放,因此釋放資源在Application中進行。

@Override public void onTerminate() {super.onTerminate();ARouter.getInstance().destroy(); }

如果釋放資源放在BaseActivity的onDestroy方法中調用了 ARouter.getInstance().destroy( ) ; 在進入目標Activity之后,然后按back鍵返回原界面的時候,APP會報錯崩潰,下面是崩潰日志:

Android路由框架ARouter的使用示例

3、攜帶對象的界面跳轉3.1、攜帶序列化對象的界面跳轉

攜帶 Serializable 和 Parcelable 序列化的對象

TestSerializableBean serializableBean = new TestSerializableBean();serializableBean.setName('serializable');TestParcelableBean parcelableBean = new TestParcelableBean();parcelableBean.setName('parcelable');ARouter.getInstance().build('/app/login').withParcelable('parcelableBean', parcelableBean).withSerializable('serializableBean', serializableBean).navigation();

目標界面

@AutowiredTestParcelableBean parcelableBean;@AutowiredTestSerializableBean serializableBean;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);Log.e(TAG, parcelableBean + '');Log.e(TAG, serializableBean + '');}

Android路由框架ARouter的使用示例

我們發現Serializable序列化的對象為null,我們查看withSerializable方法發現其被裝進了Bundle

public Postcard withSerializable(@Nullable String key, @Nullable Serializable value) {mBundle.putSerializable(key, value);return this; }

因此換一種方法來取值,發現打印成功

TestSerializableBean serializableBean = (TestSerializableBean) getIntent().getExtras().getSerializable('serializableBean');Log.e(TAG, serializableBean + '');

Android路由框架ARouter的使用示例

3.2、攜帶無序列化對象的界面跳轉

沒有進行過序列化的對象也可以通過withObject對象進行傳遞,接收方式相同

NormalTest normalTest = new NormalTest();normalTest.setName('normal');ARouter.getInstance().build('/app/login').withObject('normalTest', normalTest).navigation();

但是我們直接使用該方法運行會報錯,分析源碼發現該方法中用到了SerializationService

public Postcard withObject(@Nullable String key, @Nullable Object value) {serializationService = ARouter.getInstance().navigation(SerializationService.class);mBundle.putString(key, serializationService.object2Json(value));return this; }

因此我們需要實現該服務

@Route(path = '/service/json')public class JsonServiceImpl implements SerializationService { private Gson gson; @Override public <T> T json2Object(String input, Class<T> clazz) {return gson.fromJson(input, clazz); } @Override public String object2Json(Object instance) {return gson.toJson(instance); } @Override public <T> T parseObject(String input, Type clazz) {return gson.fromJson(input, clazz); } @Override public void init(Context context) {gson = new Gson(); }}

我們可以在里面定義所需的json解析器,再次運行成功打印該對象。那序列化的對象可以使用該方法傳遞嗎?

TestParcelableBean objParcelableBean = new TestParcelableBean();objParcelableBean.setName('objParcelable');TestSerializableBean objSerializableBean = new TestSerializableBean();objSerializableBean.setName('objSerializable');NormalTest normalTest = new NormalTest();normalTest.setName('normal');ARouter.getInstance().build('/app/login').withObject('objParcelableBean', objParcelableBean).withObject('objSerializableBean', objSerializableBean).withObject('normalTest', normalTest).navigation();//目標界面@Autowired(name = 'objParcelableBean')TestParcelableBean objParcelableBean;@Autowired(name = 'objSerializableBean')TestSerializableBean objSerializableBean;@Autowired(name = 'normalTest')NormalTest normalTest;Log.e(TAG, objParcelableBean + '');Log.e(TAG, objSerializableBean + '');Log.e(TAG, normalTest + '');

Android路由框架ARouter的使用示例

我們發現用 Parcelable 序列化的對象為空,分析build的編譯文件

@Override public void inject(Object target) { serializationService = ARouter.getInstance().navigation(SerializationService.class); LoginActivity substitute = (LoginActivity)target; substitute.objParcelableBean = substitute.getIntent().getParcelableExtra('objParcelableBean'); if (null != serializationService) { substitute.objSerializableBean = serializationService.parseObject(substitute.getIntent().getStringExtra('objSerializableBean'), new com.alibaba.android.arouter.facade.model.TypeWrapper<TestSerializableBean>(){}.getType()); } else { Log.e('ARouter::', 'You want automatic inject the field ’objSerializableBean’ in class ’LoginActivity’ , then you should implement ’SerializationService’ to support object auto inject!'); } if (null != serializationService) { substitute.normalTest = serializationService.parseObject(substitute.getIntent().getStringExtra('normalTest'), new com.alibaba.android.arouter.facade.model.TypeWrapper<NormalTest>(){}.getType()); } else { Log.e('ARouter::', 'You want automatic inject the field ’normalTest’ in class ’LoginActivity’ , then you should implement ’SerializationService’ to support object auto inject!'); } }

我們可以看到唯獨通過 Parcelable 方式序列化的對象沒有使用SerializationService進行解析,而是直接從Bundle去取,但我們并不是通過withParcelable方法去設置的值,因此取得的數據為null。

小結:因此,為了方便我們的操作,沒有序列化和使用 Serializable 序列化的對象使用 withObject 方法傳遞,使用 Parcelable 方式序列化的對象則采用 withParcelable 方法進行傳遞。

3.3、攜帶集合和數組的界面跳轉

集合和數組的界面跳轉統一使用 withObject 方法傳遞,并且能夠支持成員的各種序列化方式。

List<NormalTest> listNormal = new ArrayList<>(); listNormal.add(new NormalTest()); listNormal.add(new NormalTest()); List<TestSerializableBean> listSerializable = new ArrayList<>(); listSerializable.add(new TestSerializableBean()); listSerializable.add(new TestSerializableBean()); List<TestParcelableBean> listParcelable = new ArrayList<>(); listParcelable.add(new TestParcelableBean()); listParcelable.add(new TestParcelableBean()); Map<String, NormalTest> map = new HashMap<>(); map.put('1', new NormalTest()); map.put('2', new NormalTest()); ARouter.getInstance().build('/app/login') .withObject('listNormal', listNormal) .withObject('listSerializable',listSerializable) .withObject('listParcelable',listParcelable) .withObject('map', map) .navigation(); //目標界面 @Autowired List<NormalTest> listNormal; @Autowired List<TestSerializableBean> listSerializable; @Autowired List<TestParcelableBean> listParcelable; @Autowired Map<String, NormalTest> map; Log.e(TAG, listNormal + ''); Log.e(TAG, listSerializable + ''); Log.e(TAG, listParcelable + ''); Log.e(TAG, map + '');

Android路由框架ARouter的使用示例

4、界面跳轉回調

//啟動界面ARouter.getInstance().build('/app/login').navigation(MainActivity.this, REQUEST_CODE);@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_CODE&& resultCode == RESULT_CODE) { LogUtils.e(data.getStringExtra('data'));} }//目標界面Intent intent = new Intent();intent.putExtra('data', 'resultData');setResult(RESULT_CODE, intent);finish();5、未用到的知識點

由于項目中沒有用到ARouter攔截器、ARouter自定義分組,這兩塊知識點,所以就沒研究。

以上就是Android路由框架ARouter的使用示例的詳細內容,更多關于Android路由框架ARouter的使用的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 影合社-影视人的内容合作平台 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 餐饮加盟网_特色餐饮连锁加盟店-餐饮加盟官网 | 镀锌方管,无缝方管,伸缩套管,方矩管_山东重鑫致胜金属制品有限公司 | 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 真丝围巾|真丝丝巾|羊绒围巾|围巾品牌|浙江越缇围巾厂家定制 | 电机修理_二手电机专家-河北豫通机电设备有限公司(原石家庄冀华高压电机维修中心) | 厂房出租_厂房出售_产业园区招商_工业地产&nbsp;-&nbsp;中工招商网 | 仪器仪表网 - 永久免费的b2b电子商务平台| 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 临海涌泉蜜桔官网|涌泉蜜桔微商批发代理|涌泉蜜桔供应链|涌泉蜜桔一件代发 | 实体店商新零售|微赢|波后|波后合作|微赢集团 | 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | SMC-SMC电磁阀-日本SMC气缸-SMC气动元件展示网 | 减速机三参数组合探头|TSM803|壁挂式氧化锆分析仪探头-安徽鹏宸电气有限公司 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | 焊锡丝|焊锡条|无铅锡条|无铅锡丝|无铅焊锡线|低温锡膏-深圳市川崎锡业科技有限公司 | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | 学习安徽网| 纯化水设备-纯水设备-超纯水设备-[大鹏水处理]纯水设备一站式服务商-东莞市大鹏水处理科技有限公司 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 无负压供水设备,消防稳压供水设备-淄博创辉供水设备有限公司 | 真空上料机(一种真空输送机)-百科 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 超声波焊接机_超音波熔接机_超声波塑焊机十大品牌_塑料超声波焊接设备厂家 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 亚洲工业智能制造领域专业门户网站 - 亚洲自动化与机器人网 | 空气弹簧|橡胶气囊|橡胶空气弹簧-上海松夏减震器有限公司 | 企业VI设计_LOGO设计公司_品牌商标设计_【北京美研】 |