-
模板方法模式构建BaseActivity
-
阿里热修复框架:AndFix
-
自定义热修复框架
-
使用Builder设计模式打造支持链式调用的AlertDialog
AlertDialog dialog = new AlertDialog.Builder(this) .setContentView(R.layout.detail_common_dialog) .fromBottom(true) .fullWidth() .show(); final EditText et_common = dialog.getView(R.id.comment_editor); dialog.setText(R.id.submit_btn, "发送"); dialog.setOnClickListener(R.id.submit_btn, new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, et_common.getText().toString(), Toast.LENGTH_SHORT).show(); } });
-
使用Builder设计模式打造通用的支持链式调用的顶部标题栏
DefaultNavigationBar defaultNavigationBar = new DefaultNavigationBar.Builder(this) .setTitle("投稿") .setRightText("发布") .setOnRightClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "已经发布", Toast.LENGTH_SHORT).show(); } }) .setRightIcon(R.mipmap.account_icon_weibo) .build();
-
封装基于OkHttp的网络引擎,链式调用,便于切换引擎
HttpUtils .with(this) .get() .url("http://is.snssdk.com/2/essay/discovery/v3/")//路径和参数都需要放入到jni中 .cache(true)//添加缓存 .addParams("iid", "6152551759") .addParams("aid", "7") .excute(new HttpCallBack<DiscoverListResult>() { @Override public void onError(Exception e) { } @Override public void onSuccess(DiscoverListResult result) { // result --> 对象,会添加缓存功能 Log.e("请求的最终结果", result.getData().getCategories().getName()); } });
-
自定义数据库框架(工厂模式+单例模式)并进行优化,数据加密
-
自定义数据库与网络引擎结合实现数据缓存
IDaoSupport<Person> daoSupport = DaoSupportFactory .getFactory() .getDao(Person.class); ArrayList<Person> list = new ArrayList<>(); for (int i = 0; i < 100; i++) { list.add(new Person("sunxin", 1 + i)); } //测试插入数据的效率,并优化 long startTime = System.currentTimeMillis(); daoSupport.insert(list); long endTime = System.currentTimeMillis(); Log.e("TAG", "Time---》" + (endTime - startTime)); // 查询所有数据的条目数 List<Person> persons = daoSupport.querySupport().queryAll(); Log.e(TAG, "initData: "+persons.size() ); // 链式调用查询 List<Person> value = daoSupport .querySupport() .selection("age = ?") .selectionArgs("24") .query(); Logger.d("------------" + value.size()); for (Person person : value) { Log.e(TAG, "initData: " + person.toString()); Logger.d(person.toString()); }
-
-
插件换肤
-
资源的加载流程分析
- Resources与AssetManager源码分析
-
Hook拦截View创建分析
- setContentView源码分析
- LayoutInflate源码分析
-
换肤框架的完善
-
保证如果换肤,下次进入还要是新皮肤(保存皮肤状态即可)
-
重新进入应用需要换肤
-
恢复默认皮肤
-
自定义View的换肤(提供接口回调)
//加载指定皮肤,皮肤文件需要联网获取 String skinPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "red.skin"; int result = SkinManager.getInstance().loadSkin(skinPath); //加载默认皮肤 int result = SkinManager.getInstance().loadDefault();
-
-
内存泄漏的监测和分析
- 垃圾回收问题(GC)
- 内存泄漏(不要把Activity的this交出去)
-
-
IPC进程间通信
- Binder源码阅读
- Service保活
- 进程被杀的原因
- 系统内存不足,需要回收,杀掉进程
- 进程的优先级(前台进程,可见进程,服务进程,后台进程,空进程)
- 第三方清理软件会杀掉进程
- Rom厂商会在应用退出的时候清理进程
- 系统内存不足,需要回收,杀掉进程
- 解决方案
- 提高进程优先级,比如启动Service的时候调用startForeground()
- 当应用退到后台的时候要释放资源,比如轮播图,在退到后台的时候就不需要轮播了
- 开启守护进程,避免第三方清理软件杀死进程
- 使用JobScheduler,防止手机清除缓存的时候杀死进程
- 进程被杀的原因
-
功能
- 一种文字两种颜色
- 自定义无限轮播
- RecyclerView 万能适配器的封装
- 打造链式调用自定义图片选择器