最后:学习总结——Android框架体系架构知识脑图(纯手绘xmind文档)
学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。
下方即为我手绘的Android框架体系架构知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的Android框架体系架构知识脑图原件(包括上方的面试解析xmind文档)
除此之外,前文所提及的Alibaba珍藏版 Android框架体系架构 手写文档以及一本 《大话数据结构》 书籍等等相关的学习笔记文档,也皆可分享给认可的朋友!
——感谢大家伙的认可支持,请注意:点赞+点赞+点赞!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
context.startActivity(intent);
}
}
4.FileUtil.class(文件管理工具类)
import java.io.File;
import java.text.DecimalFormat;
/**
- Created by mythmayor on 2016/12/26.
*/
public class FileUtil {
/**
-
递归计算文件夹大小
-
@param f
-
@return
-
@throws Exception
*/
public static long getFileSize(File f) throws Exception {
long size = 0;
File[] flist = f.listFiles();
for (int i = 0; i < flist.length; i++) {
if (flist[i].isDirectory()) {
size = size + getFileSize(flist[i]);
} else {
size = size + flist[i].length();
}
}
return size;
}
/**
-
得到字符串方式的文件大小
-
@param fileS ,单位b
-
@return
*/
public static String FormetFileSize(long fileS) {
DecimalFormat df = new DecimalFormat(“0.00”);
String fileSizeString;
if (fileS < 1024) {
fileSizeString = df.format((double) fileS) + “B”;
} else if (fileS < 1048576) {
fileSizeString = df.format((double) fileS / 1024) + “K”;
} else if (fileS < 1073741824) {
fileSizeString = df.format((double) fileS / 1048576) + “M”;
} else {
fileSizeString = df.format((double) fileS / 1073741824) + “G”;
}
return fileSizeString;
}
}
5.DensityUtil.class(单位转换和获取屏幕宽高的工具类)
import android.app.Activity;
import android.content.Context;
import android.util.DisplayMetrics;
/**
- Created by mythmayor on 2016/12/14.
*/
public class DensityUtil {
/**
-
将px值转换为 dip或dp值,保证尺寸大小不变
-
@param pxValue 像素值
-
@param context Context 对象
-
@return dp值
*/
public static int px2dip(float pxValue, Context context) {
float scale = getDensity(context);
return (int) (pxValue / scale + 0.5f);
}
/**
-
将dip或dp值转换为px值,保证尺寸大小不变
-
@param dipValue dip数值
-
@param context Context 对象
-
@return 像素值
*/
public static int dip2px(float dipValue, Context context) {
float scale = getDensity(context);
return (int) (dipValue * scale + 0.5f);
}
/**
-
将px值转换为sp值,保证文字大小不变
-
@param pxValue 像素值
-
@param context Context 对象
-
@return 返回sp数值
*/
public static int px2sp(float pxValue, Context context) {
float scale = getDensity(context);
return (int) (pxValue / scale + 0.5f);
}
/**
-
将sp值转换为px值,保证文字大小不变
-
@param spValue sp数值
-
@param context Context 对象
-
@return 返回像素值
*/
public static int sp2px(float spValue, Context context) {
float scale = getDensity(context);
return (int) (spValue * scale + 0.5f);
}
/**
-
取得手机屏幕的密度
-
@param context 上下文
-
@return 手机屏幕的密度
*/
public static float getDensity(Context context) {
float scale = context.getResources().getDisplayMetrics().density;
return scale;
}
/**
-
获取屏幕高
-
@param activity
-
@return 手机屏幕的高度
*/
public static int getScreenHeight(Activity activity) {
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
}
/**
-
获取屏幕宽
-
@param activity
-
@return 手机屏幕的宽度
*/
public static int getScreenWidth(Activity activity) {
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
}
6.ResourceUtil.class(获取资源文件的工具类)
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
public class CommonUtil {
/**
- 获取Resource对象
*/
public static Resources getResources() {
return MainApplication.getContext().getResources();
}
/**
- 获取Drawable资源
*/
public static Drawable getDrawable(int resId) {
return getResources().getDrawable(resId);
}
/**
- 获取字符串资源
*/
public static String getString(int resId) {
return getResources().getString(resId);
}
/**
- 获取color资源
*/
public static int getColor(int resId) {
return getResources().getColor(resId);
}
/**
- 获取dimens资源
*/
public static float getDimens(int resId) {
return getResources().getDimension(resId);
}
/**
- 获取字符串数组资源
*/
public static String[] getStringArray(int resId) {
return getResources().getStringArray(resId);
}
7.DateUtil.class(日期时间转换的工具类)
import android.annotation.SuppressLint;
import android.text.format.Time;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
-
时间、日期转换工具
-
Created by mythmayor on 2016/9/14.
*/
public class DateUtils {
/**
-
获取当前时间
-
@return 年月日时分秒字符串
*/
public static String getCurrentTime() {
Time time = new Time(“GMT+8”);
time.setToNow();
String year = “” + time.year;
int imonth = time.month + 1;
String month = imonth > 9 ? “” + imonth : “0” + imonth;
String day = time.monthDay > 9 ? “” + time.monthDay : “0”
- time.monthDay;
String hour = (time.hour + 8) > 9 ? “” + (time.hour + 8) : “0”
- (time.hour + 8);
String minute = time.minute > 9 ? “” + time.minute : “0” + time.minute;
String sec = time.second > 9 ? “” + time.second : “0” + time.second;
String currentTime = year + month + day + hour + minute + sec;
return currentTime;
}
//获取 日期/时/分/秒
@SuppressLint(“SimpleDateFormat”)
public static String getDateTime(long time) {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
String date = sdf.format(new Date(time));
return date;
}
//获取 日期/时/分
@SuppressLint(“SimpleDateFormat”)
public static String getHourMinute(long time) {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日HH时mm分”);
String date = sdf.format(new Date(time));
return date;
}
//获取 日期年月日
@SuppressLint(“SimpleDateFormat”)
public static String getYearMonthDay(long time) {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日”);
String date = sdf.format(new Date(time));
return date;
}
//获取日期年月
public static String getYearMonth(long time){
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月”);
String date = sdf.format(new Date(time));
return date;
}
//获取日期年月
public static String getYearMonth2(long time){
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM”);
String date = sdf.format(new Date(time));
return date;
}
//获取日期年
public static String getYear(long time){
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年”);
String date = sdf.format(new Date(time));
return date;
}
//获取 时/分
public static String getTime(long time) {
SimpleDateFormat sdf = new SimpleDateFormat(“HH:mm”);
String date = sdf.format(new Date(time));
return date;
}
}
8.GlideCacheUtil.class(管理Glide产生的缓存的工具类)
/**
- Created by mythmayor on 2017/2/22.
*/
import android.content.Context;
import android.os.Looper;
import android.text.TextUtils;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.cache.ExternalCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
import java.io.File;
import java.math.BigDecimal;
/**Glide缓存工具类
- Created by mythmayor on 2016/10/10.
*/
public class GlideCacheUtil {
private static GlideCacheUtil inst;
public static GlideCacheUtil getInstance() {
if (inst == null) {
inst = new GlideCacheUtil();
}
return inst;
}
/**
- 清除图片磁盘缓存
*/
public void clearImageDiskCache(final Context context) {
try {
if (Looper.myLooper() == Looper.getMainLooper()) {
new Thread(new Runnable() {
@Override
public void run() {
Glide.get(context).clearDiskCache();
// BusUtil.getBus().post(new GlideCacheClearSuccessEvent());
}
}).start();
} else {
Glide.get(context).clearDiskCache();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
- 清除图片内存缓存
*/
public void clearImageMemoryCache(Context context) {
try {
if (Looper.myLooper() == Looper.getMainLooper()) { //只能在主线程执行
Glide.get(context).clearMemory();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
- 清除图片所有缓存
*/
public void clearImageAllCache(Context context) {
clearImageDiskCache(context);
clearImageMemoryCache(context);
String ImageExternalCatchDir=context.getExternalCacheDir()+ ExternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR;
deleteFolderFile(ImageExternalCatchDir, true);
}
/**
-
获取Glide造成的缓存大小
-
@return CacheSize
*/
public String getCacheSize(Context context) {
try {
return getFormatSize(getFolderSize(new File(context.getCacheDir() + “/”+ InternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR)));
} catch (Exception e) {
e.printStackTrace();
}
return “”;
}
/**
-
获取指定文件夹内所有文件大小的和
-
@param file file
-
@return size
-
@throws Exception
*/
private long getFolderSize(File file) throws Exception {
long size = 0;
try {
File[] fileList = file.listFiles();
for (File aFileList : fileList) {
if (aFileList.isDirectory()) {
size = size + getFolderSize(aFileList);
} else {
size = size + aFileList.length();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return size;
}
/**
-
删除指定目录下的文件,这里用于缓存的删除
-
@param filePath filePath
-
@param deleteThisPath deleteThisPath
*/
private void deleteFolderFile(String filePath, boolean deleteThisPath) {
if (!TextUtils.isEmpty(filePath)) {
try {
File file = new File(filePath);
if (file.isDirectory()) {
File files[] = file.listFiles();
for (File file1 : files) {
deleteFolderFile(file1.getAbsolutePath(), true);
}
}
if (deleteThisPath) {
if (!file.isDirectory()) {
file.delete();
} else {
if (file.listFiles().length == 0) {
file.delete();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
-
格式化单位
-
@param size size
-
@return size
*/
private static String getFormatSize(double size) {
double kiloByte = size / 1024;
if (kiloByte < 1) {
return size + “B”;
}
double megaByte = kiloByte / 1024;
if (megaByte < 1) {
BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + “KB”;
}
double gigaByte = megaByte / 1024;
if (gigaByte < 1) {
BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + “MB”;
}
double teraBytes = gigaByte / 1024;
if (teraBytes < 1) {
BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + “GB”;
}
BigDecimal result4 = new BigDecimal(teraBytes);
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + “TB”;
}
}
9.JsonUtil.class(管理Json数据的工具类)
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class JsonUtils {
public static Map<String, Object> jsonToMap(String jsonString) {
Map<String, Object> map = new HashMap<String, Object>();
try {
JSONObject json = new JSONObject(jsonString);
Iterator<?> it = json.keys();
String key = null;
Object value = null;
while (it.hasNext()) {
key = it.next().toString();
value = json.get(key);
if (value.toString().equals(“null”) || value.toString().equals(“”)) {
value = “”;
}
map.put(key, value);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
return map;
}
public static JSONObject mapToJson(@SuppressWarnings(“rawtypes”) Map map) {
JSONObject json = null;
json = new JSONObject(map);
return json;
}
public static List<Map<String, Object>> jsonToList(String jsonArrayString) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
JSONArray array = new JSONArray(jsonArrayString);
for (int i = 0; i < array.length(); i++) {
JSONObject json = array.getJSONObject(i);
Map<String, Object> map = jsonToMap(json.toString());
list.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
return null;
}
return list;
}
/**
-
@param json
-
@return
*/
public static Map<String, Object> jsonToMap(JSONObject json) {
Map<String, Object> map = new HashMap<String, Object>();
try {
Iterator<?> it = json.keys();
String key = null;
Object value = null;
while (it.hasNext()) {
key = it.next().toString();
value = json.get(key);
if (value.toString().equals(“null”) || value.toString().equals(“”)) {
value = “”;
}
map.put(key, value);
}
} catch (JSONException e) {
e.printStackTrace();
return null;
}
return map;
}
/**
-
@param array
-
@return
*/
public static List<Map<String, Object>> jsonToList(JSONArray array) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
for (int i = 0; i < array.length(); i++) {
最后
都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。
技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;
我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言
高级UI与自定义view;
自定义view,Android开发的基本功。
性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。
NDK开发;
未来的方向,高薪必会。
前沿技术;
组件化,热升级,热修复,框架设计
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多
当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。
不出半年,你就能看出变化!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
for (int i = 0; i < array.length(); i++) {
最后
都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。
技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;
我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
[外链图片转存中…(img-3ppdz04i-1715407144754)]
Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言
[外链图片转存中…(img-OFMMSpCY-1715407144754)]
高级UI与自定义view;
自定义view,Android开发的基本功。
[外链图片转存中…(img-3FxAfSN3-1715407144755)]
性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。
[外链图片转存中…(img-XBySBCXj-1715407144755)]
NDK开发;
未来的方向,高薪必会。
[外链图片转存中…(img-uv5QnisJ-1715407144756)]
前沿技术;
组件化,热升级,热修复,框架设计
[外链图片转存中…(img-40rADKLW-1715407144756)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多
当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。
不出半年,你就能看出变化!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!