{"id":15032524,"url":"https://github.com/easyandroidgroup/easyandroid","last_synced_at":"2025-04-12T17:43:11.442Z","repository":{"id":91825588,"uuid":"132259597","full_name":"easyandroidgroup/EasyAndroid","owner":"easyandroidgroup","description":"一系列简单、轻量、方便的Android开发工具集合(持续更新中),包括Android动态权限、SharedPreferences、反射、日志、Toast、Bundle、MVP、线程池、Html、图文混排、蒙层引导、拍照、图库选择等","archived":false,"fork":false,"pushed_at":"2020-09-24T08:20:50.000Z","size":679,"stargazers_count":1177,"open_issues_count":8,"forks_count":193,"subscribers_count":24,"default_branch":"master","last_synced_at":"2025-04-03T19:15:54.238Z","etag":null,"topics":["activityresult","android","bundle","dimensions","executor","guide","html","imagegetter","kotlin","log","mvp","permissions","photos","reflection","sharedpreferences","toast"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/easyandroidgroup.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-05-05T15:20:20.000Z","updated_at":"2025-03-17T08:50:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"a5ed8e4d-9fb6-4eda-9905-ee9d69eaf2fe","html_url":"https://github.com/easyandroidgroup/EasyAndroid","commit_stats":{"total_commits":196,"total_committers":2,"mean_commits":98.0,"dds":0.0714285714285714,"last_synced_commit":"a041668c2b1ba8638aa0bb716074e70660bcaf3d"},"previous_names":[],"tags_count":57,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easyandroidgroup%2FEasyAndroid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easyandroidgroup%2FEasyAndroid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easyandroidgroup%2FEasyAndroid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easyandroidgroup%2FEasyAndroid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/easyandroidgroup","download_url":"https://codeload.github.com/easyandroidgroup/EasyAndroid/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248608653,"owners_count":21132755,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["activityresult","android","bundle","dimensions","executor","guide","html","imagegetter","kotlin","log","mvp","permissions","photos","reflection","sharedpreferences","toast"],"created_at":"2024-09-24T20:18:38.708Z","updated_at":"2025-04-12T17:43:11.418Z","avatar_url":"https://github.com/easyandroidgroup.png","language":"Kotlin","readme":"# EasyAndroid [![](https://jitpack.io/v/yjfnypeu/EasyAndroid.svg)](https://jitpack.io/#yjfnypeu/EasyAndroid)\n\n在平时的开发过程中，我们经常会需要使用到一些基础功能组件，比如Toast,比如Log等。\n\n而这些功能组件，在开发时需要使用到的功能点其实相当有限，所以这也意味着，我们对此类组件的要求是：**简单、轻量、易用**！相对应的，此类组件的封装库，也应该尽量实现得**轻巧精练**\n\n**EasyAndroid**即是专门针对此种需求所设计的一款`基础组件集成库`\n\n### 宗旨\n\n#### 1. 设计独立\n\u003e 组件间独立存在，不相互依赖，且若只需要集成库中的部分组件。也可以很方便的`只copy对应的组件文件`进行使用\n\n#### 2. 设计轻巧\n\n\u003e 因为是组件集成库，所以要求每个组件的设计尽量精练、轻巧。避免因为一个小功能而引入大量无用代码.\n\u003e\n\u003e 每个组件的方法数均`不超过100`. 大部分组件方法数甚至`不超过50`。\n\n### 添加依赖\n\n1. 添加jitpack仓库依赖\n\n```\nmaven { url 'https://jitpack.io' }\n```\n\n2. 添加依赖\n\nlastest_version = [![](https://jitpack.io/v/yjfnypeu/EasyAndroid.svg)](https://jitpack.io/#yjfnypeu/EasyAndroid)\n\n```\nimplementation \"com.github.yjfnypeu:EasyAndroid:$lastest_version\"\n```\n\n3. 初始化\n\n在Application中调用初识化方法：\n\n```\nEasyAndroid.init(application)\n```\n\n然后即可直接使用\n\n### Attention!!!\n\n由于此为`轻量组件集成库`, 所以框架中包含了多个`独立`的应用组件提供使用。\n\n但是有的时候，如果你只需要使用框架中的少数或者`个别的组件`。可以直接`copy对应的组件源码文件`到工程中去直接使用。\n\n请注意：大部分组件均是完全独立存在的。直接copy源文件即可正常使用。\n\n而部分组件会需要依赖EasyAndroid类。去获取可用的`Application Context`实例进行使用。对于这部分的组件。\n替换内部`EasyAndroid.getApplicationContext()`为你们项目自身的application context即可。\n\n### 目录索引\n\n- [EasyGuideLayer](#easyguidelayer): 界面蒙层引导组件\n- [EasySharedPreferences](#easysharedpreferences): SharedPreferences存取组件\n- [EasyDimension](#easydimension): 尺寸转换组件\n- [EasyFormatter](#easyformatter): 数据格式化排版组件\n- [EasyLog](#easylog): 日志打印组件\n- [EasyToast](#easytoast): Toast通知组件\n- [EasyReflect](#easyreflect): 反射操作组件\n- [EasyActivityResult](#easyactivityresult): onActivityResult解耦组件\n- [EasyPermissions](#easypermissions): 动态权限申请组件\n- [EasyExecutor](#easyexecutor): 线程池封装组件\n- [EasyBundle](#easybundle): Bundle数据存取组件\n- [EasyMedia](#EasyMedia): 从拍照、图库进行图片选择组件。\n- [EasyImageGetter](#easyimagegetter): TextView加载html标签时，提供`img`标签的图片加载功能\n- [MVP](#mvp): 简单MVP架构\n\n### [EasyGuideLayer](./docs/EasyGuideLayer.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyGuideLayer.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyGuideLayer.kt)\n\n- 链式调用。调用逻辑清晰直观\n- 支持同时设置多个引导层\n- 支持高亮区域的自定义绘制\n- 支持高亮区域点击监听\n- 支持指定任意View设置蒙层引导\n- 支持进行蒙层展示、隐藏事件监听\n\n使用示例：\n\n```\n// 创建引导层示例，并为引导层添加指定配置\nval item = GuideItem.newInstance(view, padding)\n    .setLayout(guideLayout)// 设置引导View\n    .setGravity(Gravity.LEFT)// 设置引导View位置\n    .setOffsetProvider(provider)// 设置用于进行引导View的位置调整\n    .setHighLightShape(GuideItem.SHAPE_RECT)// 设置高亮区域绘制模式\n    .setOnViewAttachedListener(listener)// 设置引导View被添加到蒙层布局中时的通知监听\n    .setOnDrawHighLightCallback(callback)// 这是自定义高亮块绘制回调\n    .setOnHighLightClickListener(listener)// 设置高亮点击回调监听\n\n\n// 创建蒙层实例并绑定引导层，进行展示：\nEasyGuideLayer.with(activity)\n    .setBackgroundColor(color)// 蒙层背景色\n    .setOnGuideShownListener(lambda)// 蒙层展示、消失监听\n    .addItem(item)// 绑定引导层实例\n    .setDismissOnClickOutside(false)// 设置点击到蒙层上的非点击区域时，是否自动让蒙层消失\n    .setDismissIfNoItems(true)// 设置当蒙层中一个引导层实例都没绑定时，自动让蒙层消失\n    .show()// 展示蒙层\n```\n\n### [EasyImageGetter](./docs/EasyImageGetter.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyImageGetter.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyImageGetter.kt)\n\n- 支持设置`placeholde`图片加载时占位图\n- 支持设置`error`图片加载失败时的占位图\n- 支持指定uri进行加载。不仅仅局限于网络图片。还包括加载本地图片、assets图片等。\n- 支持自定义加载器：满足各种加载需求。\n\n用户实例：\n\n```\n// 提供html文本数据\nprivate val html =\n\"\"\"\n\u003ch5\u003easset图片加载示例\u003c/h5\u003e\n\u003cimg src=\"file:///android_asset/imagegetter/cat.png\"\u003e\n\u003ch5\u003ehttp图片加载示例\u003c/h5\u003e\n\u003cimg src=\"http://www.w3school.com.cn/i/eg_tulip.jpg\"\u003e\n\"\"\".trimIndent()\n\n// 提供展示的TextView控件\nprivate val textView:TextView = getTextView()\n\nEasyImageGetter.create()\n    // 设置图片加载时的占位图\n    .setPlaceHolder(R.drawable.placeholder)\n    // 设置图片加载失败时的占位图\n    .setError(R.drawable.error)\n    // 指定加载的html与tv控件即可\n    .loadHtml(html, textView)\n\n```\n\n### [EasyMedia](./docs/EasyPhoto.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyPhoto.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyMedia.kt)\n\n\u003e 从图库或者使用相机拍照获取图片的组件。\n\n贡献者：[Vicent9920](https://github.com/Vicent9920)\n\n- 支持链式调用\n- 支持图片输出到指定地址\n- 支持任意线程选择进行图片选择\n\n用户实例：\n\n```\nval photo = EasyMedia()// 创建EasyMedia实例\n    // 是否需要进行裁剪\n    .setCrop(true|false)\n    // 指定创建的图片地址。\n    .setImgPath(imgPath:String)\n\n// 通过设置回调，获取选择到的文件\nphoto.setCallback { file:File -\u003e\n    // TODO 使用选择的文件进行操作\n}\n\n// 当然。不排除出现非预期的问题。所以也提供了错误回调\nphoto.setError { error:Exception -\u003e\n    // TODO\n}\n\n// 跳转拍照并获取图片\nphoto.takePhoto(activity)\n\n// 或者跳转图库进行图片选择\nphoto.selectPhoto(activity)\n```\n\n### [EasySharedPreferences](./docs/EasySharedPreferences.md)\n\n\u003e [点我查看完整使用文档](./docs/EasySharedPreferences.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasySharedPreferences.kt)\n\n\u003e 使用一个具体的实体类，进行SharedPreferences数据存取\n\n- 通过具体的实体类进行SP数据存储操作。避免`key值硬编码`\n- 自动同步，即使别的地方是`直接使用SharedPreferences进行赋值`，也能自动同步相关数据。\n- 打破SharedPreferences限制。支持几乎任意类型数据存取\n\n用法示例：\n\n```\n// 以SharedPreferences文件名为user_info，存储数据为username, age, address为例\n\n// 1. 创建映射实体类\n@PreferenceRename(\"user_info\")\nclass User:PreferenceSupport() {\n    var username:String\n    var age:Int\n    var address:String\n}\n\n// 2. 进行读取\nval user = EasySharedPreferences.load(User::class.java)\n\n// 3. 进行修改\n\n// 直接使用load出来的user实例进行数值修改\nuser.age = 16\nuser.username = \"haoge\"\n\n// 修改完毕后，apply更新修改到SharedPreferences文件。\nuser.apply()\n```\n\n### [EasyDimension](./docs/EasyDimension.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyDimension.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyDimension.kt)\n\n\u003e 用于灵活的进行设备尺寸单位转换\n\u003e \n\u003e 支持全尺寸数值转换。\n\n用法示例\n\n```\n// 转换10dp到px\nEasyDimension.withDIP(10).toPX()\n// 转换30sp到MM\nEasyDimension.withSP(30).toMM()\n```\n\n### [EasyFormatter](./docs/EasyFormatter.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyFormatter.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyFormatter.kt)\n\n\u003e 用于对任意类型数据，进行格式化输出排版，结合log打印组件使用，使log输出展示更清晰\n\n- 支持对`Set/List/Map/JSON/POJO`数据进行格式化排版\n- 支持最高长度过滤：避免打印超长数据时造成版面浪费\n\n用法示例：\n\n```\n// 创建待格式化数据\nval any:Any = create()\n// 使用formatter实例进行格式化\nval result:String = EasyFormatter.DEFAULT.format(any)\n```\n\n### [EasyLog](./docs/EasyLog.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyLog.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyLog.kt)\n\n\u003e 用于简单的进行日志打印输出，支持格式化输出、自定义打印格式。\n\n- 不阻塞：打印任务运行于独立线程中，避免大量打印数据时造成UI阻塞。\n- 安全: 对打印任务做好了异常处理。不用担心出现crash问题\n- 使用EasyFormatter对任意数据进行格式化排版\n- 支持添加自定义规则\n- 灵活、直观的进行输出样式定制\n- 自动适配TAG. 也可手动指定。\n- 使用开关。关闭线上包的日志输出。\n- 使用'上边界'逻辑进行栈帧匹配，支持二次封装使用\n\n用法示例：\n\n```\nval any:Any = create()// 创建待打印数据\nEasyLog.DEFAULT.d(any)// 使用默认log实例进行数据打印. 以Log.d()的方式进行输出\n```\n\n### [EasyToast](./docs/EasyToast.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyToast.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyToast.kt)\n\n\u003e 用于进行Toast提示，可很简单的指定输出样式。\n\n1. 支持在任意线程下进行toast提示\n2. 非常方便的进行任意样式的定制\n3. 不管当前是否正在展示之前的数据。有新消息通知时，直接展示新消息，无需等待\n\n博客地址：https://juejin.im/post/5b0638336fb9a07aa9261ce6\n\n用法示例：\n\n```\nval message:String = create()// 创建待提示数据\nEasyToast.DEFAULT.show(message)// 使用系统样式进行输出\nEasyToast.create(layoutID:Int, tvID:Int, duration:Int).show(message)// 使用自定义样式进行输出\n```\n\n### [EasyReflect](./docs/EasyReflect.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyReflect.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyReflect.kt)\n\n\u003e 对常规的反射操作进行封装。达到更便于使用反射的效果\n\n博客地址：https://juejin.im/post/5b1de20c6fb9a01e701000cb\n\n用法示例：\n\n```\n// 以类名Test为例\nclass Test private constructor(private val name:String) {\n    private fun wrap(name:String):String = \"包裹后的数据$name\"\n}\n\n// 创建Reflect实例：\nvar reflect = EasyReflect.create(Test::class.java).instance(\"默认参数\")\n\n// 为name字段赋值：\nreflect.setField(\"name\", \"EasyReflect\")\n// 读取name字段的值：\"EasyReflect\"\nval value = reflect.getValue(\"name\")\n\n// 调用方法wrap方法，并传入参数value\nreflect.call(\"wrap\", value)\n// 调用wrap方法，并获取返回值: \"包裹后的数据EasyReflect\"\nval result = reflect.callWithReturn(\"wrap\", value).get\u003cString\u003e()\n```\n\n### [EasyActivityResult](./docs/EasyActivityResult.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyActivityResult.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyActivityResult.kt)\n\n\u003e用于解决onActivityResult业务逻辑臃肿的问题\n\n- **业务解耦分离**: 各自启动业务线处理各自的回调逻辑\n- **去除requestCode**: 进行启动时自动生成随机的requestCode, 不用再为每个启动任务分别配置请求码了。\n- **防暴击**: 防止快速点击时启动多个重复页面\n\n博客地址：https://juejin.im/post/5b21d019e51d4506d93701ba\n\n用法示例：\n\n```\nEasyActivityResult.startActivity(activity, Intent(activity, DemoActivity::class.java),\n        { resultCode:Int, data:Intent? -\u003e\n            // 直接在此进行返回数据处理\n        })\n```\n\n### [EasyPermissions](./docs/EasyPermissions.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyPermissions.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyPermissions.kt)\n\n\u003e 进行6.0+的动态权限请求\n\n- 链式调用\n- 支持定制权限申请说明弹窗\n- 支持同时申请多个权限\n- 多权限申请时进行去重与空过滤\n- 自动使用顶层Activity执行权限请求\n- 支持在任意线程进行权限申请\n- 当有默认拒绝的权限时，提示用户前往权限设置页。手动开启权限\n\n博客地址：https://juejin.im/post/5b1a2a326fb9a01e5d32f208\n\n用法示例：\n\n```\nEasyPermissions.create(// 指定待申请权限\n    Manifest.permission.WRITE_EXTERNAL_STORAGE,\n    Manifest.permission.WRITE_CALENDAR,\n    Manifest.permission.WRITE_CONTACTS\n    )\n    // 定制权限申请说明弹窗\n    .rational { permission, chain -\u003e\n        AlertDialog.Builder(this)\n                .setTitle(\"权限申请说明\")\n                .setMessage(\"应用需要此权限：\\n$permission\")\n                .setNegativeButton(\"拒绝\", {_, _ -\u003e chain.cancel() })\n                .setPositiveButton(\"同意\", {_, _ -\u003e chain.process() })\n                .show()\n\n        return@rational true\n    }\n    // 设置授权结果回调\n    .callback { grant -\u003e\n        EasyToast.DEFAULT.show(\"权限申请${if (grant) \"成功\" else \"失败\"}\")\n    }\n    // 当权限被默认拒绝时。调起弹窗提醒需要用户去主动开启权限\n    .alwaysDenyNotifier(object : PermissionAlwaysDenyNotifier() {\n        AlertDialog.Builder(activity)\n                .setTitle(\"权限申请提醒\")\n                .setMessage(\"以下部分权限已被默认拒绝，请前往设置页将其打开:\\n\\n\")\n                .setPositiveButton(\"确定\", { _, _ -\u003e  goSetting(activity)})\n                .setNegativeButton(\"取消\", {_,_ -\u003e cancel(activity)})\n                .show()\n    })\n    // 发起请求\n    .request()\n```\n\n### [EasyExecutor](./docs/EasyExecutor.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyExecutor.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyExecutor.kt)\n\n\u003e 用于进行`安全`、`高效`、`便利`的线程池操作功能组件\n\n- **安全**: 直接catch住任务执行期间出现的异常。并通知给用户，避免出现crash\n- **回调通知**: 执行任务期间，有分别的生命周期作为通知。\n- **配置灵活**: 可方便、灵活的对每次所启动的任务，配置线程名、回调等。\n- **任务延迟**: 支持在每次启动任务前。指定延迟时间\n- **异步任务**: 支持直接启动异步任务并回调传递数据\n- **线程切换**: 支持指定回调方法所在的线程。默认为运行于UI线程中\n\n用法示例\n\n```\n// 1. 第一步：创建示例\nval executor =\n    // size为所需创建的线程池的大小。当size \u003c= 0时。\n    // 表示需要使用newCachedThreadPool。\n    EasyExecutor.newBuilder(size)\n            .setName(name)// 默认的线程名\n            .setPriority(priority)// 线程池中创建线程的优先级\n            .onStart {threadName -\u003e } // 默认任务启动时的回调\n            .onSuccess {threadName -\u003e }// 默认任务执行完毕后的回调\n            .onError {threadName, throwable -\u003e }// 默认任务执行出现异常时的回调\n            .setDeliver(deliver)// 默认的回调任务派发器。用于将信息派发到指定线程去。\n            .build()// 最后。执行创建\n\n// 2. 第二步：启动任务\nexecutor.execute(runnable:Runnable)// 启动普通任务\n\n// 启动异步回调任务\nexecutor.asyncResult(result:(T) -\u003e Unit) // 先配置任务回调\n    .asyncTask(task:(Notifier) -\u003e T)// 配置后台执行任务\n\nexecutor.setDelay(delay).execute(runnable)// 延时启动任务\n```\n\n### [EasyBundle](./docs/EasyBundle.md)\n\n\u003e [点我查看完整使用文档](./docs/EasyBundle.md)\n\n\u003e [点击下载组件源码文件进行使用](https://raw.githubusercontent.com/yjfnypeu/EasyAndroid/master/utils/src/main/java/com/haoge/easyandroid/easy/EasyBundle.kt)\n\n\u003e 用于使Bundle数据存取操作变得`简单`、`方便`、`灵活`、`强大`\n\n1. 简化Bundle数据存取api：\n2. 打破Bundle数据格式限制。支持对非可序列化对象进行存取。\n3. 支持注入操作。在进行页面跳转传值时。将会非常好用。\n\n博客地址：https://juejin.im/post/5b2c65bde51d45587d2dd86f\n\n用法示例：\n\n```\n// 1. 存储任意数据对象到bundle中去\nEasyBundle.create(bundle)// 绑定bundle容器\n    .put(key, value)// 指定任意数据进行存储。包括非可序列化对象\n\n// 2. 从bundle中读取并自动转换为具体对象数据\nEasyBundle.create(bundle).get\u003cUser\u003e(\"user\")\n\n// 3. 支持数据自动注入\nclass ExampleActivity:BaseActivity() {\n    // 从intent中读取name数据并注入到name字段中去\n    @BundleField\n    var name:String? = null\n}\n```\n\n### [MVP](./docs/MVP.md)\n\n\u003e [点我查看完整使用文档](./docs/MVP.md)\n\n博客地址：https://juejin.im/post/5b4ee27ff265da0f98314f01\n\n\u003e 提供的一种简单的MVP分层架构实现。\n\n- 支持单页面绑定多个Presenter进行使用\n- 支持P层进行生命周期派发\n\n用法示例\n\n```\n// 1. 创建页面通信协议接口：\ninterface CustomView:MVPView {\n    // 定义通信协议方法：P层将使用此方法驱动V层进行界面更新\n    fun updateUI()\n}\n\n// 2. 创建Presenter。并与对应的通信协议相绑定：\nclass CustomPresenter(view:CustomView):MVPPresenter(view) {\n    // 直接创建对应的启动方法，供V层进行启动调用\n    fun requestData() {\n        // TODO 进行数据业务处理。并在处理完成后，通过view通知到V层\n    }\n}\n\n// 3. 创建具体的V层(Activity or Fragment),并绑定Presenter进行使用：\nclass CustomActivity:BaseMVPActivity, CustomView {\n\n    // 创建presenter并绑定。可创建多个persenter使用\n    val persenter = CustomPresenter(this)\n    override fun createPresenters() = arrayOf(presenter)\n    override fun updateUI() {// TODO 进行界面更新}\n\n    fun initPage() {\n        // 通过绑定的Presenter发起任务\n        presenter?.requestData()\n    }\n}\n```\n\n## 混淆配置\n\n部分组件需要进行混淆配置。请注意别遗漏了：\n\n```\n# EasyBundle\n-keepclasseswithmembernames class * {\n    @com.haoge.easyandroid.easy.BundleField \u003cfields\u003e;\n}\n\n# EasySharedPreferences\n-keep class * implements com.haoge.easyandroid.easy.PreferenceSupport { *; }\n```\n\n## 联系作者\n\n\u003ca target=\"_blank\" href=\"http://shang.qq.com/wpa/qunwpa?idkey=99e758d20823a18049a06131b6d1b2722878720a437b4690e238bce43aceb5e1\"\u003e\u003cimg border=\"0\" src=\"http://pub.idqqimg.com/wpa/images/group.png\" alt=\"安卓交流会所\" title=\"安卓交流会所\"\u003e\u003c/a\u003e\n\n或者手动加入QQ群: 108895031\n\n## License\n\n[apache license 2.0](http://choosealicense.com/licenses/apache/)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feasyandroidgroup%2Feasyandroid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feasyandroidgroup%2Feasyandroid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feasyandroidgroup%2Feasyandroid/lists"}