-4 Android开发官方文档,闲没事就看看
Android开发官方文档
-3 鸿洋博客鸿洋博客
-2 kotlin语言必会:官网学习
kt简洁且安全,不需要new直接使用所需对象;本身具有判空能力;var默认带有get/set,减少模板代码;协程让异步实现更简单,使用kotlin编程,让程序员更快乐!
-1 跨进程通讯效果,回调效果:回调效果-liveEventBus
0 约束性布局必须会!谷歌新推出的扁平化布局,能有效避免布局嵌套过深的问题
1必须学会代码动态添加view,而不是只会在xml中写死布局
2Parcelable接口实现必须会
3Canvas用法,自定义view必会canvas用法
3.1 自定义View必会onMessure()的3种模式:
UNSPECIFIED=0 未指定,不限制大小,EXACTLY 精确模式=1,AT_MOST=2最大模式;

UNSPECIFIED :未指定模式,也可以称为无限制模式。不受父视图的限制,比如当你的父视图是可以纵向滚动的 ScrollView ,那子视图的高度大小对于父视图来说没有意义。无论你多高(即使超出屏幕),都可以通过滑动屏幕来查看(同理,如果是横向滚动那么宽度就没有意义)
EXACTLY :精确模式。父视图指定大小,通常在 xml 中指定大小或者设为 match_parent 时会收到 EXACTLY 模式
AT_MOST :最大模式;不能超过父视图的范围,通常在 xml 中设为 wrap_content 时会收到 AT_MOST 模式。

from view源码

        /**
         * Measure specification mode: The parent has not imposed any constraint
         * on the child. It can be whatever size it wants.
         */
        public static final int UNSPECIFIED = 0 << MODE_SHIFT;

        /**
         * Measure specification mode: The parent has determined an exact size
         * for the child. The child is going to be given those bounds regardless
         * of how big it wants to be.
         */
        public static final int EXACTLY     = 1 << MODE_SHIFT;

        /**
         * Measure specification mode: The child can be as large as it wants up
         * to the specified size.
         */
        public static final int AT_MOST     = 2 << MODE_SHIFT;

自定义view从0到1

自定义view从入门到精通
4必须会熟练使用网络框架:retrofit2
5架构的演进:(学习方法,尝试把之前的项目用不同的架构重构)
mvc:Activity或Fragment既是View的角色也是Controller的角色,就导致Activity的承载过重,View和Controller耦合在一起,随着业务的增多,牵一发而动全身,Activity变得臃肿不堪,代码难以扩展和维护。
mvp:presenter把moudle和View完全隔离,通过接口回调的方式进行数据传递;不足之处就是会增加很多接口类文件,不可避免的增加许多空实现。

白话:我看mvc的直观体验就是网络请求跟view显示都在activity里面;mvp就是把网络请求从activity里面抽出去了,通过接口回调的方式在activity里面用,抽象的能力,代码看起来不要那么直接,一堆,充分利用接口回调的作用。
下面为mvc:Activity一大堆

MVVM:是数据驱动UI的思想,是Google目前最为推荐的一种方式,为此Google还开源了JetPack系列组件来支持MVVM.
这个mvvm的databinding也是减少样本代码了,不用findviewbyid那一套了

MVVM缺点:内存消耗大,也是伴随着手机内存越来越大它才有的生存空间;布局复用难;数据UI双向绑定,调试困难

6官方文档,闲没事就看看
官方文档
7设计模式的运用,理解;工厂,单例,责任链,装饰者等等
8 设计原则:单一职责,开闭原则,里氏替换,依赖倒置,接口隔离等等的运用理解
9 共性的东西一定要封装成工具类,一改全改,比如:吐司工具类,Dailog工具类,标题栏工具类,统一日志类(日志上传服务端也很重要)等等(重要)
牛逼日志类
调用

 TLog.e("wy", "heightForScroll:" + heightForScroll);

效果

E/wy: YibeiHomeActivity.java (389) onCreate: heightForScroll:1128

