ldlywt / AndroidAdvance

Android进阶之路:AOP切面编程、手写IOC框架、手写ImageLoad、手写OkHttp、手写EventBus、Hook技术、内存优化...

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

AndroidAdvanceDemo

不定时更新中...

Question:这个仓库有什么东西?

这个仓库都是一些手写的Android进阶框架,如:IOC框架、图片加载框架、网络请求框架等。

Question:为什么要弄这个仓库?

现在项目中网络请求用 Retrofit 或者 Okhttp,图片加载 Glide之类的,用了好几年,一直都处于使用阶段。 每次看源码看了好久,过一段时间就忘了,所以想自己动手把这些框架都写一遍。

Question:动手撸一遍框架有什么用?

工作大部分时间都是写业务代码,写久了都差不多,如果一直这样,时间再长也不可能晋升到高级工程师。 自己动手撸一遍框架可以提升自己的架构设计**、设计模式的熟练度,更轻松的阅读流行开源框架的源码, 简直就是好处多多。

PS:

这个仓库中很有多的代码非本人所写,我只是来收集用来学习,感谢网上各路大神的无私贡献。

库里面有什么东西

  • AOP编程
  • 手写IOC框架
  • 手写图片加载框架
  • 手写OkHttp框架
  • DialogFragment封装
  • Android全局异常捕获
  • 手写EventBus框架
  • 插件化和Hook技术
  • 待添加

AOP编程

  1. AOP编程检查权限是否开启
  2. AOP编程检查网络状态是否可用
  3. AOP检查用户登录
  4. AOP用户行为统计
  5. 待开发

手写IOC框架

使用实例:

    @ViewById(R.id.tv_ioc)
    private TextView tvIoc;

    @StringById(R.string.ioc)
    private String text;

    @ColorById(R.color.colorAccent)
    private int color;

    @ContentViewById(R.layout.activity_main)

    @OnClick({R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn5})
    @OnLongClick({R.id.btn4})
    @CheckNet()
    public void openIoc(View view) {}

image

手写图片加载框架

主要来自何洪辉大神: https://blog.csdn.net/column/details/android-imageloader.html

具体使用跟 Glide 差不多

image image

手写OkHttp框架

主要来自 https://github.com/ouyangshengduo/SenduoHttp

image

DialogFragment封装

Q:为什么要使用 DialogFragment?

  • 继承自Fragment,拥有Fragment的生命周期。
  • 当旋转屏幕和按下后退键时可以更好的管理其声明周期

PS:我见过很多的 Dialog 的库都把 Listview 或者 RecycleView 封装进去了,个人并不是很赞同这种做法。为了把列表封装进去, 将整个 lib 瞬间多了很多的代码,不同情况下的列表并不一样,也不能通用所用情况,还不如直接通过 setView(recycleVIew) 这中方式将列表 set 进去。

具体使用见 DialogTestFragment

手写 EventBus

XEventBus 就只有四个类,如下:

image

  • register()流程 和 post()流程

image

  • unRegister()流程
    //private Map<Object, List<SubscribeMethod>> mSubscribeMethodMap;
    public void unRegister(Object object) {
        if (mSubscribeMethodMap != null) {
            mSubscribeMethodMap.remove(object);
        }
    }

主要通过注解和反射来实现

插件化和Hook技术

  • 从sd中加载apk
  • hook AMS
  • hook PMS

内存优化

  • MemoryHandler 每隔一分钟监控应用内存,如果内存占用超过了80%,回调 onLowMemory() 方法。

触顶率:可以反映 Java 内存的使用情况,如果超过 85% 最大堆限制,GC 会变得更加频繁,容易造成 OOM 和卡顿。 内存 UV 触顶率 = Java 堆占用超过最大堆限制的 85% 的 UV / 采集 UV

About

Android进阶之路:AOP切面编程、手写IOC框架、手写ImageLoad、手写OkHttp、手写EventBus、Hook技术、内存优化...


Languages

Language:Java 99.8%Language:Kotlin 0.2%