【寫框架】基於編譯時註解打造ActivityBus,一鍵傳值
首先感謝大家閱讀這篇文章
日常開發中,經常會遇到Activity和Activity,Activity和Fragment之間的傳值場景,通常,大家會這麼處理:
Activity和Activity之間傳值
首先在起始Activity進行存值操作
Intent intent = new Intent(activity, TargetActivity.class);
intent.putExtra("age", 35);
intent.putExtra("name", Jordan);
intent.putExtra("person", (Serializable) new Person());
activity.startActivity(intent)
activity.startActivityForResult(intent, 100)//如果需要返回值
然後在目標Activity取值操作
int age = getIntent().getIntExtra("age", 0);
String name = getIntent().getStringExtra("name", "");
Person person = (Person) getIntent().getSerializableExtra("person");
Activity和Fragment之間傳值
存資料
public static TargetFragment newInstance(int age,String name,Person person) {
TargetFragment target = new TargetFragment();
Bundle bundle = new Bundle();
bundle.putInt("age",age);
bundle.putString("String",position);
bundle.putSerializable("person",person);
target.setArguments(bundle);
return target;
}
取資料
int age= getArguments().getInt("age");
String name = getArguments().getString("name ");
Person person= (Person )getArguments().getSerializable("person");
是不是覺得很繁瑣,要寫這麼多模板程式碼,生命苦短,青春短暫。有強迫症的同學甚至會為每個傳值變數取個常量名字,如果有工具能自動生成這些模板程式碼,我們只用在目標Activity或者Fragment直接呼叫資料就好了。
咳咳咳,那麼就請大家來嘗試下實現這個需求的:
ActivityBus
ActivityBus基於編譯時註解開發,自動生成Activity或者Fragment代理類,代理類中封裝了以上的傳值和取值的程式碼,使用者只需在目標Activity或者Fragment中需要傳值的變數上新增註解就可以完成一鍵傳值。節省下來的時間至少可以讓我們在這炎炎夏日抽空喝杯涼開。
那麼我們就直接開搞吧
在Activity間傳值
第一步:新增註解
@RequestParam:在目標Activity的需要傳值的成員變數上新增該註解。
@ActivityBus:如果你需要呼叫startActivityForResult(),在目標Activity 上新增該註解,並設定requestCode。
@ActivityBus(requestCode = 100)
public class TargetActivity extends AppCompatActivity {
@RequestParam
public int age;
@RequestParam
public String name;
@RequestParam
public Person person;
...
}
第二步:傳遞資料
編譯以後,ActivityBus會自動生成代理類,如TargetActivityBus,名稱格式為【目標Actiity】+Bus,就是說,把你的Activty變成了一輛公交車,可以帶客了,乘客就是你要傳輸的資料。之後呼叫代理類的goActivity()傳入所需的資料即可。
public class MainActivity extends AppCompatActivity {
...
TargetActivityBus.goActivity(this,1,"Hello",new Person("Entity"));
...
}
第三步:在目標Activity中進行註冊
在目標Activity中呼叫register(),相當於告訴公交車,我要到這來。乘客到這站就可以下車了。接下來你就可以對乘客do anything了。
@ActivityBus(requestCode = 100)
public class TargetActivity extends AppCompatActivity {
@RequestParam
public int age;
@RequestParam
public String name;
@RequestParam
public Person person;
...
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
...
TargetActivityBus.register(this);
tv_name.setText("My name is"+name);
}
...
}
Activty和Fragment間傳值
在Fragment中使用更簡單,只需要兩步。
第一步:新增註解
public class TargetFragment extends Fragment {
@RequestParam
public int aInt;
@RequestParam
public String aString;
...
}
第二步:傳遞資料
呼叫Fragment代理類的newInstance()方法進行傳值。
public class MainActivity extends AppCompatActivity {
...
TargetFragment targetFragment = TargetFragmentBus.newInstance(1,"Hello");
getSupportFragmentManager().beginTransaction().add(R.id.fl_fragment, targetFragment).commit();
...
}
支援傳值的資料型別
支援傳值的資料型別基本包括了日常開發的大部分資料型別,其中 List
,Set
,Map
也是同樣簡單的一鍵傳值。實體型別需要實現Serializable介面。
- Base type :
boolean
,byte
,char
,short
,int
,long
,float
,double
,String
- Base array type :
boolean[]
,byte[]
,char[]
,short[]
,int[]
,long[]
,float[]
,double[]
,String[]
- Container :
List
,Set
,Map
- Serializable : 實現Serializable介面的所有實體
結尾
ActivityBus只適用模組內或者依賴模組間的顯示呼叫,並不具備模組化元件間呼叫的能力。不過夠用就行。如果對你有幫助,可以點個star支援下。具體的使用,請點Github傳送。
相關文章
- Android編譯時註解框架系列1-什麼是編譯時註解Android編譯框架
- 基於 java 註解的 csv 檔案讀寫框架Java框架
- 重走JAVA之路(一):覆盤ButterKnife-編譯時註解Java編譯
- 執行時框架,編譯時框架框架編譯
- 如何編寫一個前端框架之五-基於 ES6 代理的資料繫結(譯)前端框架
- 981. 基於時間的鍵值儲存
- 981-基於時間的鍵值儲存
- 如何編寫一個前端框架之一-專案結構(譯)前端框架
- 基於 Blazor 打造一款實時字幕Blazor
- 如何編寫一個前端框架之六-自定義元素(譯)前端框架
- 基於AOP的MVP框架(三)GoMVP進階註解MVP框架Go
- 基於AOP的MVP框架(二)GoMVP進階註解MVP框架Go
- 基於Axon框架使用Kotlin編寫的ES銀行案例框架Kotlin
- 一個基於Java的介面快速開發框架!無需編寫程式碼,透過UI介面編寫介面!Java框架UI
- OfficialKaldi(一)| 關於Kaldi專案(翻譯註解)
- 基於SpringBoot 、AOP與自定義註解轉義字典值Spring Boot
- 基於spring boot框架進行二次封裝,微型框架編寫思路Spring Boot框架封裝
- 如何編寫一個前端框架之七-客戶端路由(譯)前端框架客戶端路由
- 編寫高效能React元件-傳值篇React元件
- 基於netty手寫RPC框架NettyRPC框架
- 如何編寫一個前端框架之三-程式碼執行沙箱(譯)前端框架
- 記一次 寫 CentOS 下 lnmp 一鍵編譯指令碼的經歷CentOSLNMP編譯指令碼
- KCommon-使用Kotlin編寫,基於MVP的極速開發框架KotlinMVP框架
- 【翻譯】編寫程式碼註釋的最佳實踐
- 基於Netty4手把手實現一個帶註冊中心和註解的Dubbo框架Netty框架
- 如何編寫一個前端框架之四-資料繫結簡介(譯)前端框架
- 想自己寫框架?不會寫Java註解可不行框架Java
- 基於註解的6.0許可權動態請求框架——JPermission框架
- 基於nodejs編寫小爬蟲NodeJS爬蟲
- Java註解解析-基礎+執行時註解(RUNTIME)Java
- 編寫註冊介面
- 在使用make編譯時,修改原始檔的註釋內容,是否會重新編譯?編譯
- 用 vue 寫小程式,基於 mpvue 框架重寫 weuiVue框架UI
- 基於Koa2打造屬於自己的MVC框架MVC框架
- 關於Gradle編譯時下載依賴失敗解決方法Gradle編譯
- Flutter-一行註解直接編譯生成資源配置檔案Flutter編譯
- 關於值傳遞和引用傳遞的解釋
- Spring基於註解的aop配置Spring
- SpringBoot基於註解方式配置FilterSpring BootFilter