android AutoBundle 像Retrofit一樣構(gòu)建Bundle

前言

android.os.Bundle 相信每一個(gè)Android 開(kāi)發(fā)者都在使用,構(gòu)建bundle和獲取其中value時(shí)如果參數(shù)很多寫起來(lái)代碼很呆板,多次調(diào)用的話 key值容易寫錯(cuò),不易管理,AutoBundle的產(chǎn)生就是為了解決這些問(wèn)題。AutoBundle采用動(dòng)態(tài)代理的方式創(chuàng)建Bundle,采用編譯時(shí)注解的方式為屬性賦值。

使用

  1. 成員屬性 和 方法參數(shù) 注解解析
  2. 創(chuàng)建單例
  3. Activity中如何使用
  4. 定義接口方法
  5. 動(dòng)態(tài)代理創(chuàng)建Bundle

1. 注解

In your class which has state from Bundle
(Activity, BroadcastReceiver, Service, Fragment or others),

@Box

在接口方法的參數(shù)上添加此注解 自動(dòng)方法的值put進(jìn)bundle

@Unbox

在Activity、Fragment 或者任意類中的成員屬性添加此注解,自動(dòng)獲取其值

@Required

如果添加此注解,當(dāng)接口方法傳入或從Bundle中獲取的值為null時(shí)會(huì)crash

@BundleFlag

用于標(biāo)記創(chuàng)建Bundle的接口方法,可以在回調(diào)函數(shù)中通過(guò)判斷此注解的value做二次修改替換等

2. 創(chuàng)建單例

 
 AutoBundle.builder().debug(true)//allow print debug message
                //check all create method before use
                .validateEagerly(true)
                .addOnBundleListener(new OnBundleListener() {
                    /**
                     * @param flag  flag is @BundFlag value
                     */
                    @Override
                    public void onBundling(int flag, String key, @Nullable Object value, boolean required) {
                        Log.e("print", "key:" + key + " flag:" + flag);
                    }

                    @Override
                    public void onCompleted(int flag, @NonNull Bundle bundle) {
                        Log.e("print", bundle.toString());
                        //replace or add
                        // for example
                        if (flag = xxx) {
                            bundle.put("xxx", xxx);
                        }
                    }
                })
                .installDefault();

3.Activity 中使用

public class MyActivity extends Activity {
    // field must not be private/protected.
    @Required
    @Unbox("loginName")
    String loginName;
    @Required
    @Unbox("password")
    String password;

    @Unbox("int")
    int intValue;

    @Unbox("string")
    String stringValue;

    @Unbox("intArray")
    int[] intArrayValue;

    @Unbox("stringArray")
    String[] stringArrayValue;

    @Unbox("parcelable")
    Parcelable ParcelableValue;

    @Unbox("parcelableArray")
    Parcelable[] parcelableArrayValue;

    @Unbox("sparseParcelableArray")
    SparseArray<? extends Parcelable> sparseParcelableArrayValue;

    @Unbox("stringArrayList")
    List<String> stringArrayListValue;

    @Unbox("parcelableArrayList")
    List<? extends Parcelable> parcelableArrayListValue;

    @Unbox("serializable")
    Serializable serializableValue;
}
如何給屬性自動(dòng)賦值
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //auto bind the field from bundle
        AutoBundle.getDefault().bind(this);
    }

4.像Retrofit創(chuàng)建Call一樣創(chuàng)建Bundle

public interface BundleService {
    @BundleFlag(0)
    Bundle getLogin(@Required @Box("loginName") String loginName,
                    @Required @Box("password") String password);

    @BundleFlag(1)
    Bundle getInt(@Box("int") int value);

    @BundleFlag(2)
    Bundle getString(@Box("string") String value);

    @BundleFlag(3)
    Bundle getIntArray(@Box("intArray") int[] value);

    Bundle getStringArray(@Box("stringArray") String[] value);

    Bundle getParcelable(@Box("parcelable") Parcelable value);

    Bundle getParcelableArray(@Box("parcelableArray") Parcelable[] value);

    Bundle getSparseParcelableArray(@Box("sparseParcelableArray")
                                            SparseArray<? extends Parcelable> value);

    Bundle getStringArrayList(@Box("stringArrayList") ArrayList<String> value);

    Bundle getParcelableArrayList(@Box("parcelableArrayList") ArrayList<? extends Parcelable> value);

    Bundle getSerializable(@Box("serializable") Serializable value);
}

5.接口方法調(diào)用創(chuàng)建Bundle

//second step: you can crate Bundle like retrofit
   Bundle loginBundle = AutoBundle.getDefault()
                .create(BundleService.class)
                .getDefault("JackWharton","123456");

  Bundle intBundle = AutoBundle.getDefault()
                .create(BundleService.class)
                .getInt(1228);



In target class, Call binding method in onCreate.

  • bind(Object target, Bundle bundle)
  • bind(Activity target) (equals to bind(activity, activity.getIntent().getExtras()))

Download

dependencies {
    implementation 'com.xcheng:autobundle-api:1.2.3'
    annotationProcessor 'com.xcheng:autobundle-compiler:1.2.3'
}

GitHub 地址: AutoBundle

Thanks

License

Copyright 2019 xchengDroid

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容