内容:



import android.util.Log;
//YibeiHomeActivity.java (389) onCreate: heightForScroll:1128  这个工具类强大,能定位具体的类,行数等
public class TLog {
    /**
     * This flag to indicate the log is enabled or disabled.
     */
    private static boolean isLogEnable = true;

    /**
     * Disable the log output.
     */
    public static void disableLog() {
        isLogEnable = false;
    }

    /**
     * Enable the log output.
     */
    public static void enableLog() {
        isLogEnable = true;
    }

    /**
     * Debug
     *
     * @param tag
     * @param msg
     */
    public static void d(String tag, String msg) {
        if (isLogEnable) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            Log.d(tag, rebuildMsg(stackTraceElement, msg));
        }
    }

    /**
     * Information
     *
     * @param tag
     * @param msg
     */
    public static void i(String tag, String msg) {
        if (isLogEnable) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            Log.i(tag, rebuildMsg(stackTraceElement, msg));
        }
    }

    /**
     * Verbose
     *
     * @param tag
     * @param msg
     */
    public static void v(String tag, String msg) {
        if (isLogEnable) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            Log.v(tag, rebuildMsg(stackTraceElement, msg));
        }
    }

    /**
     * Warning
     *
     * @param tag
     * @param msg
     */
    public static void w(String tag, String msg) {
        if (isLogEnable) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            Log.w(tag, rebuildMsg(stackTraceElement, msg));
        }
    }

    /**
     * Error
     *
     * @param tag
     * @param msg
     */
    public static void e(String tag, String msg) {
        if (isLogEnable) {
            StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
            Log.e(tag, rebuildMsg(stackTraceElement, msg));
        }
    }

    /**
     * Rebuild Log Msg
     *
     * @param msg
     * @return
     */
    private static String rebuildMsg(StackTraceElement stackTraceElement, String msg) {
        StringBuffer sb = new StringBuffer();
        sb.append(stackTraceElement.getFileName());
        sb.append(" (");
        sb.append(stackTraceElement.getLineNumber());
        sb.append(") ");
        sb.append(stackTraceElement.getMethodName());
        sb.append(": ");
        sb.append(msg);
        return sb.toString();
    }
}

腾讯云toast工具类

public class ToastUtil {

    private static Toast toast;

    public static void toastLongMessage(final String message) {
        toastMessage(message, true);
    }

    public static void toastShortMessage(final String message) {
        toastMessage(message, false);
    }

    private static void toastMessage(final String message, boolean isLong) {
        BackgroundTasks.getInstance().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (toast != null) {
                    toast.cancel();
                    toast = null;
                }
                toast = Toast.makeText(TUIConfig.getAppContext(), message,
                        isLong ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT);
                // 解决各个手机系统 toast 文字对齐方式不一致的问题
                View view = toast.getView();
                TextView textView = view.findViewById(android.R.id.message);
                if (textView != null) {
                    textView.setGravity(Gravity.CENTER);
                }
                toast.show();
            }
        });
    }

}

10 优秀三方框架的运用,如xpopup,glide等等
11 常用组件的使用,如Fragment必会;常用控件的组合使用,如TableLayout+ViewPager,TableLayout+FrameLayout等等必会;MediaPlayer的使用,SurfaceView的使用等等;相机的调用,相册的调用,动态鉴权,自动升级等等
12 强大的内心,百折不挠的意志,天塌不下来那就每日精进技术;彷徨迷茫了那就每日精进技术
13 开发新项目注意事项-https://blog.csdn/xiyangyang8110/article/details/126459530
14 性能优化必背篇:1启动速度 2内存管理 3耗电优化 4稳定(内存溢出、崩溃) 安装包(APK瘦身);腾讯bugly检测线上bug,不断优化项目现存问题
15 android特有的跨进程通信技术-Binder(性能,安全)
16 okhttp底层原理;RV的缓存原理(四级缓存)
17Framework相关
18Flutter跨平台相关

更多推荐

Android高级研发必会系列