├── .Archive └── code block.md │ ├── 2017-08-04 16-43-49.md │ ├── 2017-08-04 16-44-59.md │ └── 2017-08-04 16-46-19.md ├── OpenSysMedia ├── .gitignore ├── .idea │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── gradle.xml │ ├── misc.xml │ ├── modules.xml │ ├── runConfigurations.xml │ └── vcs.xml ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── codexiaosheng │ │ │ └── opensysmedia │ │ │ └── MainActivity.java │ │ └── res │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── README.md ├── _image └── 项目分包.png ├── codeBlock.md ├── codeXiaoSheng17_end.md ├── codeXiaoSheng17_middle.md └── codexiaosheng18.md /.Archive/code block.md/2017-08-04 16-43-49.md: -------------------------------------------------------------------------------- 1 | ```java 2 | /** 3 | * bitmap转为base64 4 | * @param bitmap 5 | * @return 6 | */ 7 | public static String bitmapToBase64(Bitmap bitmap) { 8 | 9 | String result = null; 10 | ByteArrayOutputStream baos = null; 11 | try { 12 | if (bitmap != null) { 13 | baos = new ByteArrayOutputStream(); 14 | bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 15 | 16 | baos.flush(); 17 | baos.close(); 18 | 19 | byte[] bitmapBytes = baos.toByteArray(); 20 | result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT); 21 | } 22 | } catch (IOException e) { 23 | e.printStackTrace(); 24 | } finally { 25 | try { 26 | if (baos != null) { 27 | baos.flush(); 28 | baos.close(); 29 | } 30 | } catch (IOException e) { 31 | e.printStackTrace(); 32 | } 33 | } 34 | return result; 35 | } 36 | 37 | /** 38 | * base64转为bitmap 39 | * @param base64Data 40 | * @return 41 | */ 42 | public static Bitmap base64ToBitmap(String base64Data) { 43 | byte[] bytes = Base64.decode(base64Data, Base64.DEFAULT); 44 | return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 45 | } 46 | ``` 47 | - - - 48 | ```java 49 | //ScrollView嵌套WebView(ViewPager等)冲突解决 50 | webView.setOnTouchListener(new View.OnTouchListener() { 51 | @Override 52 | public boolean onTouch(View view, MotionEvent motionEvent) { 53 | switch (motionEvent.getAction()) { 54 | case MotionEvent.ACTION_DOWN: 55 | case MotionEvent.ACTION_MOVE: 56 | scrollView.requestDisallowInterceptTouchEvent(true); 57 | break; 58 | case MotionEvent.ACTION_UP: 59 | scrollView.requestDisallowInterceptTouchEvent(false); 60 | break; 61 | } 62 | return false; 63 | } 64 | }); 65 | ``` 66 | - - - 67 | ```java 68 | /** 69 | * EditText设置编辑和不可编辑,相互切换 70 | *①在xml中设置属性 focusable="false"; 71 | *②可编辑代码 72 | */ 73 | editText.setFocusableInTouchMode(true); 74 | editText.setFocusable(true); 75 | editText.requestFocus(); 76 | //不可编辑代码: 77 | editText.setFocusable(false); 78 | editText.setFocusableInTouchMode(false); 79 | ``` 80 | - - - 81 | ```java 82 | /** 83 | * 毫秒值(long)转指定日期格式 84 | */ 85 | SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); 86 | Date date = new Date(Long.parseLong("时间字符串")); 87 | String time = simple.format(date); 88 | ``` 89 | - - - - - 90 | ```java 91 | /** 92 | * 获取本地时间,显示指定格式 93 | */ 94 | SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日"); 95 | Date date = new Date(System.currentTimeMillis()); 96 | String currentTime = simple.format(date); 97 | ``` 98 | - - - - - 99 | ```xml 100 | /** 101 | * Android 5.0以上版本去掉 Button 自带阴影效果 102 | */ 103 | 109 | 110 | // 核心代码 111 | style=”?android:attr/borderlessButtonStyle” 112 | ``` 113 | - - - - - 114 | ```java 115 | // Gson 解析返回一个 List 116 | String str="[{'id': '1','code': 'bj','name': '北京','map': '39.90403, 116.40752599999996'}, {'id': '2','code': 'sz','name': '深圳','map': '22.543099, 114.05786799999998'}, {'id': '9','code': 'sh','name': '上海','map': '31.230393,121.473704'}, {'id': '10','code': 'gz','name': '广州','map': '23.129163,113.26443500000005'}]"; 117 | 118 | Gson gson = new Gson(); 119 | List rs = new ArrayList(); 120 | Type type = new TypeToken>() {}.getType(); 121 | rs=gson.fromJson(str, new TypeToken>(){}.getType()); 122 | 123 | // Gson 解析返回一个map 124 | String jsonStr="{'1': {'id': '1','code': 'bj','name': '北京','map': '39.90403, 116.40752599999996'},'2': {'id': '2','code': 'sz','name': '深圳','map': '22.543099, 114.05786799999998'},'9': {'id': '9','code': 'sh','name': '上海','map': '31.230393,121.473704'},'10': {'id': '10','code': 'gz','name': '广州','map': '23.129163,113.26443500000005'}}"; 125 | 126 | Map citys = gson.fromJson(jsonStr, new TypeToken>(){}.getType()); 127 | ``` 128 | - - - - - 129 | ```java 130 | private static final String moblie1 = "^(0\\d{2,3}-\\d{7,8}(-\\d{3,5}){0,1})|(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(14[0-9]))\\d{8})$"; 131 | private static final String moblie2 = "^(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(14[0-9]))\\d{8})$"; 132 | 133 | /** 134 | * 验证手机号是否匹配 135 | * 136 | * @param phone 137 | * @param isPhone:是否支持固话验证 138 | * @return :true 手机号是正确的,false 手机号不正确 139 | */ 140 | public static boolean mobilePhone(String phone, boolean isPhone) { 141 | String regStr; 142 | if (isPhone == true) { 143 | regStr = moblie1; 144 | } else { 145 | regStr = moblie2; 146 | } 147 | return phone == null || phone.trim().equals("") ? false : phone.replaceAll(regStr, "").equals(""); 148 | } 149 | ``` 150 | - - - - - 151 | ```java 152 | private static final String email = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; 153 | 154 | /** 155 | * 判断邮箱是否合法 156 | * 157 | * @param email 158 | * @return 159 | */ 160 | public static boolean isEmail(String email) { 161 | if (isEmpty(email)) 162 | return false; 163 | Pattern p = Pattern.compile(StringUtil.email); 164 | Matcher m = p.matcher(email); 165 | return m.matches(); 166 | } 167 | ``` 168 | - - - - - 169 | ```java 170 | // 解决华为手机调试看不到报错信息方法: 171 | // 拨号键盘输入*#*#2846579#*#*,然后选择ProhectMenu,然后后台设置,然后LOG设置,LOG打开。 172 | ``` 173 | - - - - - 174 | ```java 175 | // Popwindow 设置背景图片(带尖角)边缘有阴影,去掉阴影做法: 176 | // 在代码中给 pop 设置 backgroundDrawable 为系统的透明颜色或者下面方式都可以. 177 | /** 178 | * 生成一个 透明的背景图片 179 | * @return 180 | */ 181 | private Drawable getDrawable(){ 182 | ShapeDrawable bgdrawable =new ShapeDrawable(new OvalShape()); 183 | bgdrawable.getPaint().setColor(MainActivity.this.getResources().getColor(android.R.color.transparent)); 184 | return bgdrawable; 185 | } 186 | ``` 187 | - - - - - 188 | ```java 189 | /** 190 | * Dialog 代码中设置大小,需在 show() 之后设置如下代码才会生效 191 | * 192 | */ 193 | WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); 194 | params.width = 200; 195 | params.height = 200 ; 196 | dialog.getWindow().setAttributes(params); 197 | ``` 198 | - - - - - 199 | ```java 200 | // ScrollView 嵌套 ListView ,页面打开时,默认没有显示在顶部,解决办法: 201 | // 在代码中给 ListView 设置如下代码即可: 202 | listview.setFocusable(false); 203 | ``` 204 | - - - - - 205 | ```xml 206 | /** 207 | * 列表式界面(顶部输入框,底部列表)结构, 208 | * 解决打开界面自动弹出软键盘方法之一:在其对应的 Manifest.xml 文件中添加如下代码即可: 209 | */ 210 | android:windowSoftInputMode="stateAlwaysHidden" 211 | ``` 212 | - - - - - 213 | ```java 214 | /** 215 | * RecyclerView 的 item 最外层布局使用 CardView 时,CardView 没有占满屏幕宽度是因为 item 布局加载方式不对 216 | * 推荐笔记:http://blog.chengdazhi.com/index.php/110 217 | */ 218 | // View view = View.inflate(mContext, R.layout.item_rv, null); // 不能铺满 219 | View view = LayoutInflater.from(mContext).inflate(R.layout.item_rv, parent, false); // 铺满 220 | ``` 221 | - - - - - 222 | ``` 223 |  224 | 225 | 如上所示,我们根据开始的项目业务拆分分包如上,将常用的基础业务放到common包里边,这个包在大多数情况是不变的,并且为app提供基础性的服务,不过我们尽量不要放到这个common包里边,如果这个common包变得足够大的时候,就一定要思考是不是该拆分了。因为common给人的感觉就是什么都是,那就让我们无法快速认知这个包所担当的职责。我们可以这样理解,common包是面向切面而设计的一些业务,但也不是绝对的。接下来我们先聊module这个包,实际这里是将业务进行了模块化的分拆,如上我们拆分出了moudleA和moudleB,这两者之间要求没有任何的联系。但是,我们会存在一个问题,那就是moudleA和moudleB某些业务是一样的,我们拆开显得重复了许多体力活。这应该是大多数开发者面对的困扰,这种该怎么去平衡呢?我是这么考虑的。如果,moudle和moudleB存在重叠的业务,我们将这些业务提取到function包或者common包中,这样降低了业务的层级。我们允许moudle包的各模块业务依赖于function和common为我们提供的基础服务。为了更好的区分模块A和模块B虽然重叠但在逻辑上是各自属于各自的,我们有两种方法来做。第一种是将两种业务进行一定的抽象,实现的过程还是放到各个moudle业务中。第二种方案定义两个接口类,各自定义各自的接口。在具体的实现类中实现了这两个接口类的方法,内部在进行相同的逻辑操作。这样,对外看来,逻辑上moudleA和moduleB是分离的。总之,如何分包还得权衡利弊,尽量以一种思维来进行划分,以避免设计混乱。 226 | ``` -------------------------------------------------------------------------------- /.Archive/code block.md/2017-08-04 16-44-59.md: -------------------------------------------------------------------------------- 1 | ```java 2 | /** 3 | * bitmap转为base64 4 | * @param bitmap 5 | * @return 6 | */ 7 | public static String bitmapToBase64(Bitmap bitmap) { 8 | 9 | String result = null; 10 | ByteArrayOutputStream baos = null; 11 | try { 12 | if (bitmap != null) { 13 | baos = new ByteArrayOutputStream(); 14 | bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 15 | 16 | baos.flush(); 17 | baos.close(); 18 | 19 | byte[] bitmapBytes = baos.toByteArray(); 20 | result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT); 21 | } 22 | } catch (IOException e) { 23 | e.printStackTrace(); 24 | } finally { 25 | try { 26 | if (baos != null) { 27 | baos.flush(); 28 | baos.close(); 29 | } 30 | } catch (IOException e) { 31 | e.printStackTrace(); 32 | } 33 | } 34 | return result; 35 | } 36 | 37 | /** 38 | * base64转为bitmap 39 | * @param base64Data 40 | * @return 41 | */ 42 | public static Bitmap base64ToBitmap(String base64Data) { 43 | byte[] bytes = Base64.decode(base64Data, Base64.DEFAULT); 44 | return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 45 | } 46 | ``` 47 | - - - 48 | ```java 49 | //ScrollView嵌套WebView(ViewPager等)冲突解决 50 | webView.setOnTouchListener(new View.OnTouchListener() { 51 | @Override 52 | public boolean onTouch(View view, MotionEvent motionEvent) { 53 | switch (motionEvent.getAction()) { 54 | case MotionEvent.ACTION_DOWN: 55 | case MotionEvent.ACTION_MOVE: 56 | scrollView.requestDisallowInterceptTouchEvent(true); 57 | break; 58 | case MotionEvent.ACTION_UP: 59 | scrollView.requestDisallowInterceptTouchEvent(false); 60 | break; 61 | } 62 | return false; 63 | } 64 | }); 65 | ``` 66 | - - - 67 | ```java 68 | /** 69 | * EditText设置编辑和不可编辑,相互切换 70 | *①在xml中设置属性 focusable="false"; 71 | *②可编辑代码 72 | */ 73 | editText.setFocusableInTouchMode(true); 74 | editText.setFocusable(true); 75 | editText.requestFocus(); 76 | //不可编辑代码: 77 | editText.setFocusable(false); 78 | editText.setFocusableInTouchMode(false); 79 | ``` 80 | - - - 81 | ```java 82 | /** 83 | * 毫秒值(long)转指定日期格式 84 | */ 85 | SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); 86 | Date date = new Date(Long.parseLong("时间字符串")); 87 | String time = simple.format(date); 88 | ``` 89 | - - - - - 90 | ```java 91 | /** 92 | * 获取本地时间,显示指定格式 93 | */ 94 | SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日"); 95 | Date date = new Date(System.currentTimeMillis()); 96 | String currentTime = simple.format(date); 97 | ``` 98 | - - - - - 99 | ```xml 100 | /** 101 | * Android 5.0以上版本去掉 Button 自带阴影效果 102 | */ 103 | 109 | 110 | // 核心代码 111 | style=”?android:attr/borderlessButtonStyle” 112 | ``` 113 | - - - - - 114 | ```java 115 | // Gson 解析返回一个 List 116 | String str="[{'id': '1','code': 'bj','name': '北京','map': '39.90403, 116.40752599999996'}, {'id': '2','code': 'sz','name': '深圳','map': '22.543099, 114.05786799999998'}, {'id': '9','code': 'sh','name': '上海','map': '31.230393,121.473704'}, {'id': '10','code': 'gz','name': '广州','map': '23.129163,113.26443500000005'}]"; 117 | 118 | Gson gson = new Gson(); 119 | List rs = new ArrayList(); 120 | Type type = new TypeToken>() {}.getType(); 121 | rs=gson.fromJson(str, new TypeToken>(){}.getType()); 122 | 123 | // Gson 解析返回一个map 124 | String jsonStr="{'1': {'id': '1','code': 'bj','name': '北京','map': '39.90403, 116.40752599999996'},'2': {'id': '2','code': 'sz','name': '深圳','map': '22.543099, 114.05786799999998'},'9': {'id': '9','code': 'sh','name': '上海','map': '31.230393,121.473704'},'10': {'id': '10','code': 'gz','name': '广州','map': '23.129163,113.26443500000005'}}"; 125 | 126 | Map citys = gson.fromJson(jsonStr, new TypeToken>(){}.getType()); 127 | ``` 128 | - - - - - 129 | ```java 130 | private static final String moblie1 = "^(0\\d{2,3}-\\d{7,8}(-\\d{3,5}){0,1})|(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(14[0-9]))\\d{8})$"; 131 | private static final String moblie2 = "^(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(14[0-9]))\\d{8})$"; 132 | 133 | /** 134 | * 验证手机号是否匹配 135 | * 136 | * @param phone 137 | * @param isPhone:是否支持固话验证 138 | * @return :true 手机号是正确的,false 手机号不正确 139 | */ 140 | public static boolean mobilePhone(String phone, boolean isPhone) { 141 | String regStr; 142 | if (isPhone == true) { 143 | regStr = moblie1; 144 | } else { 145 | regStr = moblie2; 146 | } 147 | return phone == null || phone.trim().equals("") ? false : phone.replaceAll(regStr, "").equals(""); 148 | } 149 | ``` 150 | - - - - - 151 | ```java 152 | private static final String email = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; 153 | 154 | /** 155 | * 判断邮箱是否合法 156 | * 157 | * @param email 158 | * @return 159 | */ 160 | public static boolean isEmail(String email) { 161 | if (isEmpty(email)) 162 | return false; 163 | Pattern p = Pattern.compile(StringUtil.email); 164 | Matcher m = p.matcher(email); 165 | return m.matches(); 166 | } 167 | ``` 168 | - - - - - 169 | ```java 170 | // 解决华为手机调试看不到报错信息方法: 171 | // 拨号键盘输入*#*#2846579#*#*,然后选择ProhectMenu,然后后台设置,然后LOG设置,LOG打开。 172 | ``` 173 | - - - - - 174 | ```java 175 | // Popwindow 设置背景图片(带尖角)边缘有阴影,去掉阴影做法: 176 | // 在代码中给 pop 设置 backgroundDrawable 为系统的透明颜色或者下面方式都可以. 177 | /** 178 | * 生成一个 透明的背景图片 179 | * @return 180 | */ 181 | private Drawable getDrawable(){ 182 | ShapeDrawable bgdrawable =new ShapeDrawable(new OvalShape()); 183 | bgdrawable.getPaint().setColor(MainActivity.this.getResources().getColor(android.R.color.transparent)); 184 | return bgdrawable; 185 | } 186 | ``` 187 | - - - - - 188 | ```java 189 | /** 190 | * Dialog 代码中设置大小,需在 show() 之后设置如下代码才会生效 191 | * 192 | */ 193 | WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); 194 | params.width = 200; 195 | params.height = 200 ; 196 | dialog.getWindow().setAttributes(params); 197 | ``` 198 | - - - - - 199 | ```java 200 | // ScrollView 嵌套 ListView ,页面打开时,默认没有显示在顶部,解决办法: 201 | // 在代码中给 ListView 设置如下代码即可: 202 | listview.setFocusable(false); 203 | ``` 204 | - - - - - 205 | ```xml 206 | /** 207 | * 列表式界面(顶部输入框,底部列表)结构, 208 | * 解决打开界面自动弹出软键盘方法之一:在其对应的 Manifest.xml 文件中添加如下代码即可: 209 | */ 210 | android:windowSoftInputMode="stateAlwaysHidden" 211 | ``` 212 | - - - - - 213 | ```java 214 | /** 215 | * RecyclerView 的 item 最外层布局使用 CardView 时,CardView 没有占满屏幕宽度是因为 item 布局加载方式不对 216 | * 推荐笔记:http://blog.chengdazhi.com/index.php/110 217 | */ 218 | // View view = View.inflate(mContext, R.layout.item_rv, null); // 不能铺满 219 | View view = LayoutInflater.from(mContext).inflate(R.layout.item_rv, parent, false); // 铺满 220 | ``` 221 | - - - - - 222 | 223 | 224 | 225 |  226 | 227 | 如上所示,我们根据开始的项目业务拆分分包如上,将常用的基础业务放到common包里边,这个包在大多数情况是不变的,并且为app提供基础性的服务,不过我们尽量不要放到这个common包里边,如果这个common包变得足够大的时候,就一定要思考是不是该拆分了。因为common给人的感觉就是什么都是,那就让我们无法快速认知这个包所担当的职责。我们可以这样理解,common包是面向切面而设计的一些业务,但也不是绝对的。接下来我们先聊module这个包,实际这里是将业务进行了模块化的分拆,如上我们拆分出了moudleA和moudleB,这两者之间要求没有任何的联系。但是,我们会存在一个问题,那就是moudleA和moudleB某些业务是一样的,我们拆开显得重复了许多体力活。这应该是大多数开发者面对的困扰,这种该怎么去平衡呢?我是这么考虑的。如果,moudle和moudleB存在重叠的业务,我们将这些业务提取到function包或者common包中,这样降低了业务的层级。我们允许moudle包的各模块业务依赖于function和common为我们提供的基础服务。为了更好的区分模块A和模块B虽然重叠但在逻辑上是各自属于各自的,我们有两种方法来做。第一种是将两种业务进行一定的抽象,实现的过程还是放到各个moudle业务中。第二种方案定义两个接口类,各自定义各自的接口。在具体的实现类中实现了这两个接口类的方法,内部在进行相同的逻辑操作。这样,对外看来,逻辑上moudleA和moduleB是分离的。总之,如何分包还得权衡利弊,尽量以一种思维来进行划分,以避免设计混乱。 228 | - - - - - 229 | -------------------------------------------------------------------------------- /.Archive/code block.md/2017-08-04 16-46-19.md: -------------------------------------------------------------------------------- 1 | ```java 2 | /** 3 | * bitmap转为base64 4 | * @param bitmap 5 | * @return 6 | */ 7 | public static String bitmapToBase64(Bitmap bitmap) { 8 | 9 | String result = null; 10 | ByteArrayOutputStream baos = null; 11 | try { 12 | if (bitmap != null) { 13 | baos = new ByteArrayOutputStream(); 14 | bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 15 | 16 | baos.flush(); 17 | baos.close(); 18 | 19 | byte[] bitmapBytes = baos.toByteArray(); 20 | result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT); 21 | } 22 | } catch (IOException e) { 23 | e.printStackTrace(); 24 | } finally { 25 | try { 26 | if (baos != null) { 27 | baos.flush(); 28 | baos.close(); 29 | } 30 | } catch (IOException e) { 31 | e.printStackTrace(); 32 | } 33 | } 34 | return result; 35 | } 36 | 37 | /** 38 | * base64转为bitmap 39 | * @param base64Data 40 | * @return 41 | */ 42 | public static Bitmap base64ToBitmap(String base64Data) { 43 | byte[] bytes = Base64.decode(base64Data, Base64.DEFAULT); 44 | return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 45 | } 46 | ``` 47 | - - - 48 | ```java 49 | //ScrollView嵌套WebView(ViewPager等)冲突解决 50 | webView.setOnTouchListener(new View.OnTouchListener() { 51 | @Override 52 | public boolean onTouch(View view, MotionEvent motionEvent) { 53 | switch (motionEvent.getAction()) { 54 | case MotionEvent.ACTION_DOWN: 55 | case MotionEvent.ACTION_MOVE: 56 | scrollView.requestDisallowInterceptTouchEvent(true); 57 | break; 58 | case MotionEvent.ACTION_UP: 59 | scrollView.requestDisallowInterceptTouchEvent(false); 60 | break; 61 | } 62 | return false; 63 | } 64 | }); 65 | ``` 66 | - - - 67 | ```java 68 | /** 69 | * EditText设置编辑和不可编辑,相互切换 70 | *①在xml中设置属性 focusable="false"; 71 | *②可编辑代码 72 | */ 73 | editText.setFocusableInTouchMode(true); 74 | editText.setFocusable(true); 75 | editText.requestFocus(); 76 | //不可编辑代码: 77 | editText.setFocusable(false); 78 | editText.setFocusableInTouchMode(false); 79 | ``` 80 | - - - 81 | ```java 82 | /** 83 | * 毫秒值(long)转指定日期格式 84 | */ 85 | SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); 86 | Date date = new Date(Long.parseLong("时间字符串")); 87 | String time = simple.format(date); 88 | ``` 89 | - - - - - 90 | ```java 91 | /** 92 | * 获取本地时间,显示指定格式 93 | */ 94 | SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日"); 95 | Date date = new Date(System.currentTimeMillis()); 96 | String currentTime = simple.format(date); 97 | ``` 98 | - - - - - 99 | ```xml 100 | /** 101 | * Android 5.0以上版本去掉 Button 自带阴影效果 102 | */ 103 | 109 | 110 | // 核心代码 111 | style=”?android:attr/borderlessButtonStyle” 112 | ``` 113 | - - - - - 114 | ```java 115 | // Gson 解析返回一个 List 116 | String str="[{'id': '1','code': 'bj','name': '北京','map': '39.90403, 116.40752599999996'}, {'id': '2','code': 'sz','name': '深圳','map': '22.543099, 114.05786799999998'}, {'id': '9','code': 'sh','name': '上海','map': '31.230393,121.473704'}, {'id': '10','code': 'gz','name': '广州','map': '23.129163,113.26443500000005'}]"; 117 | 118 | Gson gson = new Gson(); 119 | List rs = new ArrayList(); 120 | Type type = new TypeToken>() {}.getType(); 121 | rs=gson.fromJson(str, new TypeToken>(){}.getType()); 122 | 123 | // Gson 解析返回一个map 124 | String jsonStr="{'1': {'id': '1','code': 'bj','name': '北京','map': '39.90403, 116.40752599999996'},'2': {'id': '2','code': 'sz','name': '深圳','map': '22.543099, 114.05786799999998'},'9': {'id': '9','code': 'sh','name': '上海','map': '31.230393,121.473704'},'10': {'id': '10','code': 'gz','name': '广州','map': '23.129163,113.26443500000005'}}"; 125 | 126 | Map citys = gson.fromJson(jsonStr, new TypeToken>(){}.getType()); 127 | ``` 128 | - - - - - 129 | ```java 130 | private static final String moblie1 = "^(0\\d{2,3}-\\d{7,8}(-\\d{3,5}){0,1})|(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(14[0-9]))\\d{8})$"; 131 | private static final String moblie2 = "^(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(14[0-9]))\\d{8})$"; 132 | 133 | /** 134 | * 验证手机号是否匹配 135 | * 136 | * @param phone 137 | * @param isPhone:是否支持固话验证 138 | * @return :true 手机号是正确的,false 手机号不正确 139 | */ 140 | public static boolean mobilePhone(String phone, boolean isPhone) { 141 | String regStr; 142 | if (isPhone == true) { 143 | regStr = moblie1; 144 | } else { 145 | regStr = moblie2; 146 | } 147 | return phone == null || phone.trim().equals("") ? false : phone.replaceAll(regStr, "").equals(""); 148 | } 149 | ``` 150 | - - - - - 151 | ```java 152 | private static final String email = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; 153 | 154 | /** 155 | * 判断邮箱是否合法 156 | * 157 | * @param email 158 | * @return 159 | */ 160 | public static boolean isEmail(String email) { 161 | if (isEmpty(email)) 162 | return false; 163 | Pattern p = Pattern.compile(StringUtil.email); 164 | Matcher m = p.matcher(email); 165 | return m.matches(); 166 | } 167 | ``` 168 | - - - - - 169 | ```java 170 | // 解决华为手机调试看不到报错信息方法: 171 | // 拨号键盘输入*#*#2846579#*#*,然后选择ProhectMenu,然后后台设置,然后LOG设置,LOG打开。 172 | ``` 173 | - - - - - 174 | ```java 175 | // Popwindow 设置背景图片(带尖角)边缘有阴影,去掉阴影做法: 176 | // 在代码中给 pop 设置 backgroundDrawable 为系统的透明颜色或者下面方式都可以. 177 | /** 178 | * 生成一个 透明的背景图片 179 | * @return 180 | */ 181 | private Drawable getDrawable(){ 182 | ShapeDrawable bgdrawable =new ShapeDrawable(new OvalShape()); 183 | bgdrawable.getPaint().setColor(MainActivity.this.getResources().getColor(android.R.color.transparent)); 184 | return bgdrawable; 185 | } 186 | ``` 187 | - - - - - 188 | ```java 189 | /** 190 | * Dialog 代码中设置大小,需在 show() 之后设置如下代码才会生效 191 | * 192 | */ 193 | WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); 194 | params.width = 200; 195 | params.height = 200 ; 196 | dialog.getWindow().setAttributes(params); 197 | ``` 198 | - - - - - 199 | ```java 200 | // ScrollView 嵌套 ListView ,页面打开时,默认没有显示在顶部,解决办法: 201 | // 在代码中给 ListView 设置如下代码即可: 202 | listview.setFocusable(false); 203 | ``` 204 | - - - - - 205 | ```xml 206 | /** 207 | * 列表式界面(顶部输入框,底部列表)结构, 208 | * 解决打开界面自动弹出软键盘方法之一:在其对应的 Manifest.xml 文件中添加如下代码即可: 209 | */ 210 | android:windowSoftInputMode="stateAlwaysHidden" 211 | ``` 212 | - - - - - 213 | ```java 214 | /** 215 | * RecyclerView 的 item 最外层布局使用 CardView 时,CardView 没有占满屏幕宽度是因为 item 布局加载方式不对 216 | * 推荐笔记:http://blog.chengdazhi.com/index.php/110 217 | */ 218 | // View view = View.inflate(mContext, R.layout.item_rv, null); // 不能铺满 219 | View view = LayoutInflater.from(mContext).inflate(R.layout.item_rv, parent, false); // 铺满 220 | ``` 221 | - - - - - 222 | 223 | 224 | 225 |  226 | 227 | 如上所示,我们根据开始的项目业务拆分分包如上,将常用的基础业务放到common包里边,这个包在大多数情况是不变的,并且为app提供基础性的服务,不过我们尽量不要放到这个common包里边,如果这个common包变得足够大的时候,就一定要思考是不是该拆分了。因为common给人的感觉就是什么都是,那就让我们无法快速认知这个包所担当的职责。我们可以这样理解,common包是面向切面而设计的一些业务,但也不是绝对的。接下来我们先聊module这个包,实际这里是将业务进行了模块化的分拆,如上我们拆分出了moudleA和moudleB,这两者之间要求没有任何的联系。但是,我们会存在一个问题,那就是moudleA和moudleB某些业务是一样的,我们拆开显得重复了许多体力活。这应该是大多数开发者面对的困扰,这种该怎么去平衡呢?我是这么考虑的。如果,moudle和moudleB存在重叠的业务,我们将这些业务提取到function包或者common包中,这样降低了业务的层级。我们允许moudle包的各模块业务依赖于function和common为我们提供的基础服务。为了更好的区分模块A和模块B虽然重叠但在逻辑上是各自属于各自的,我们有两种方法来做。第一种是将两种业务进行一定的抽象,实现的过程还是放到各个moudle业务中。第二种方案定义两个接口类,各自定义各自的接口。在具体的实现类中实现了这两个接口类的方法,内部在进行相同的逻辑操作。这样,对外看来,逻辑上moudleA和moduleB是分离的。总之,如何分包还得权衡利弊,尽量以一种思维来进行划分,以避免设计混乱。 228 | - - - - - 229 | ```java 230 | 231 | ``` -------------------------------------------------------------------------------- /OpenSysMedia/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /OpenSysMedia/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /OpenSysMedia/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /OpenSysMedia/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /OpenSysMedia/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 1.8 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /OpenSysMedia/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /OpenSysMedia/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /OpenSysMedia/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /OpenSysMedia/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /OpenSysMedia/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.3" 6 | defaultConfig { 7 | applicationId "com.codexiaosheng.opensysmedia" 8 | minSdkVersion 15 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | compile 'com.android.support:appcompat-v7:25.3.1' 25 | } 26 | -------------------------------------------------------------------------------- /OpenSysMedia/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Android\AndroidStudioSDK/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/java/com/codexiaosheng/opensysmedia/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.codexiaosheng.opensysmedia; 2 | 3 | import android.content.Intent; 4 | import android.database.Cursor; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.os.Environment; 8 | import android.provider.MediaStore; 9 | import android.support.v7.app.AppCompatActivity; 10 | import android.view.View; 11 | import android.widget.Button; 12 | import android.widget.TextView; 13 | import android.widget.Toast; 14 | 15 | import java.io.File; 16 | 17 | public class MainActivity extends AppCompatActivity implements View.OnClickListener { 18 | 19 | private static final int CAMERA_REQUEST_CODE = 1; 20 | private static final int ALBUM_REQUEST_CODE = 2; 21 | private static final int VIDEO_REQUEST_CODE = 3; 22 | private static final int RECORDING_VIDEO_REQUEST_CODE = 4; 23 | private static final int FILE_MANAGER_REQUEST_CODE = 5; 24 | private static final int RECORDING_AUDIO_REQUEST_CODE = 6; 25 | private static final int AUDIO_REQUEST_CODE = 7; 26 | 27 | private String strMediaName = ""; // 媒体文件名 28 | private String strMediaFilePath = ""; // 媒体文件(保存)路径 29 | 30 | private Button btnCamera; 31 | private Button btnAlbum; 32 | private Button btnChooseVideo; 33 | private Button btnRecordingVideo; 34 | private Button btnRecordingAudio; 35 | private Button btnChooseAudio; 36 | private Button btnFm; 37 | 38 | private TextView tvShowPath; 39 | 40 | @Override 41 | protected void onCreate(Bundle savedInstanceState) { 42 | super.onCreate(savedInstanceState); 43 | setContentView(R.layout.activity_main); 44 | 45 | strMediaFilePath = Environment.getExternalStorageDirectory().toString() + "/"; 46 | initView(); 47 | } 48 | 49 | private void initView() { 50 | btnCamera = (Button) findViewById(R.id.btn_camera); 51 | btnAlbum = (Button) findViewById(R.id.btn_album); 52 | btnChooseVideo = (Button) findViewById(R.id.btn_choose_video); 53 | btnRecordingVideo = (Button) findViewById(R.id.btn_recording_video); 54 | btnRecordingAudio = (Button) findViewById(R.id.btn_recording_audio); 55 | btnChooseAudio = (Button) findViewById(R.id.btn_choose_audio); 56 | btnFm = (Button) findViewById(R.id.btn_fm); 57 | tvShowPath = (TextView) findViewById(R.id.tv_show_path); 58 | 59 | btnCamera.setOnClickListener(this); 60 | btnAlbum.setOnClickListener(this); 61 | btnChooseVideo.setOnClickListener(this); 62 | btnRecordingVideo.setOnClickListener(this); 63 | btnRecordingAudio.setOnClickListener(this); 64 | btnChooseAudio.setOnClickListener(this); 65 | btnFm.setOnClickListener(this); 66 | } 67 | 68 | @Override 69 | public void onClick(View v) { 70 | tvShowPath.setText(""); 71 | switch (v.getId()) { 72 | case R.id.btn_camera: 73 | makePhoto(); 74 | break; 75 | case R.id.btn_album: 76 | openAlbum(); 77 | break; 78 | case R.id.btn_choose_video: 79 | chooseVideo(); 80 | break; 81 | case R.id.btn_recording_video: 82 | recordingVideo(); 83 | break; 84 | case R.id.btn_recording_audio: 85 | recordingAudio(); 86 | break; 87 | case R.id.btn_choose_audio: 88 | Toast.makeText(this, "未实现", Toast.LENGTH_SHORT).show(); 89 | // chooseAudio(); 90 | break; 91 | case R.id.btn_fm: 92 | openFileManager(); 93 | break; 94 | } 95 | } 96 | 97 | /** 98 | * 系统相机 99 | */ 100 | private void makePhoto() { 101 | strMediaName = System.currentTimeMillis() + "cxs.jpg"; 102 | Intent camera_intent = new Intent("android.media.action.IMAGE_CAPTURE"); 103 | camera_intent.putExtra(MediaStore.EXTRA_OUTPUT, getMediaPath()); 104 | camera_intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); 105 | startActivityForResult(camera_intent, CAMERA_REQUEST_CODE); 106 | } 107 | 108 | /** 109 | * 系统相册 110 | */ 111 | private void openAlbum() { 112 | Intent album_intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 113 | album_intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); 114 | startActivityForResult(album_intent, ALBUM_REQUEST_CODE); 115 | } 116 | 117 | /** 118 | * 选择本地视频 119 | */ 120 | private void chooseVideo() { 121 | Intent intent = new Intent(Intent.ACTION_PICK); 122 | intent.setType("video/*"); 123 | startActivityForResult(intent, VIDEO_REQUEST_CODE); 124 | } 125 | 126 | /** 127 | * 调用系统相机录像 128 | */ 129 | private void recordingVideo() { 130 | strMediaName = System.currentTimeMillis() + "cxs.mp4"; 131 | Intent intent = new Intent(); 132 | intent.setAction("android.media.action.VIDEO_CAPTURE"); 133 | intent.addCategory("android.intent.category.DEFAULT"); 134 | intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(strMediaFilePath, strMediaName))); 135 | startActivityForResult(intent, RECORDING_VIDEO_REQUEST_CODE); 136 | } 137 | 138 | /** 139 | * 调用系统录音 140 | */ 141 | private void recordingAudio() { 142 | strMediaName = System.currentTimeMillis() + "cxs.mp3"; // amr 143 | Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 144 | intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(strMediaFilePath, strMediaName))); 145 | startActivityForResult(intent, RECORDING_AUDIO_REQUEST_CODE); 146 | } 147 | 148 | /** 149 | * 调用系统选择音频 150 | */ 151 | private void chooseAudio() { 152 | Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 153 | intent.setType("audio/*"); 154 | // intent.setAction(Intent.ACTION_GET_CONTENT); 155 | // intent.putExtra("return-data", true); 156 | startActivityForResult(intent, AUDIO_REQUEST_CODE); 157 | } 158 | 159 | /** 160 | * 跳转文件管理界面 161 | */ 162 | private void openFileManager() { 163 | Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 164 | intent.setType("*/*"); 165 | intent.addCategory(Intent.CATEGORY_OPENABLE); 166 | // intent.putExtra("return-data", true); 167 | startActivityForResult(intent, FILE_MANAGER_REQUEST_CODE); 168 | } 169 | 170 | /** 171 | * 获取文件保存地址的Uri 172 | * 173 | * @return 174 | */ 175 | public Uri getMediaPath() { 176 | return Uri.fromFile(new File(strMediaFilePath, strMediaName)); 177 | } 178 | 179 | @Override 180 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 181 | if (resultCode != RESULT_OK) { 182 | return; 183 | } else { 184 | switch (requestCode) { 185 | case CAMERA_REQUEST_CODE: 186 | Toast.makeText(this, "camera", Toast.LENGTH_SHORT).show(); 187 | tvShowPath.setText(strMediaFilePath + strMediaName); 188 | break; 189 | case ALBUM_REQUEST_CODE: 190 | Toast.makeText(this, "album", Toast.LENGTH_SHORT).show(); 191 | getResultPath(data); 192 | break; 193 | case VIDEO_REQUEST_CODE: 194 | Toast.makeText(this, "local video", Toast.LENGTH_SHORT).show(); 195 | getResultPath(data); 196 | break; 197 | case RECORDING_VIDEO_REQUEST_CODE: 198 | Toast.makeText(this, "recording video", Toast.LENGTH_SHORT).show(); 199 | tvShowPath.setText(strMediaFilePath + strMediaName); 200 | break; 201 | case RECORDING_AUDIO_REQUEST_CODE: 202 | Toast.makeText(this, "recording audio", Toast.LENGTH_SHORT).show(); 203 | tvShowPath.setText(strMediaFilePath + strMediaName); 204 | break; 205 | case AUDIO_REQUEST_CODE: 206 | Toast.makeText(this, "local audio", Toast.LENGTH_SHORT).show(); 207 | getResultPath(data); 208 | break; 209 | case FILE_MANAGER_REQUEST_CODE: 210 | Toast.makeText(this, "local file", Toast.LENGTH_SHORT).show(); 211 | Uri uri = data.getData(); 212 | tvShowPath.setText(uri.toString()); 213 | break; 214 | } 215 | } 216 | super.onActivityResult(requestCode, resultCode, data); 217 | } 218 | 219 | /** 220 | * 显示返回结果地址 221 | * 222 | * @param data 223 | */ 224 | private void getResultPath(Intent data) { 225 | Uri uri = data.getData(); 226 | Cursor cursor = getContentResolver().query(uri, null, null, null, null); 227 | if (cursor != null && cursor.moveToFirst()) { 228 | String a_path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)); 229 | tvShowPath.setText(a_path); 230 | } 231 | } 232 | 233 | } 234 | -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 19 | 20 | 28 | 29 | 37 | 38 | 46 | 47 | 48 | 52 | 53 | 61 | 62 | 70 | 71 | 79 | 80 | 81 | 85 | 86 | 94 | 95 | 96 | 97 | 105 | 106 | -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | OpenSysMedia 3 | 4 | -------------------------------------------------------------------------------- /OpenSysMedia/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /OpenSysMedia/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.3.3' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | 21 | task clean(type: Delete) { 22 | delete rootProject.buildDir 23 | } 24 | -------------------------------------------------------------------------------- /OpenSysMedia/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /OpenSysMedia/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/OpenSysMedia/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /OpenSysMedia/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Aug 03 16:24:43 CST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip 7 | -------------------------------------------------------------------------------- /OpenSysMedia/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /OpenSysMedia/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /OpenSysMedia/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AndroidSourceCodeXS 2 | Android 旅途路上的一些用得着的资源整理 3 | -------------------------------------------------------------------------------- /_image/项目分包.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Android-Mu/AndroidSourceCodeXS/a4ae81273d6a8dacb168534db1d70c98b6aceb84/_image/项目分包.png -------------------------------------------------------------------------------- /codeBlock.md: -------------------------------------------------------------------------------- 1 | ```java 2 | /** 3 | * bitmap转为base64 4 | * @param bitmap 5 | * @return 6 | */ 7 | public static String bitmapToBase64(Bitmap bitmap) { 8 | 9 | String result = null; 10 | ByteArrayOutputStream baos = null; 11 | try { 12 | if (bitmap != null) { 13 | baos = new ByteArrayOutputStream(); 14 | bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 15 | 16 | baos.flush(); 17 | baos.close(); 18 | 19 | byte[] bitmapBytes = baos.toByteArray(); 20 | result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT); 21 | } 22 | } catch (IOException e) { 23 | e.printStackTrace(); 24 | } finally { 25 | try { 26 | if (baos != null) { 27 | baos.flush(); 28 | baos.close(); 29 | } 30 | } catch (IOException e) { 31 | e.printStackTrace(); 32 | } 33 | } 34 | return result; 35 | } 36 | 37 | /** 38 | * base64转为bitmap 39 | * @param base64Data 40 | * @return 41 | */ 42 | public static Bitmap base64ToBitmap(String base64Data) { 43 | byte[] bytes = Base64.decode(base64Data, Base64.DEFAULT); 44 | return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 45 | } 46 | ``` 47 | - - - 48 | ```java 49 | //ScrollView嵌套WebView(ViewPager等)冲突解决 50 | webView.setOnTouchListener(new View.OnTouchListener() { 51 | @Override 52 | public boolean onTouch(View view, MotionEvent motionEvent) { 53 | switch (motionEvent.getAction()) { 54 | case MotionEvent.ACTION_DOWN: 55 | case MotionEvent.ACTION_MOVE: 56 | scrollView.requestDisallowInterceptTouchEvent(true); 57 | break; 58 | case MotionEvent.ACTION_UP: 59 | scrollView.requestDisallowInterceptTouchEvent(false); 60 | break; 61 | } 62 | return false; 63 | } 64 | }); 65 | ``` 66 | - - - 67 | ```java 68 | /** 69 | * EditText设置编辑和不可编辑,相互切换 70 | *①在xml中设置属性 focusable="false"; 71 | *②可编辑代码 72 | */ 73 | editText.setFocusableInTouchMode(true); 74 | editText.setFocusable(true); 75 | editText.requestFocus(); 76 | //不可编辑代码: 77 | editText.setFocusable(false); 78 | editText.setFocusableInTouchMode(false); 79 | ``` 80 | - - - 81 | ```java 82 | /** 83 | * 毫秒值(long)转指定日期格式 84 | */ 85 | SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); 86 | Date date = new Date(Long.parseLong("时间字符串")); 87 | String time = simple.format(date); 88 | ``` 89 | - - - - - 90 | ```java 91 | /** 92 | * 获取本地时间,显示指定格式 93 | */ 94 | SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日"); 95 | Date date = new Date(System.currentTimeMillis()); 96 | String currentTime = simple.format(date); 97 | ``` 98 | - - - - - 99 | ```xml 100 | /** 101 | * Android 5.0以上版本去掉 Button 自带阴影效果 102 | */ 103 | 109 | 110 | // 核心代码 111 | style=”?android:attr/borderlessButtonStyle” 112 | ``` 113 | - - - - - 114 | ```java 115 | // Gson 解析返回一个 List 116 | String str="[{'id': '1','code': 'bj','name': '北京','map': '39.90403, 116.40752599999996'}, {'id': '2','code': 'sz','name': '深圳','map': '22.543099, 114.05786799999998'}, {'id': '9','code': 'sh','name': '上海','map': '31.230393,121.473704'}, {'id': '10','code': 'gz','name': '广州','map': '23.129163,113.26443500000005'}]"; 117 | 118 | Gson gson = new Gson(); 119 | List rs = new ArrayList(); 120 | Type type = new TypeToken>() {}.getType(); 121 | rs=gson.fromJson(str, new TypeToken>(){}.getType()); 122 | 123 | // Gson 解析返回一个map 124 | String jsonStr="{'1': {'id': '1','code': 'bj','name': '北京','map': '39.90403, 116.40752599999996'},'2': {'id': '2','code': 'sz','name': '深圳','map': '22.543099, 114.05786799999998'},'9': {'id': '9','code': 'sh','name': '上海','map': '31.230393,121.473704'},'10': {'id': '10','code': 'gz','name': '广州','map': '23.129163,113.26443500000005'}}"; 125 | 126 | Map citys = gson.fromJson(jsonStr, new TypeToken>(){}.getType()); 127 | ``` 128 | - - - - - 129 | ```java 130 | private static final String moblie1 = "^(0\\d{2,3}-\\d{7,8}(-\\d{3,5}){0,1})|(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(14[0-9]))\\d{8})$"; 131 | private static final String moblie2 = "^(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(14[0-9]))\\d{8})$"; 132 | 133 | /** 134 | * 验证手机号是否匹配 135 | * 136 | * @param phone 137 | * @param isPhone:是否支持固话验证 138 | * @return :true 手机号是正确的,false 手机号不正确 139 | */ 140 | public static boolean mobilePhone(String phone, boolean isPhone) { 141 | String regStr; 142 | if (isPhone == true) { 143 | regStr = moblie1; 144 | } else { 145 | regStr = moblie2; 146 | } 147 | return phone == null || phone.trim().equals("") ? false : phone.replaceAll(regStr, "").equals(""); 148 | } 149 | ``` 150 | - - - - - 151 | ```java 152 | private static final String email = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; 153 | 154 | /** 155 | * 判断邮箱是否合法 156 | * 157 | * @param email 158 | * @return 159 | */ 160 | public static boolean isEmail(String email) { 161 | if (isEmpty(email)) 162 | return false; 163 | Pattern p = Pattern.compile(StringUtil.email); 164 | Matcher m = p.matcher(email); 165 | return m.matches(); 166 | } 167 | ``` 168 | - - - - - 169 | ```java 170 | // 解决华为手机调试看不到报错信息方法: 171 | // 拨号键盘输入*#*#2846579#*#*,然后选择ProhectMenu,然后后台设置,然后LOG设置,LOG打开。 172 | ``` 173 | - - - - - 174 | ```java 175 | // Popwindow 设置背景图片(带尖角)边缘有阴影,去掉阴影做法: 176 | // 在代码中给 pop 设置 backgroundDrawable 为系统的透明颜色或者下面方式都可以. 177 | /** 178 | * 生成一个 透明的背景图片 179 | * @return 180 | */ 181 | private Drawable getDrawable(){ 182 | ShapeDrawable bgdrawable =new ShapeDrawable(new OvalShape()); 183 | bgdrawable.getPaint().setColor(MainActivity.this.getResources().getColor(android.R.color.transparent)); 184 | return bgdrawable; 185 | } 186 | ``` 187 | - - - - - 188 | ```java 189 | /** 190 | * Dialog 代码中设置大小,需在 show() 之后设置如下代码才会生效 191 | * 192 | */ 193 | WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); 194 | params.width = 200; 195 | params.height = 200 ; 196 | dialog.getWindow().setAttributes(params); 197 | ``` 198 | - - - - - 199 | ```java 200 | // ScrollView 嵌套 ListView ,页面打开时,默认没有显示在顶部,解决办法: 201 | // 在代码中给 ListView 设置如下代码即可: 202 | listview.setFocusable(false); 203 | ``` 204 | - - - - - 205 | ```xml 206 | /** 207 | * 列表式界面(顶部输入框,底部列表)结构, 208 | * 解决打开界面自动弹出软键盘方法之一:在其对应的 Manifest.xml 文件中添加如下代码即可: 209 | */ 210 | android:windowSoftInputMode="stateAlwaysHidden" 211 | ``` 212 | - - - - - 213 | ```java 214 | /** 215 | * RecyclerView 的 item 最外层布局使用 CardView 时,CardView 没有占满屏幕宽度是因为 item 布局加载方式不对 216 | * 推荐笔记:http://blog.chengdazhi.com/index.php/110 217 | */ 218 | // View view = View.inflate(mContext, R.layout.item_rv, null); // 不能铺满 219 | View view = LayoutInflater.from(mContext).inflate(R.layout.item_rv, parent, false); // 铺满 220 | ``` 221 | - - - - - 222 | 223 | 224 | 225 |  226 | 227 | 如上所示,我们根据开始的项目业务拆分分包如上,将常用的基础业务放到common包里边,这个包在大多数情况是不变的,并且为app提供基础性的服务,不过我们尽量不要放到这个common包里边,如果这个common包变得足够大的时候,就一定要思考是不是该拆分了。因为common给人的感觉就是什么都是,那就让我们无法快速认知这个包所担当的职责。我们可以这样理解,common包是面向切面而设计的一些业务,但也不是绝对的。接下来我们先聊module这个包,实际这里是将业务进行了模块化的分拆,如上我们拆分出了moudleA和moudleB,这两者之间要求没有任何的联系。但是,我们会存在一个问题,那就是moudleA和moudleB某些业务是一样的,我们拆开显得重复了许多体力活。这应该是大多数开发者面对的困扰,这种该怎么去平衡呢?我是这么考虑的。如果,moudle和moudleB存在重叠的业务,我们将这些业务提取到function包或者common包中,这样降低了业务的层级。我们允许moudle包的各模块业务依赖于function和common为我们提供的基础服务。为了更好的区分模块A和模块B虽然重叠但在逻辑上是各自属于各自的,我们有两种方法来做。第一种是将两种业务进行一定的抽象,实现的过程还是放到各个moudle业务中。第二种方案定义两个接口类,各自定义各自的接口。在具体的实现类中实现了这两个接口类的方法,内部在进行相同的逻辑操作。这样,对外看来,逻辑上moudleA和moduleB是分离的。总之,如何分包还得权衡利弊,尽量以一种思维来进行划分,以避免设计混乱。 228 | - - - - - 229 | ```java 230 | /** 231 | * 获取视频的缩略图 232 | * 233 | * 先通过ThumbnailUtils来创建一个视频的缩略图,然后再利用ThumbnailUtils来生成指定大小的缩略图。 234 | * 如果想要的缩略图的宽和高都小于MICRO_KIND,则类型要使用MICRO_KIND作为kind的值,这样会节省内存。 235 | * 236 | * @param videoPath 视频的路径 237 | * @param width 指定输出视频缩略图的宽度 238 | * @param height 指定输出视频缩略图的高度度 239 | * @param kind 参照MediaStore.Images.Thumbnails类中的常量MINI_KIND和MICRO_KIND。 240 | * 其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96 241 | * @return 指定大小的视频缩略图 242 | */ 243 | private Bitmap getVideoThumbnail(String videoPath, int width, int height, 244 | int kind) { 245 | Bitmap bitmap = null; 246 | // 获取视频的缩略图 247 | bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind); 248 | bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, 249 | ThumbnailUtils.OPTIONS_RECYCLE_INPUT); 250 | return bitmap; 251 | } 252 | ``` 253 | - - - - - 254 | ```java 255 | /** 256 | * 从系统文件管理获取选择的文件路径 257 | * 258 | * @param context 259 | * @param uri 260 | * @return 261 | */ 262 | private String getFmPath(Context context, Uri uri) { 263 | if ("content".equals(uri.getScheme())) { 264 | String[] projection = {"_data"}; 265 | Cursor cursor = null; 266 | try { 267 | cursor = context.getContentResolver().query(uri, projection, null, null, null); 268 | int column_index = cursor.getColumnIndexOrThrow("_data"); 269 | if (cursor.moveToFirst()) { 270 | return cursor.getString(column_index); 271 | } 272 | } catch (Exception e) { 273 | 274 | } 275 | } else if ("file".equalsIgnoreCase(uri.getScheme())) { 276 | return uri.getPath(); 277 | } 278 | return null; 279 | } 280 | ``` 281 | - - - - - 282 | ```java 283 | 获取手机IP 284 | 285 | 1.使用WIFI 286 | 287 | 添加权限 288 | 289 | 290 | 291 | 292 | 代码: 293 | public void onCreate(Bundle savedInstanceState) { 294 | super.onCreate(savedInstanceState); 295 | setContentView(R.layout.main); 296 | 297 | //获取wifi服务 298 | WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 299 | //判断wifi是否开启 300 | if (!wifiManager.isWifiEnabled()) { 301 | wifiManager.setWifiEnabled(true); 302 | } 303 | WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 304 | int ipAddress = wifiInfo.getIpAddress(); 305 | String ip = intToIp(ipAddress); 306 | EditText et = (EditText)findViewById(R.id.EditText01); 307 | et.setText(ip); 308 | } 309 | private String intToIp(int i) { 310 | return (i & 0xFF ) + "." + 311 | ((i >> 8 ) & 0xFF) + "." + 312 | ((i >> 16 ) & 0xFF) + "." + 313 | ( i >> 24 & 0xFF) ; 314 | } 315 | 此方法是没有问题的,Android 高低版本都合适 316 | 317 | 2、使用GPRS 318 | 319 | 权限: 320 | 321 | 代码: 322 | //获取本地IP 323 | public static String getLocalIpAddress() { 324 | try { 325 | for (Enumeration en = NetworkInterface 326 | .getNetworkInterfaces(); en.hasMoreElements();) { 327 | NetworkInterface intf = en.nextElement(); 328 | for (Enumeration enumIpAddr = intf 329 | .getInetAddresses(); enumIpAddr.hasMoreElements();) { 330 | InetAddress inetAddress = enumIpAddr.nextElement(); 331 | if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) { 332 | return inetAddress.getHostAddress().toString(); 333 | } 334 | } 335 | } 336 | } catch (SocketException ex) { 337 | Log.e("WifiPreference IpAddress", ex.toString()); 338 | } 339 | return null; 340 | } 341 | ``` 342 | - - - - - 343 | ```java 344 | /** 345 | * X5 WebView 如下设置,加载 word 或者其他网页链接 在退出页面时出现异常的解决办法:onDestroy 方法 346 | */ 347 | WebView x5WebView = new WebView(this); 348 | 349 | WebSettings webSettings = x5WebView.getSettings(); 350 | webSettings.setAllowFileAccess(true); 351 | webSettings.setSupportZoom(true); 352 | webSettings.setUseWideViewPort(true); 353 | webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); 354 | webSettings.setLoadWithOverviewMode(true); 355 | webSettings.setBuiltInZoomControls(true); 356 | webSettings.setSupportMultipleWindows(true); 357 | webSettings.setAppCacheEnabled(true); 358 | webSettings.setDomStorageEnabled(true); 359 | 360 | /** 361 | * 在页面的生命周期方法 onDestroy 做如下判断即可 362 | */ 363 | @Override 364 | protected void onDestroy() { 365 | if (x5WebView != null) { 366 | x5WebView.getSettings().setBuiltInZoomControls(true); 367 | x5WebView.removeAllViews(); 368 | x5WebView.setVisibility(View.GONE); 369 | x5WebView.destroy(); 370 | } 371 | super.onDestroy(); 372 | } 373 | ``` 374 | - - - - - 375 | -------------------------------------------------------------------------------- /codeXiaoSheng17_end.md: -------------------------------------------------------------------------------- 1 | # AndroidSourceCodeXS 2 | Android 旅途路上的一些用得着的资源整理 3 | 4 | ## 公众号 「code小生」 2017推文记录(年终) 5 | 6 | > 对下半年所分享的文章进行整理,[**上半年总结的 98 篇好文请点击这里**](https://github.com/Android-Mu/AndroidSourceCodeXS/blob/master/codeXiaoSheng17_middle.md), 7 | 很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可以查找了。 8 | 9 | ### App 系列(高仿、练手等) 10 | [你好,芒果!使用 RxKotlin 开发的 Dribbble App.](http://mp.weixin.qq.com/s/qcB7qhQfaehvBL-rD7EC8w) 11 | 12 | [分享我学习 Androd 开发过程中写的小项目](http://mp.weixin.qq.com/s/iDAB7akk9QhHq5JrKzq60A) 13 | 14 | [来自大学生投稿:一个适合新手上手的商城项目](http://mp.weixin.qq.com/s/VxpCVlJhU3_QQgHK2HJ9Bg) 15 | 16 | ["DeepNight-in-kotlin"一个纯看妹纸的 Kotlin 开源项目](http://mp.weixin.qq.com/s/gH4O_daurb0pompeDybszw) 17 | 18 | 19 | ### 自定义 / 仿系列 20 | [自定义 View—手把手教你撸出一个圆形加载进度条](http://mp.weixin.qq.com/s/SL2Axl21NVfx9qz-q_CPiw) 21 | 22 | [Android 仿微信朋友圈,缩放归位功能详细解析](http://mp.weixin.qq.com/s/u-XqKMemuDZ-PM8SoD-OWg) 23 | 24 | [玩转仿探探卡片式滑动效果](http://mp.weixin.qq.com/s/XYcXXehUAJIZU_ykmKWG0Q) 25 | 26 | [高仿网易严选底部弹出菜单](http://mp.weixin.qq.com/s/kMozvRYCnEIkIBFLapZKAQ) 27 | 28 | [自定义 Drawable 实现灵动的红鲤鱼动画(上篇)](http://mp.weixin.qq.com/s/j5eW_jqvfA-WLJDFFRun7w) 29 | 30 | [Android 自定义 View 之继承扩展(仿网易云音乐听歌识曲)](http://mp.weixin.qq.com/s/M2ukB2CnNFZhjNx9a8PT0w) 31 | 32 | [Android 高仿懂球帝我是教练效果](http://mp.weixin.qq.com/s/wNQZbhL6nMzCiqGUikK2FQ) 33 | 34 | [Android 上一个类似 PathMenu 效果的自定义 View 源码分析](http://mp.weixin.qq.com/s/bS20UZfnBy4iQtYr_s7Gkw) 35 | 36 | [自定义 View:用贝塞尔曲线绘制酷炫轮廓背景](http://mp.weixin.qq.com/s/SzZuiRMz8QWzNqCjq2gI_A) 37 | 38 | [回炉再造,灵活的 YMenuView 2.0 诞生](http://mp.weixin.qq.com/s/Cl3JHw84L1XBgKBMeveE4A) 39 | 40 | [自定义 LayoutManager 实现弧形以及滑动放大效果 RecyclerView](http://mp.weixin.qq.com/s/VQGx1_Q-7No0gXficmjujw) 41 | 42 | [自定义 View 之炫酷的成绩展示界面](http://mp.weixin.qq.com/s/WamWBViJMNksefxs8xIB_Q) 43 | 44 | [仿知乎内容广告栏 WindowImageView](https://mp.weixin.qq.com/s/VZnDPLzMDD-c7nV0KIWPnQ) 45 | 46 | [仿微信表情输入键盘(支持 Gif 表情图文混排 )](http://mp.weixin.qq.com/s/A-zDgAKx_xkgWkdOHBpeYg) 47 | 48 | 49 | ### 框架/库(封装使用) 50 | [为 Retrofit2 提供的 FastJson 转换库](http://mp.weixin.qq.com/s/2QbqVmh0-5v10E-Ge-3Dog) 51 | 52 | [一步一步带你认识 MVP+Retrofit+Rxjava 并封装(二)](http://mp.weixin.qq.com/s/Iswvq0zoqi9qQp3eGVD7Iw) 53 | 54 | [Android 和 H5 交互-框架篇](http://mp.weixin.qq.com/s/CDinDcARYfOnL4yysspQsQ) 55 | 56 | [大神带你看——fastjson 那些事.pptx](http://mp.weixin.qq.com/s/lOMipMy29MgmnfpgK2iHww) 57 | 58 | [三行代码实现 TabLayout+ViewPager 的 Tab 滑动效果,从封装到开源](http://mp.weixin.qq.com/s/VhrffiRARmYeTlFqrmjmeA) 59 | 60 | [小之的架构之路——Android MVVM 面向接口型框架封装和单元测试](https://mp.weixin.qq.com/s/bOBp7U3BA6CQ7PWjWw979g) 61 | 62 | [少年郎,你需要封装好的 ViewPager 工具类](http://mp.weixin.qq.com/s/UtvhSllW_-59wZjIGaa5FQ) 63 | 64 | 65 | ### 求职 66 | [帝都三年 Java,说说我的求职之路](http://mp.weixin.qq.com/s/Kmi8Xs35vT84GtAjnp5QeA) 67 | 68 | [四步准备 Android 面试](http://mp.weixin.qq.com/s/ysKi_XJ1nAWULJ-N_UCfHg) 69 | 70 | [Android 面试 | 全站式导航](http://mp.weixin.qq.com/s/fTfudY1DBYS5JiSkPnbjAg) 71 | 72 | [值得借鉴:耗时两个月的求职经历](http://mp.weixin.qq.com/s/leuQDDAFvuGZjkdAkmzZHQ) 73 | 74 | [面试官之初体验,请考虑](http://mp.weixin.qq.com/s/IIaQn4veC9_YVJL2fGiYgw) 75 | 76 | [经历的某度的一场面试](http://mp.weixin.qq.com/s/qlSiIJRwPMpPbpji5Lx5uA) 77 | 78 | [一个三本学生的面试之旅](http://mp.weixin.qq.com/s/vqAf6UF99zfIQGDjcjEclA) 79 | 80 | [漫无止境的秋招](http://mp.weixin.qq.com/s/mq1Fo5pD8CLuwpOAKXqnUA) 81 | 82 | 83 | ### 干货 84 | [程序员,你还没有软技能吗?难怪你不幸福](http://mp.weixin.qq.com/s/M6vd26jO4-IccS-DX8k59A) 85 | 86 | [十年的老代码,你敢动?](https://mp.weixin.qq.com/s/-XX02ec-L1z-_ZhwIYGRXA) 87 | 88 | [程序员成长历程的四个阶段](http://mp.weixin.qq.com/s/lUxIXhlRGsJxOBjumTFsYw) 89 | 90 | [2017 | 我在 5 个月时间里分享了 98 篇文章](http://mp.weixin.qq.com/s/Dh5ur11SDXgQAu7jKtDU8A) 91 | 92 | [「译文」资深程序员应该有的样子](http://mp.weixin.qq.com/s/JTIrgQ9PKXHCCejuhi4XeA) 93 | 94 | [预告 | 送书福利](http://mp.weixin.qq.com/s/oa01iVP7aOxBlE36iI0Q7A) 95 | 96 | [非常有用的资源合集-开发设计再也不愁啦](http://mp.weixin.qq.com/s/8hPVS8e2cq3JRpG1mRizww) 97 | 98 | [给编程生涯充电的 10 本书](http://mp.weixin.qq.com/s/Asx_9gNcYely8Yo6oZCmMA) 99 | 100 | [推荐几个开源库](http://mp.weixin.qq.com/s/wpygDxIMzV4SkOr5vqPRZQ) 101 | 102 | 103 | ### 源码分析 104 | [三步掌握 Android 中的 AIDL](http://mp.weixin.qq.com/s/KkGefJxHF_MLlb5K2p-WWg) 105 | 106 | [Android 进阶 - 视图层级实时分析(含福利)](http://mp.weixin.qq.com/s/CkTNrLu0AIDGsPQKIXz-ug) 107 | 108 | 109 | ### 职场 110 | [中国程序员如何升职加薪,也许我们该学学印度人](http://mp.weixin.qq.com/s/aWvYfjvH9fRVP2oRPZvA_A) 111 | 112 | [跃迁:成为高手的技术](http://mp.weixin.qq.com/s/dF1t5v8qxZH8SMkUHAvB8g) 113 | 114 | 115 | ### 经验分享 116 | [程序员应该读的 7 本计算机书](http://mp.weixin.qq.com/s/rRQB1zT1T5vwUpWAdb0Z-g) 117 | 118 | [一个老程序员的建议](http://mp.weixin.qq.com/s/lJliBcfm1YO9gjnMRwgjUQ) 119 | 120 | [Android 新手如何学习开发一款 app?](http://mp.weixin.qq.com/s/ukVT1VjeM_-MgZN7zx_1FQ) 121 | 122 | [种一棵树最好的时间是十年前,其次是现在](http://mp.weixin.qq.com/s/fJNJmLCumyLf06sJsr81CA) 123 | 124 | [30 岁程序员的选择,一线 OR 二线?](http://mp.weixin.qq.com/s/n5A1nkzf0mgd2EXWvbSBSg) 125 | 126 | [软件开发中的 10 条最佳指导原则](http://mp.weixin.qq.com/s/u-XOfzCo7PY51gwol7PfCw) 127 | 128 | [如何打造个人技术影响力](http://mp.weixin.qq.com/s/nGxeJB-fPpOWwg13Ii5H9w) 129 | 130 | [6 天时间修改 1 行代码:现实中的软件开发流程](http://mp.weixin.qq.com/s/2MZ_xBZ1_U4I5sw4pktmAA) 131 | 132 | [程序员、架构师、技术经理、技术总监和 CTO 都是干什么的?](http://mp.weixin.qq.com/s/m5mPLK8qp2KOHdUwUs95kw) 133 | 134 | [如何有效报告 bug](http://mp.weixin.qq.com/s/1X_ZodEa05pOAUS641MITw) 135 | 136 | [我的 10 年自学编程之路](http://mp.weixin.qq.com/s/n9saZOwsBVZebkDWPZ5oQg) 137 | 138 | [别让程序员停止在 35 岁,如何让我们走得更远](http://mp.weixin.qq.com/s/njGNL6F-aHgP6gUo5ouvsw) 139 | 140 | [编程的自学方法](https://mp.weixin.qq.com/s/dsBoZHfsb97owCKiQVIF6g) 141 | 142 | [开除了没情商的“技术大神”后,整个团队都好起来了](http://mp.weixin.qq.com/s/YrfESqAh-hCOLh3fHsstEQ) 143 | 144 | [程序员的五种不同寻常的特质](http://mp.weixin.qq.com/s/PFkE_zM-nrdOeU2fRK3y2Q) 145 | 146 | 147 | ### 完整系列 148 | [Android 开发之漫漫长途Ⅰ—Android 系统的创世之初以及 Activity 的生命周期](http://mp.weixin.qq.com/s/XB7bjkEPz8fcL3qrHadUMg) 149 | 150 | [Android 开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)](http://mp.weixin.qq.com/s/-hgEHOxjcGEgmD0CqUFx3Q) 151 | 152 | [Android 开发之漫漫长途 Ⅲ—Activity 的显示之 Window和View(2)](http://mp.weixin.qq.com/s/YHrubcanydIkbu1PKSHrCw) 153 | 154 | [Android 开发之漫漫长途 Ⅳ——Activity 的显示之 ViewRootImpl 初探](http://mp.weixin.qq.com/s/DKgwS6wkX3xP6ypScDmZUA) 155 | 156 | [Activity 显示之 ViewRootImpl的PreMeasure、WindowLayout、EndMeasure 等方法](http://mp.weixin.qq.com/s/QnW3BRo4_ToL8TLGTHJ1IA) 157 | 158 | 159 | ### 项目中的技术 160 | **Gradle** 161 | [Android 解锁 Gradle 依赖新姿势](https://mp.weixin.qq.com/s/bzfe0CT4jFGVhwE2LZc1Ig) 162 | 163 | [Gradle 的高级技巧](http://mp.weixin.qq.com/s/dSFdnjEq67UIoRixNeFc2w) 164 | 165 | [提速 Android Gradle 构建](http://mp.weixin.qq.com/s/6XhH7_kmzTS6JPwdJ97L7A) 166 | 167 | 168 | **优化/瘦身** 169 | 170 | [Android 性能小技巧](http://mp.weixin.qq.com/s/C8J7BWVufogcCeALkQBGOA) 171 | 172 | [Android APK 瘦身实践](http://mp.weixin.qq.com/s/3IALGEB6YnFb4Wj8Q4JqvA) 173 | 174 | **组件化** 175 | 176 | [Android 组件化 —— 路由设计最佳实践](http://mp.weixin.qq.com/s/f9D8P0VF2cspvfUiIWNb4w) 177 | 178 | [Android 彻底组件化 demo 发布](http://mp.weixin.qq.com/s/aWUixHMhU8g0W4dapr0HPg) 179 | 180 | [Android 彻底组件化番外篇-gradle3.0.0](http://mp.weixin.qq.com/s/kr4SqGcTnWmsQMwHHbLCrw) 181 | 182 | 183 | **小程序** 184 | 185 | [微信小程序实战篇-个人中心](http://mp.weixin.qq.com/s/53wefLCa0113Arka7AuzSA) 186 | 187 | **JVM** 188 | 189 | [Android 进阶之简述 JVM 基础(一):走进Java](http://mp.weixin.qq.com/s/7vwQMEHamHSuDZ4c5DjIoA) 190 | 191 | [Android 精进之简述 JVM 基础(二):Java内存区域与内存溢出异常](https://mp.weixin.qq.com/s/FtgS0VI9xl2-lyYiMniRkA) 192 | 193 | [Android 精进:简述 JVM 基础(三):垃圾收集器与内存分配策略](http://mp.weixin.qq.com/s/1n9ZYKfxwQle7WdvNqUMZg) 194 | 195 | [简述 JVM 基础(四):类结构文件](http://mp.weixin.qq.com/s/Xucw1VeYGgmF9O7T16CVow) 196 | 197 | [简述JVM基础(五):虚拟机类加载机制](http://mp.weixin.qq.com/s/gdfbGETzGA_V5_RqLYXs3g) 198 | 199 | [简述JVM基础(六):虚拟机字节码执行引擎](http://mp.weixin.qq.com/s/ZP4TyBFKmjxRxULhl1NRWA) 200 | 201 | [简述JVM基础(七): Java 内存模型与线程](http://mp.weixin.qq.com/s/8y1FknUY7NcmgNYwVEB7hQ) 202 | 203 | 204 | --- 205 | 206 | [Android 计步模块(类似微信运动)](http://mp.weixin.qq.com/s/M7ksUmf1-L2FdsrJ3dMQpg) 207 | 208 | [HTTP1.0、HTTP1.1 和 HTTP2.0 的区别](http://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A) 209 | 210 | [你被下拉刷新和上拉加载搞烦了吗?](http://mp.weixin.qq.com/s/2-utimMTf2CwgNmbSUaNJA) 211 | 212 | [Android 下实现高效的模糊效果](http://mp.weixin.qq.com/s/WnTkAXXMgT05MqnDL1BeGg) 213 | 214 | [RecyclerView 简单到想哭的多条目实现](http://mp.weixin.qq.com/s/PeECYWvD0W6LeIUn1_ebwA) 215 | 216 | [程序员都该懂点 HTTP](http://mp.weixin.qq.com/s/38GrbReICfu54-nEWylqIQ) 217 | 218 | [WebView 开车指南之最全实用案例](http://mp.weixin.qq.com/s/Tcfjd3OFgeQC-huFCOBP0w) 219 | 220 | [震惊!阿里热更新框架 Sophix 背后隐藏的真相竟然是……](http://mp.weixin.qq.com/s/RSDWeJ-iv9IbKtr2scYXLA) 221 | 222 | [Android 仿微信朋友圈全文、收起功能](http://mp.weixin.qq.com/s/X5jl9pivAYxtwbp02WCUMA) 223 | 224 | [Android 的毛玻璃模糊效果,我使用 OpenCV 来搞](http://mp.weixin.qq.com/s/9DZnjOh31DvJLH7xcNhAuQ) 225 | 226 | [「DragMoreScrollView」一种相册交互效果的实现](http://mp.weixin.qq.com/s/yl0ww0MzKwKb4fN6V3RVZw) 227 | 228 | [关于多选(有动画)解决方案,你需要的可能是这个](http://mp.weixin.qq.com/s/bf0CLdBsCHd67YpaSlX3rA) 229 | 230 | [关于 Android Zxing 3.3.0 的填坑](http://mp.weixin.qq.com/s/08XNoEBmFOmCc-U4nzo8fw) 231 | 232 | [Android 录音功能直接拿去用](http://mp.weixin.qq.com/s/LorIJvuYuTNtMUqUt_uH5Q) 233 | 234 | [Android 实现 dialog 的 3D 翻转](http://mp.weixin.qq.com/s/LEOB83WC5Jn_LT-dWVPSqw) 235 | 236 | [仿房产销冠 APP 销控表界面-多 RecyclerView 同步滚动](http://mp.weixin.qq.com/s/fuX2FotrO9isrYOmd8jo4Q) 237 | 238 | [D 项目 Android 模块化 VCS 演进之路](http://mp.weixin.qq.com/s/BbDYIJ9EKHl_X5vtogqkWQ) 239 | 240 | [使用 ACTION_IMAGE_CAPTURE 可能存在的风险](http://mp.weixin.qq.com/s/MeYkKeDMwrjPEvcU96NR_w) 241 | 242 | [Android 中的工厂模式(减少 if-else 和 switch-case)](http://mp.weixin.qq.com/s/J0uAQy0iMDNBy45TQbUzFA) 243 | 244 | [Android Transition Framework 详解---超炫的动画框架](http://mp.weixin.qq.com/s/4_sjHlIrwzOHiK1Sp4Zgog) 245 | 246 | [Android 一起来看看 7.0 的新特性 FileProvider](http://mp.weixin.qq.com/s/05EIPgg_4LjrRQxPjqG-gg) 247 | 248 | [Android 如何在应用程序一段时间无操作后 退出登录](http://mp.weixin.qq.com/s/3ChfvTgQLzsSU_eedZL8bg) 249 | 250 | [Android Dex 分包](http://mp.weixin.qq.com/s/CYFNKPtRgfnbqJyN4IxE3Q) 251 | 252 | [细细品读 Retrofit 的设计之美一](http://mp.weixin.qq.com/s/I4M1QCxQx49IA-hVjhelKQ) 253 | 254 | [细细品读 Retrofit 的设计之美 二](http://mp.weixin.qq.com/s/ReluZMc73D6-VReFX7CgDQ) 255 | 256 | [Android Binder—APP->framework(mRemote的前世今生)](https://mp.weixin.qq.com/s/qWea3A7e0Tu3vZqJLSCT_w) 257 | 258 | [使用 Dagger2 前你必须了解的一些设计原则](http://mp.weixin.qq.com/s/bCBrz6gISlq_t2BrpuxTkg) 259 | 260 | [在 Android 上,一个完整的 UDP 通信模块应该是怎样的?](http://mp.weixin.qq.com/s/qkrcF7zAVeiY0_KScatIpQ) 261 | 262 | [MediaPlayer 实现金额的语音播报功能](http://mp.weixin.qq.com/s/vuEK1vKJqR1Qx7I44pYeiA) 263 | 264 | [Android 广播的那些事儿](https://mp.weixin.qq.com/s/hAt4saeSLS5MWhHPEkbXrw) 265 | 266 | [视差动画 - 雅虎新闻摘要加载](http://mp.weixin.qq.com/s/fgih9IsLPJbNK8EvQt6YBw) 267 | 268 | [Android App 自动化测试: OPEN-STF环境搭建](http://mp.weixin.qq.com/s/JNHKJfnW74tDeVilIfnfMg) 269 | 270 | [一个容错的 Gson 新世界](http://mp.weixin.qq.com/s/bvu_5odxqpDXzAwHctNXfw) 271 | 272 | [Android 谈谈自动化测试](http://mp.weixin.qq.com/s/-0e1wd2iveQPMWgGFcmOwQ) 273 | 274 | [Android•Lottie 动画库填坑记](http://mp.weixin.qq.com/s/ipu32zPjaHeqICgOGqct9g) 275 | 276 | [MixPanel -Android 端埋点技术研究](http://mp.weixin.qq.com/s/uzvzF2owmw_g5vP-Np7x5w) 277 | 278 | [视频播放技术汇总(列表播放,小窗播放,跨界面播放,播放中网络切换提示)](http://mp.weixin.qq.com/s/_4CXBIjVcOld76523ZGzFA) 279 | 280 | [巧用 Fragment,解耦 Android6.0 权限适配手记](http://mp.weixin.qq.com/s/UPU-suPWvPFWG42ZWDWKkw) 281 | 282 | [漫画:什么是B-树?](http://mp.weixin.qq.com/s/w4BU3P1909n7iPcqk68N7Q) 283 | 284 | [微信 Tinker 在 Android 中集成以及使用](http://mp.weixin.qq.com/s/MFpvNeVHuv2J4m_Wz-NZbw) 285 | 286 | [Android 端“被挤下线”功能的实现](http://mp.weixin.qq.com/s/rGOosMyAIVvbafj1vXpj8A) 287 | 288 | [Android 手机 全面屏(18:9屏幕)适配指南](http://mp.weixin.qq.com/s/UfqJ0suGkoxrZiSdTn8Lpw) 289 | 290 | [Android 借助 Python 实现自动打包上传 fir](http://mp.weixin.qq.com/s/BUht6BR0T0yAi6RrAVIwQA) 291 | 292 | [带你通俗易懂的理解——线程、多线程与线程池](http://mp.weixin.qq.com/s/mA59X7bOotyWwvf2V6zMIA) 293 | 294 | [Android NFC 技术解析,附 Demo 源码](https://mp.weixin.qq.com/s/lVvvIGapceFrT7_oo_rPBw) 295 | 296 | [Android 中.aar文件生成方法与用法](http://mp.weixin.qq.com/s/NN5pJNoUXGRZJJL5yBEQ4A) 297 | 298 | [Android 键盘适配-中英文适配](http://mp.weixin.qq.com/s/Yncr0XZ4MCWZH2vzTVyYJw) 299 | 300 | [软件开发知识体系](http://mp.weixin.qq.com/s/A5n9PG0aUl2z2z3zakZF3A) 301 | 302 | [热修复——Tinker 的集成与使用](http://mp.weixin.qq.com/s/xpB_ipYv9cN8k8fdr_7wCw) 303 | 304 | [AndroidStudio JNI详细教程+Gradle3.0 以上 JNI 爬坑之旅](http://mp.weixin.qq.com/s/hdWjr7A7wiSoHKI3VnsT5w) 305 | 306 | [热修复——Bugly 让热修复变得如此简单](http://mp.weixin.qq.com/s/rv7cUIOoLx60QZisAG0yyg) 307 | 308 | [Android Lint增量扫描实战纪要](http://mp.weixin.qq.com/s/RMz0y0nXatupoUomoWOtmQ) 309 | 310 | [理解 Android 硬件加速原理的小白文](http://mp.weixin.qq.com/s/Xodc0Eg7_rn24OdKRbntSA) 311 | 312 | -------------------------------------------------------------------------------- /codeXiaoSheng17_middle.md: -------------------------------------------------------------------------------- 1 | # AndroidSourceCodeXS 2 | Android 旅途路上的一些用得着的资源整理 3 | 4 | ## 公众号 code小生 2017推文记录(半年总结) 5 | 6 | > 对上半年所分享的文章进行一个整理,很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可以查找了。[下半年不断更新...](https://github.com/Android-Mu/AndroidSourceCodeXS/blob/master/codeXiaoSheng17_end.md) 7 | 8 | ### App 系列(高仿、练手等) 9 | [**SmartRecom:一款干货满满,助你进阶的 App 项目**](http://mp.weixin.qq.com/s/u8oo7cdb-sqtge4jVw8lbg) 10 | 11 | [**Android 仿今日头条的开源项目**](http://mp.weixin.qq.com/s/xdFskas_X4FwCqUES-JAjQ) 12 | 13 | [**手把手教你从零开始做一个好看的 APP**](http://mp.weixin.qq.com/s/jOW40fpAlNGvrOfQe9vJyA) 14 | 15 | [**KeepGank.IO - 又一款开源 Gank.IO 客户端. 欢迎 star**](http://mp.weixin.qq.com/s/twunvTc8IY9tSoC7kc-SXg) 16 | 17 | [**一个用来巩固 Android 基础的 APP**](http://mp.weixin.qq.com/s/K6wVgsn4MI0mx2cwKWFPUw) 18 | 19 | [**jsoup爬虫简书首页数据做个小Demo**](http://mp.weixin.qq.com/s/8QcXFaBLsgUiSRH2Gy_szQ) 20 | 21 | [**快毕业了,撸一个小项目(新闻段子客户端)**](http://mp.weixin.qq.com/s/gMzDv_sCJS6Vzx76liI-Rg) 22 | 23 | [**Android 一款十分简洁、优雅的日记APP**](https://mp.weixin.qq.com/s/0hMV7IMei74LTuUmFQ1Snw) 24 | 25 | ### 自定义 / 仿系列 26 | [**仿 Nice 首页图片列表 9 图样式,并实现拖拽效果**](http://mp.weixin.qq.com/s/XBM7eYuFl7I8mNCTizKuyA) 27 | 28 | [**仿简书动态 searchview 的实现,代码就这么多点**](http://mp.weixin.qq.com/s/YIYDVyDLeevHRJ0tZfs1_A) 29 | [ 30 | **Android 使用 Path 仿支付宝支付成功失败动画**](http://mp.weixin.qq.com/s/76yng2hofs0DBaKq55Ufjg) 31 | 32 | [**Android 仿 QQ 侧滑菜单**](http://mp.weixin.qq.com/s/mgU5M9mR_gZa5K-L92ZjBA) 33 | 34 | [**京东快报轮播公告的实现**](http://mp.weixin.qq.com/s/dmGzlEYn7fOk1LakiIrEAw) 35 | 36 | [**[Android] 自定义 View 之仿 QQ 讨论组头像**](http://mp.weixin.qq.com/s/0WSfWzoX9MnUOj79_P7pig) 37 | 38 | [**一步步教你画股票图,K 线图,高仿雪球股票**](http://mp.weixin.qq.com/s/1YjGkgGKpMSYDdkSu18ZUQ) 39 | 40 | [**Android 自定义控件(仿天猫搜索框)**](http://mp.weixin.qq.com/s/zxSd9AMAItocZJczW4FxDA) 41 | 42 | [**自定义圆环百分占比 view (label 文字支持自动换行和设置显示行数)**](http://mp.weixin.qq.com/s/1IYsvApJERkPU-10keJ8-w) 43 | 44 | [**Android 仿 instagram 和微博的头像点击加载动画**](http://mp.weixin.qq.com/s/Ii1brow3qiEOxrdCHehImw) 45 | 46 | [**真正的画廊,左右条目可点击居中,左右条目可滑动**](http://mp.weixin.qq.com/s/xtw6OjMhn1o4eW8tiHQD5g) 47 | 48 | [**从未如此惊艳!你好,SuperTextView**](http://mp.weixin.qq.com/s/5eZxtu-_O0_hqW2b_prK_g) 49 | 50 | [**Android 撸起袖子,自己封装 DialogFragment**](http://mp.weixin.qq.com/s/jwxfcvgnoIFViJ6Bcb8V1w) 51 | 52 | [**类似 QQ 的文件管理器**](https://mp.weixin.qq.com/s/e7otNLqCSBW9rz4ChLx_cg) 53 | 54 | [**Android 模仿微信选择图片**](http://mp.weixin.qq.com/s/e5cG1soYm7m2KMB2PnTiqw) 55 | 56 | [**教你手写一个贝塞尔曲线效果的 Loading View**](http://mp.weixin.qq.com/s/ZK7BDlK8dE2oRqieGvBXew) 57 | 58 | [**仿简书长按文章生成图片效果**](http://mp.weixin.qq.com/s/sSIrHOChrgi6ccFKWm80uQ) 59 | 60 | [**Android自定义view之属性动画熟悉**](http://mp.weixin.qq.com/s/9AvvuKkiW8tveiEVQ0y5oA) 61 | 62 | [**Android自定义控件之天气视图**](http://mp.weixin.qq.com/s/-Up4UwJiS2UQ_hS5yefd4Q) 63 | 64 | [**手把手教你打造RecyclerView滚动特效**](http://mp.weixin.qq.com/s/SCaWJFRMI4oVIJLOvGYw7Q) 65 | 66 | ### 框架/库(封装使用) 67 | [**一步一步带你认识 MVP+Retrofit+Rxjava 并封装(一)**](http://mp.weixin.qq.com/s/VJHbdNc4HmEvk0LNK8tftg) 68 | 69 | [**Android 基于 glide 4.0 封装图片加载库**](http://mp.weixin.qq.com/s/7VK9CLvJ-ZMW0dLHs6qJVg) 70 | 71 | [**MVP+多线程+断点续传 实现 app 在线升级库 (手把手教你打造自己的 lib)**](http://mp.weixin.qq.com/s/r47F32QY9olF6wVAF3d-0Q) 72 | 73 | [**教你打造 Android 揭面水波动画库-AnimationHelper**](http://mp.weixin.qq.com/s/Dx7u7sxI-lBSCbokKWUHHg) 74 | 75 | [**【Android】Realm 详解**](http://mp.weixin.qq.com/s/mbZsvdImJE_RszoK1vMjGg) 76 | 77 | [**Retrofit2+okhttp3缓存设置**](http://mp.weixin.qq.com/s/JMd8_62yNhN9VCzlt13PZg) 78 | 79 | [**阿里巴巴推出超强针对布局方案和布局复用的开源框架(vlayout)**](http://mp.weixin.qq.com/s/BYtF_Kzy7OWePJRNpfoHWQ) 80 | 81 | [**Android 实现一个简单的下载工具**](http://mp.weixin.qq.com/s/9WYNEhQ2NpK_dh6fOXeuFQ) 82 | 83 | [**Android架构那些事之第三方库的隔离**](http://mp.weixin.qq.com/s/Q-H30R1jQinbaB3jYowOZQ) 84 | 85 | 86 | ### 求职 87 | [**2017 年 Android 曲折的求职之路**](http://mp.weixin.qq.com/s/N8EcP9dV1LWzkQDNRF2YOg) 88 | 89 | [**2017 Android 暑期实习生面试经验谈**](https://mp.weixin.qq.com/s/HjUOj7M9b94w97ROh8T91g) 90 | 91 | [**杭州找 Android 工作的点点滴滴**](http://mp.weixin.qq.com/s/86ejicK5BBo3LYoAEBlhaA) 92 | 93 | [**那些IT培训出来的Android工程师,希望你面试时涨点记性**](http://mp.weixin.qq.com/s/wd2vaDa1Pi3DpAXDjbebgA) 94 | 95 | [**为跳槽的你献计献策(Android)**](http://mp.weixin.qq.com/s/NiRoLfuN4B2PeNLlQpieNw) 96 | 97 | ### 干货 98 | [**瓶颈:没有技术深度的苦恼**](http://mp.weixin.qq.com/s/GuiP2dmkM9z8rzzxdn3Pww) 99 | 100 | [**良心推荐:总结 Android 开发中必备的代码 Review 清单**](http://mp.weixin.qq.com/s/0U733-oOv6HTW-tmhWi4Vw) 101 | 102 | [**想编程,是勤奋自学还是去培训班学习?**](https://mp.weixin.qq.com/s/bRKqNu6AntHAooCJg2VZJg) 103 | 104 | [**编程之旅,致新入行的朋友**](https://mp.weixin.qq.com/s/TBhccRDmI47e2vl8TcX4SA) 105 | 106 | [**程序员,你还没有软技能吗?难怪你不幸福**](http://mp.weixin.qq.com/s/M6vd26jO4-IccS-DX8k59A) 107 | 108 | [**2017,你绝对想尝试的新安卓库**](https://mp.weixin.qq.com/s/-O8G1wInED5PhMOo_d6KOg) 109 | 110 | [**[干货]Android 中的 Calendar,听说你有这样的需求**](http://mp.weixin.qq.com/s/w_NiEJLx0AECepZ8cRhzsg) 111 | 112 | [**变革者——献给所有软件开发自学者**](http://mp.weixin.qq.com/s/B_I5Q75Bp1z0am-5wqKeXQ) 113 | 114 | ### 源码分析 115 | [**Android 之 Context 底层原理**](http://mp.weixin.qq.com/s/mkSJKT7zbzcSlY4GQ_v-9Q) 116 | 117 | [**可能是讲解 Binder 机制最好的文章**](http://mp.weixin.qq.com/s/pPrfIq-8yV5CnbIIKprm7Q) 118 | 119 | [**全栈级别梳理-Android系统启动流程**](http://mp.weixin.qq.com/s/vZsqyfL4ss2sMLr_nZLcow) 120 | 121 | [**浅析HandlerThread**](http://mp.weixin.qq.com/s/eZnhFc-U6QW2bfGz3ppYOA) 122 | 123 | [**源码分析之LayoutInflater**](http://mp.weixin.qq.com/s/Xkx4OJ2ed-itqGfzD-538Q) 124 | 125 | ### 职场 126 | [**程序员如何选择未来的职业路线**](http://mp.weixin.qq.com/s/u9xrlRvSPrH9KYpVWYIxcQ) 127 | 128 | [**【转】程序员该如何定位?看这四大方向**](http://mp.weixin.qq.com/s/8jMnBGEoHegQ-rMIj1C2kA) 129 | 130 | ### 经验分享 131 | [**程序员之路-学习经验总结分享**](http://mp.weixin.qq.com/s/0U3DHX60c2rYHUX01iagMw) 132 | 133 | [**如何提升你的能力?给年轻程序员的几条建议**](http://mp.weixin.qq.com/s/0azo-znEXajF2R54g_0q3g) 134 | 135 | [**给一年左右经验想去大厂的同学们的一些建议**](https://mp.weixin.qq.com/s/z-BbaMOYkGU0AF8_x6EpJg) 136 | 137 | [**Android 技术总监应该干的那些事**](http://mp.weixin.qq.com/s/o4ac8J8gC60__9hFkOzvkw) 138 | 139 | ### 完整系列 140 | #### NDK 141 | [**Android NDK 开发之旅 1--C 语言基础--基本数据类型**](http://mp.weixin.qq.com/s/Lhtk02a3tVeM5Zn5Hrv6Nw) 142 | 143 | [**Android NDK 开发之旅 2--C 语言基础--指针**](http://mp.weixin.qq.com/s/6VGYIzs32A1KmiNIGrqqQg) 144 | 145 | [**Android NDK 开发之旅 3 -- C 语言基础--内存分配**](http://mp.weixin.qq.com/s/-GpOZQaMspA_uNvef0UwnQ) 146 | 147 | [**Android NDK 开发之旅 4--C 语言基础--字符串**](http://mp.weixin.qq.com/s/ULWt4FxksS2BvPnkN2745A) 148 | 149 | [**Android NDK 开发之旅 5--C 语言基础--结构体**](http://mp.weixin.qq.com/s/JHA3dZd6YprJtWhRYMLsFA) 150 | 151 | [**Android NDK 开发之旅 6--C 语言基础--联合体与枚举**](http://mp.weixin.qq.com/s/_OyWzA1iCRiw2zTamQlOjw) 152 | 153 | [**Android NDK 开发之旅 7--C 语言基础--IO**](http://mp.weixin.qq.com/s/uOZ5TGaaGVWgs8lvLn9F-g) 154 | 155 | [**Android NDK 开发之旅 8--C 语言基础--预编译**](http://mp.weixin.qq.com/s/xlmo7xypqvDLVoM5H8_Uhg) 156 | 157 | [**Android NDK 开发之旅 9--JNI--JNI 开发流程**](http://mp.weixin.qq.com/s/LhhLa2x_vG6qRtNb3mek_w) 158 | 159 | [**Android NDK 开发之旅 10—14**](http://mp.weixin.qq.com/s/-lhGXHhPIpQ9G1Bo7-5rmw) 160 | 161 | #### RxJava 162 | [**给初学者的 RxJava2.0 教程**](http://mp.weixin.qq.com/s/Az0RzhKCPA0YQUym7RyIcQ) 163 | 164 | #### 设计模式 165 | [**开发中的设计模式总结**](http://mp.weixin.qq.com/s/XpJMsamUYz0YpKjXIcbR3A) 166 | 167 | ### 项目中的技术 168 | [**Android Kotlin&BLE(低功耗蓝牙) 笔记**](https://mp.weixin.qq.com/s/D_zp1036eufuYCjPpR4FDw) 169 | 170 | [**Kotlin Primer·第六章·集合泛型与操作符**](http://mp.weixin.qq.com/s/JTvj6srNjvy4Ex-_ZfVY9Q) 171 | 172 | [**优雅地刷新 RecyclerView**](http://mp.weixin.qq.com/s/NXiLi3nGa2sCAUtzzHjurQ) 173 | 174 | [**App 竞品技术分析(系列)**](http://mp.weixin.qq.com/s/_9D38SOYReTCHzYnpd0tVg) 175 | 176 | [**Glide 加载图片实现进度条效果**](https://mp.weixin.qq.com/s/QNk4UrTfPc9CkiF3b3fdQA) 177 | 178 | [**Android 模块化探索与实践**](http://mp.weixin.qq.com/s/A9uVEyXEZJ-z7wOSTS5_0Q) 179 | 180 | [**Android 让你的布局飞起来**](http://mp.weixin.qq.com/s/j-uSXSVh8bLLuiBH6dk1sA) 181 | 182 | [**项目需求讨论-RecycleView 分页加载实现分析**](http://mp.weixin.qq.com/s/6CbpduZKUCgHiy0pp1cahA) 183 | 184 | [**Android 搜索结果显示高亮(有数据滑动底部自动刷新)**](http://mp.weixin.qq.com/s/u0e0OlJuhiJz3ca_fTJgzQ) 185 | 186 | [**Android 通用的下拉刷新,重温事件传递**](http://mp.weixin.qq.com/s/t53INi1kEZggXwLGCioqqA) 187 | 188 | [**Android 检查版本升级应该怎么做?**](https://mp.weixin.qq.com/s/W8wRz_qtTTldslVpzgcu0A) 189 | 190 | [**Android 夜间模式换肤**](http://mp.weixin.qq.com/s/WcG_LKwPy-qQ-NaY1JyUKg) 191 | 192 | [**Android 选择图片上传功能【支持多选拍照预览等】**](http://mp.weixin.qq.com/s/0nfnbCZMM5bKpaG3169CBw) 193 | 194 | [**聊聊安卓 App 里的搜索**](http://mp.weixin.qq.com/s/oz0d5mOfqhgkCe6fjVmvMw) 195 | 196 | [**分享一种 RecyclerView 滑动到底部自动加载的实现方案**](http://mp.weixin.qq.com/s/Oivap3YCeT5IXsVpl7n-lQ) 197 | 198 | [**Android 中使用 RecyclerView + SnapHelper 实现类似 ViewPager 效果**](http://mp.weixin.qq.com/s/DMksgHOuGWhztESGfDgucA) 199 | 200 | [**加快 apk 的构建速度,如何把编译时间从 130 秒降到 17 秒**](http://mp.weixin.qq.com/s/TYBDXB-cYwkn8fQGSNTu3g) 201 | 202 | [**Android 优化 APP 构建速度的 17 条建议**](http://mp.weixin.qq.com/s/2PoLfcnDYmVRSuhImHJDRQ) 203 | 204 | [**Android应用瘦身,从18MB到12.5MB**](http://mp.weixin.qq.com/s/EEuhjTWkLNrUBnS_WIISmw) 205 | 206 | [**细细品读!深入浅出,官方文档看ConstraintLayout**](http://mp.weixin.qq.com/s/kFPDThFZo7ZGOBLUv22myQ) 207 | 208 | [**安卓中如何给按钮添加点击音效**](http://mp.weixin.qq.com/s/tRCtm6xf48ujVyjrK71BeA) 209 | 210 | [**知乎和简书的夜间模式实现套路**](http://mp.weixin.qq.com/s/2IIx-KMET2hN5wVi1X86pA) 211 | 212 | [**学会这两招,再敲代码,才给力**](http://mp.weixin.qq.com/s/IO-nDY_gMBpSRAOqFPKwCg) 213 | 214 | [**使用 Scalpel 3D展示界面布局**](http://mp.weixin.qq.com/s/RfFIxjHvjodCiihaUpeorw) 215 | 216 | [**Android 时间轴的实现(RecyclerView更简单)**](http://mp.weixin.qq.com/s/pJlXVmlPrfcvOPBqqaFvXA) 217 | -------------------------------------------------------------------------------- /codexiaosheng18.md: -------------------------------------------------------------------------------- 1 | ### 2017 文章合集 2 | 3 | [2017 年度文章分类整理](https://blog.csdn.net/wufeng55/article/details/78942859) 4 | 5 |  6 | 7 | 下面是 2018 年公众号所发表的文章分类整理 8 | 9 | ### 面经 10 | 11 | [一年经验 Android 面试记录](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486756&idx=1&sn=1f07f1afa2c0c6577c7355d3aa736acc&chksm=97f6b390a0813a861b54af2437b71caa552f010cb740cffdf5668fa88a370c7047cd85724b84&scene=21#wechat_redirect) 12 | 13 | [记自己 2018 年三月份的面试经历](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486829&idx=1&sn=18ade53089ea0303899e3305b9621c6f&chksm=97f6b3d9a0813acf2c5e84dd82389c9f4c736b8a898b8269ca867fff396a81175cd2d950dd0e&scene=21#wechat_redirect) 14 | 15 | [怎样在 Android 面试中聊聊多线程](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486835&idx=1&sn=664317772ecefdc9ebe30396e0f1c526&chksm=97f6b3c7a0813ad1dd31094a5049cd2a2cbf2cf83d09a3d5be3fa7b57b9bf81ad60198fddb8f&scene=21#wechat_redirect) 16 | 17 | [2018 Android ;面试心得,已拿到 offer](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486871&idx=1&sn=aaf0da72673637f4d8db4aedad09cc8e&chksm=97f6b323a0813a35e193877855b666b1c95817ccfac57e0cd384621ef4f565547505f82252f2&scene=21#wechat_redirect) 18 | 19 | [从技术面试官的角度谈谈简历和面试那些事儿](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486942&idx=1&sn=ab43189166cf09db7073b70d729748e1&chksm=97f6b36aa0813a7c34ece4d544344559d7c0b66a8ad91e03150d82356c1637c9c5c8270ea6d8&scene=21#wechat_redirect) 20 | 21 | [Android开发面试经—常见面试官提问Android题](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487411&idx=1&sn=b72ce32a6e57841c132f7b0510e9fbbf&chksm=97f6b107a0813811c5fc7ba7117d4677fb28915cd75d8f80d005f1f1233e6ff97925437d039a&scene=21#wechat_redirect) 22 | 23 | [蚂蚁金服面试经历-临场发挥](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487444&idx=1&sn=34b3294089639032d6e3709136bbc2aa&chksm=97f6b160a08138767e2bef423764311ad32605b8eaa1cad4e5aac0c43522453144251bf4cf21&scene=21#wechat_redirect) 24 | 25 | [OPPO Android 开发技术面总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487726&idx=1&sn=1f883e8c20c60eef2217c80d48f57c5f&chksm=97f6ae5aa081274ca7167dd8227129512a31501fdb18f861f81c608b84df6cdba8104e97ce13&scene=21#wechat_redirect) 26 | 27 | 28 | 29 | ### 项目、开源库 30 | 31 | [碎阅:一款基于 douban 及 ONE API 开发的资讯类 App](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486782&idx=1&sn=b92af64d826dea20693d8ce8faa73102&chksm=97f6b38aa0813a9cf5396bbc8b0c90dbdd3c9845025d0d0a9691b44f9b4ec67d52a0f44b8aff&scene=21#wechat_redirect) 32 | 33 | [Android 权限-HaloPermission 详细介绍](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486881&idx=1&sn=254fe7c01e39a3811089194e8cbfb9a5&chksm=97f6b315a0813a032b4c431f6186ddd8e4c24e64ae9b15c10bfd3c32c2b47a079321e04cb73a&scene=21#wechat_redirect) 34 | 35 | [年中 Android 开源库推荐](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487013&idx=1&sn=00d45c988dfa7339c6d8911704848683&chksm=97f6b091a08139877a1b896ba1ceea14b173add6d7e30f17b47b172e3cdd8c171e59e44b28da&scene=21#wechat_redirect) 36 | 37 | [Android断点续传下载器JarvisDownloader](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487146&idx=1&sn=2001d56a1b6c5f283637b8d8f690309e&chksm=97f6b01ea081390872fd81d9af173ecca7f264377a9e5d885d550f20e253385144c0de8d9c70&scene=21#wechat_redirect) 38 | 39 | [行万里路:打造一个灵活易用的Banner组件](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487205&idx=1&sn=efc692ea1109b43089f13600ae3949b2&chksm=97f6b051a0813947524a5a079e59b00f1dc2c77f893fb01d07954203d78b3bbb6e3854319d38&scene=21#wechat_redirect) 40 | 41 | [Android开发之漫漫长途XVI——ListView与RecyclerView项目实战](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487350&idx=1&sn=23d27553af7fc8bdd83c44b37ee95f03&chksm=97f6b1c2a08138d4c535e5be573a90d678343e05de4f6cb61e24bd236263434ab581589038af&scene=21#wechat_redirect) 42 | 43 | [Android人脸识别app——基于Face++,MVP+Retofit+RxJava+Dagger高度解耦](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487353&idx=1&sn=6441e7f5788f6152b9f3289e3fe091fa&chksm=97f6b1cda08138dbc9a10bb4662e2bd911194befaa9d06d99c72b8a5638a7333289a9d787709&scene=21#wechat_redirect) 44 | 45 | [首个hybird商业项目踩坑总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487499&idx=1&sn=de2f30a605f752a115d8f77b10c59c4b&chksm=97f6aebfa08127a9bf4e79e596967e959d0168f193ae240212c4433d0b58ff0c483735852989&scene=21#wechat_redirect) 46 | 47 | 48 | 49 | ### 功能 Demo 50 | 51 | [实现城市列表的排序及模糊查询](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486422&idx=1&sn=0375f1630e95c207ee81aa78061851d5&chksm=97f6b562a0813c742ad7b78381cb9d4973b224e7bcad8677918095ac535260d56aa3f0c2e495&scene=21#wechat_redirect) 52 | 53 | [基于 zxing 的二维码扫描](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486457&idx=1&sn=f238cd165e6490f8b6a6211e557da1b4&chksm=97f6b54da0813c5bcc6294650bb3140de5e1d7ad0c10786aeca419fc5ef8640b7ccbc0dd2ba4&scene=21#wechat_redirect) 54 | 55 | [[Android进阶\]OFO首页实现小窥](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486469&idx=1&sn=255fab2c72bc839928c812f4e3924b3b&chksm=97f6b2b1a0813ba709c09f0b55e46bb646d8a7fb7525dd59f4819c861bdb0a75c6e61b43c71a&scene=21#wechat_redirect) 56 | 57 | [Android 自己开发的消息事件小项目DBus](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486514&idx=1&sn=e9e68fb2ec967c55125a88562604de4a&chksm=97f6b286a0813b9069bc2b22450f14df8f0f457b92916d0702eff1e369f8787a420e2845b6c1&scene=21#wechat_redirect) 58 | 59 | [教你用Java来玩答题(百万英雄/冲刺大会等)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486520&idx=1&sn=88b3df003a3de815fdf74dd16a675f9b&chksm=97f6b28ca0813b9a8368bd15aa4be97c9af95ae6341d1125bbf7d404e0a0c41c6bb86505a965&scene=21#wechat_redirect) 60 | 61 | ["巧"仿蚂蚁森林水滴动效](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486588&idx=1&sn=66d11acd21409e828aadef10aa765d1a&chksm=97f6b2c8a0813bde7a37357756741534cad906fd7fa9d5e529292b17258cc09dc20b064e7320&scene=21#wechat_redirect) 62 | 63 | [Charles - Android 多媒体选择器](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486623&idx=1&sn=8077efd65bfff257c4423525413e1432&chksm=97f6b22ba0813b3dcb19d123270a9d1810fc67ec8262f480d17c731122daee65e7f353c8b90f&scene=21#wechat_redirect) 64 | 65 | [Android 语音播报实现方案(无SDK)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486626&idx=1&sn=f252ab89c0d8ae94f519ee74469f5540&chksm=97f6b216a0813b0064aa7a239ffc49c32004276a4c508ee426e12b498e5be7a98ae54a5b2f19&scene=21#wechat_redirect) 66 | 67 | [Android Oss 上传图片的使用](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486760&idx=1&sn=c8e896c4f08fb8ec1c86ab6406a07e78&chksm=97f6b39ca0813a8aca64fd7898db91b7e7ce33920ef2910229b2be44372743630844a35ab938&scene=21#wechat_redirect) 68 | 69 | [教你打造好用KeyBoard(附代码库)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486945&idx=1&sn=1e0e427d7a4a870e29fe0be9c4f781bd&chksm=97f6b355a0813a438a53d4f51b3e578240b3fab31b56a3b3abef8d719ca6d1846df389a7569f&scene=21#wechat_redirect) 70 | 71 | [3D版翻页公告效果](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486946&idx=1&sn=021cbc3a7ac999925a1e889a6c4c5ef3&chksm=97f6b356a0813a40d3c1f069cf508166fefe86e2f8eacd01589692eac5b2695ee0a3e53c961d&scene=21#wechat_redirect) 72 | 73 | [好用解耦的Pin码应用锁(附代码库)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486973&idx=1&sn=8fcf7100d3fc7534c1bb0e64c9cba709&chksm=97f6b349a0813a5f63215debf2b9381fbbcbe98fded568a90fb61f085b7f44a3ce261a5ae1d5&scene=21#wechat_redirect) 74 | 75 | [Android瀑布流优化,解决Recyclerview展示大批量图片时Item自动切换、闪烁、空白等问题](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486968&idx=1&sn=699c2c670933ca49ed1a1002d18c6f5f&chksm=97f6b34ca0813a5a5bed7238aa149dcce35a4f834690b1bab31f1d3641ebd28d8cdf29e01ffe&scene=21#wechat_redirect) 76 | 77 | [Android 仿支付宝城市服务栏目tab选择滑动子View效果](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487014&idx=1&sn=d52911b24beaff6a76ee1d3bab3609bc&chksm=97f6b092a08139843b9a751bdb4ec7fa58f6bd942ea1f1e099abe4b5a5e7c3619b6b2d45dc3d&scene=21#wechat_redirect) 78 | 79 | [Android照片墙应用](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487067&idx=1&sn=63d9410d851c874ac5dd24662dde3110&chksm=97f6b0efa08139f91a71c0189b3b4a170d7134dd8a79f6fc7352ad763e58db0e946c5de6046a&scene=21#wechat_redirect) 80 | 81 | [LayoutTransiton实现简单的录制按钮](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487064&idx=1&sn=59082adf46470cd80a9e9ab5b0caa0b9&chksm=97f6b0eca08139fac27323b3b153abab246c6a07221354bab232a76cc8f26d49f4fbd1577e48&scene=21#wechat_redirect) 82 | 83 | [Activity添加滑动关闭功能-[Android_YangKe\]](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487135&idx=1&sn=b81f40d83c1c3c3bad4a37870e66dce9&chksm=97f6b02ba081393df49f973cd027266a6f97002d70c24d351633336b966571468755003fd8dd&scene=21#wechat_redirect) 84 | 85 | [高仿贝壳找房之使用陀螺仪移动图片Drawable](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487134&idx=1&sn=911efca329c2553694a70a68870f9a98&chksm=97f6b02aa081393cbc48f7c1cd5b7a594e4b3711b027614cce5b2af24ea75becb79c7e62fc9a&scene=21#wechat_redirect) 86 | 87 | [RecyclerView点击item图片,从点击位置,放大到全屏,再次点击关闭](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487144&idx=1&sn=f6844a6e4f10170ae37b93e7b8d2d62e&chksm=97f6b01ca081390a6b5d62ff28d4380f0cd0a79e7b2e112f19d999e23b0df7dfd633dace5506&scene=21#wechat_redirect) 88 | 89 | [Android自定义频道选择器、频道定制](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487195&idx=1&sn=b6f4fb8b6bb41b34924ffccfe1ad5f2d&chksm=97f6b06fa0813979ca6fe00b56b0f735a408a61b179e8674b6ebfc86bb5807367244cf4c4283&scene=21#wechat_redirect) 90 | 91 | [长图片自动循环滚动效果 (仿小红书)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487209&idx=1&sn=a992eaf778a08ffe97519fc6f3949f08&chksm=97f6b05da081394b3e829e0a6572edd7be99bfc413bf7ec1821a0f7d353f5446a4729aae5970&scene=21#wechat_redirect) 92 | 93 | [用RecyclerView的LayoutManager实现grid整页翻页效果](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487332&idx=1&sn=c79ab43087a54b0aa240ffaceaa64c06&chksm=97f6b1d0a08138c6058df724a18cb1cfd704d21127d19f1dbaed773da27b11bb3baf8fcb9082&scene=21#wechat_redirect) 94 | 95 | [基于 opencv 实现人脸检测](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487515&idx=1&sn=c0c46e2af702cab4694f7ba3ae772da0&chksm=97f6aeafa08127b9940d2451b43190ef8a676823c1b3c8e8fc87f55aa2c1d3f5dd36270085f1&scene=21#wechat_redirect) 96 | 97 | 98 | 99 | ### Kotlin 100 | 101 | [使用 Kotlin 实现自定义 LayoutManager+ItemTouchHelper 实现炫酷卡片布局](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486624&idx=1&sn=152c1605188446ddd8dc865a1a7f2d5c&chksm=97f6b214a0813b02e916688746b7a134e45843fa7f8c9a65cf699e93b02599c3095e1d85c51b&scene=21#wechat_redirect) 102 | 103 | [号外!号外!全网第一手Android P刘海屏适配大揭秘,唯一Kotlin算法](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486958&idx=1&sn=efedaaddc94a85a013075d3d5fe95578&chksm=97f6b35aa0813a4cd9ec6cae7b7bb33ce55b59a3f846a1463595c8960cad9ab7980c79f1286a&scene=21#wechat_redirect) 104 | 105 | [用 Kotlin 编写的 MVP+RxJava+Retrofit 黄历 demo](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487282&idx=1&sn=b8f0072360fb141e79ebdebc9e012f1d&chksm=97f6b186a0813890387128a394a84e6fcc86ede254913a762ce12049db126528298674580ed6&scene=21#wechat_redirect) 106 | 107 | 108 | 109 | ### Gradle 110 | 111 | [Android Gradle 多渠道打包](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486694&idx=1&sn=f6114223b83e15921ec68fd7a577713d&chksm=97f6b252a0813b44413b908796e4d41846c79ba374cd1af5f198db9f7c08812a05f638794400&scene=21#wechat_redirect) 112 | 113 | [Gradle基础知识点总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487132&idx=1&sn=c0ebeee4c777edabf7006c39df7c7dfa&chksm=97f6b028a081393e9aa649261b95333dc31d9a9f92b8b934d89e168f2c9759b06b1972634f70&scene=21#wechat_redirect) 114 | 115 | [Gradle构建的生命周期和其对象的理解](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487784&idx=1&sn=88c496f6910c02e5e03be734121d02c4&chksm=97f6af9ca081268a3374a45653b5fc7ca5ee044634f341af0bd13280206e9a1e3712511741db&scene=21#wechat_redirect) 116 | 117 | 118 | 119 | ### 三化(组件化、插件化、模块化)以及热修复 120 | 121 | [Android 彻底组件化—如何使用 Arouter](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486586&idx=1&sn=869b0ca77043cfd39e2e596f169a5d95&chksm=97f6b2cea0813bd898949f4bb0e70a8699b397289d079d10d07840a019d3cd487646ba8ea685&scene=21#wechat_redirect) 122 | 123 | [AndFix 的使用分析](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486612&idx=1&sn=589654055378e6ccc56374a22ffded0d&chksm=97f6b220a0813b36b7a52ee63869573b9fa2ca126fec4714570afe26440db90d84c85ea5de74&scene=21#wechat_redirect) 124 | 125 | [Android 多模块多组件开发 - 打造属于自己的路由](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486639&idx=1&sn=b1cb1b3df5427ffbfb8bc11461442c1d&chksm=97f6b21ba0813b0ded953f5eea1adcf8a2ec7c47a7b7a5e2e890aee6ff493cfbec9175e0d21d&scene=21#wechat_redirect) 126 | 127 | [热修复技术的实践之旅——微信TinkerPatch热修复结合Walle多渠道打包的详解](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487017&idx=1&sn=8abaad1612f871980c042f0fd214975d&chksm=97f6b09da081398b63c2dcd7642b858229ea7c82246af493041ff325c25beb01879bf24d6a0b&scene=21#wechat_redirect) 128 | 129 | [组件化框架简介](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487068&idx=1&sn=654638a50d00e08fc46988074fbea2e9&chksm=97f6b0e8a08139fe0d4b3d54ee1db64cf820e22f492e47c9c080fe7efd498e9273095050e1e4&scene=21#wechat_redirect) 130 | 131 | [浅谈 Activity,Fragment 模块化封装](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487096&idx=1&sn=28450ffbe412dbda4efe77ad2e71652d&chksm=97f6b0cca08139dab6072fa1ae9b3f705d33afa84add22e062e63dd6f5a591750db2d1db7932&scene=21#wechat_redirect) 132 | 133 | [自己动手做 android 路由框架](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487196&idx=1&sn=1011ecd14e08b902cddc80ec416af132&chksm=97f6b068a081397e9f654938d2f599eac95c9648a0c3854d4492d545f0968725151041cf62a6&scene=21#wechat_redirect) 134 | 135 | [Android 通用的组件自动注册、自动初始化解决方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487228&idx=1&sn=2885e7c42b76e3bfc75acadb6f8d2dc9&chksm=97f6b048a081395e94bac9d3d9c80ef2498d78fa685c6ce5d3097c1c8d4798ffddb496653058&scene=21#wechat_redirect) 136 | 137 | [自己动手写Android插件化框架](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487446&idx=1&sn=99dc74cb38900a1c16fbd89888c48fa8&chksm=97f6b162a0813874518f5567ed9f7066fda4656d90e79479eaa2624978f0abb6a8bce8875b15&scene=21#wechat_redirect) 138 | 139 | [最简单有效的低侵入性的 Android 组件化方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487525&idx=1&sn=ef3ddc7d1701b84058cc8d46eee26835&chksm=97f6ae91a0812787f5e1ab323420ecbb1504e14377417784a370b9635e499176d598533ee61c&scene=21#wechat_redirect) 140 | 141 | [该用路由来管理你的界面跳转了](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487759&idx=1&sn=05de7dbec6b3fe9bfcb4c171477b6587&chksm=97f6afbba08126adba137f7b9d17148e62188eeeda629392e66c4d92dcc2905e52701250541d&scene=21#wechat_redirect) 142 | 143 | [一篇文章搞懂 Android 模块化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487771&idx=1&sn=3e3d2be7f5f5e26e1d462034a9d09a73&chksm=97f6afafa08126b98b4c72fd9296554210c3cce00dc69d694fc0eab8eeafbe1340c7b83433ec&scene=21#wechat_redirect) 144 | 145 | 146 | 147 | ### 自定义 148 | 149 | [Android开发之漫漫长途番外篇——自定义View的各种姿势1](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486495&idx=1&sn=e77c49232bd6a8653952df594e1cf539&chksm=97f6b2aba0813bbde4fe3673d4fb37a7f1e273ca0caeaa12297c2f129f6f9687f97f8f166218&scene=21#wechat_redirect) 150 | 151 | [自定义View(七)-View的工作原理- Activity的布局加载](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486646&idx=1&sn=2e77044b0e3da80631c4d503245c9cd4&chksm=97f6b202a0813b14d6ae9561fdd78708b344c5ad63ceb63a016360e31162cb3ec1e12047a8d5&scene=21#wechat_redirect) 152 | 153 | [自定义View(八)-View的工作原理- View的measure](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486665&idx=1&sn=4a0465f0b1add06d7de37a8f701d2bad&chksm=97f6b27da0813b6b9655c59d043f1f4de3d6fd053a4b0fab193c40f759f5e8804123929b711d&scene=21#wechat_redirect) 154 | 155 | [自定义View(九)-View的工作原理- View的layout()和draw()](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486696&idx=1&sn=5bbedd8dc8972b0dda40201071939f36&chksm=97f6b25ca0813b4af68be91578fecfb99029601203095b31452fb27d05a28ee7f5670b064053&scene=21#wechat_redirect) 156 | 157 | [Android 自定义网格布局,九宫格布局加强版](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486962&idx=1&sn=6ffe1b04739011556cdcdfc2c79b2452&chksm=97f6b346a0813a503161c73c52ac87419c84b5a677356ba8bbc886364051b46590da231f744a&scene=21#wechat_redirect) 158 | 159 | [Android 自定义控件之角度传感器实现 3d 景深效果](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487226&idx=1&sn=b6d1857ef64250bbaf09e172df86679d&chksm=97f6b04ea08139582912dc5b8fd33ebe062884e1556aa0f07bb36488a6d4166f76659ff81ccc&scene=21#wechat_redirect) 160 | 161 | [Android开发之自定义相机、相册趟坑之旅](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487246&idx=1&sn=cdc38cfb7d22fbc035b96263a7202fba&chksm=97f6b1baa08138ac294c28a036308f68f3b02029273985f9e04b5152947420429edb38e83118&scene=21#wechat_redirect) 162 | 163 | 164 | 165 | ### Android 架构/开发框架 166 | 167 | [MVI 设计模式尝鲜(实现一个联网的天气查询Dome)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486456&idx=1&sn=fab25b3b85c8ad178d6c4b0d498206d5&chksm=97f6b54ca0813c5a0b2758836105b569c5ae86379c9019907240c283bb4014de8ab727817579&scene=21#wechat_redirect) 168 | 169 | [Android 架构组件 Room 介绍及使用](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486728&idx=1&sn=e9211eb04079ff6b666d54836b12c913&chksm=97f6b3bca0813aaa5f3bd192d6262af881f99c716c70ad478e3fd16cacc40ecbdebf5aec1435&scene=21#wechat_redirect) 170 | 171 | [从google todo-mvp示例再次学习MVP](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486726&idx=1&sn=432f248d4aa07e87d9d5ce0a82c02026&chksm=97f6b3b2a0813aa4433c432b9fdda5a4f74f1fff1b1a63ba9d5d62d2e8d757c9fb87d210cad5&scene=21#wechat_redirect) 172 | 173 | [优化你的代码结构 --- MVP](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486836&idx=1&sn=ef99d4483d9c3726ab568ebf1056046f&chksm=97f6b3c0a0813ad6422caa308cbb4494fbf7a0445424aea4f5dbd9296e6c19d960541f690326&scene=21#wechat_redirect) 174 | 175 | [软件架构:基础概念总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486895&idx=1&sn=41aeffae5db4ac461119785e5611ef65&chksm=97f6b31ba0813a0d1f576828cf59b6e4488967212405efbade50f3528c22ec44ae20bf9f5f90&scene=21#wechat_redirect) 176 | 177 | [通用的 Android 客户端架构设计](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486889&idx=1&sn=cdaa6d8bafb1760c00876eb2b6e15e92&chksm=97f6b31da0813a0b379ef814420b8bfccdc4ad6c1ae1c7ebd110120f7fdb1c51ae94694ea9f0&scene=21#wechat_redirect) 178 | 179 | [和编程在一起的第三年:总结Android开发用过的十大框架](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486905&idx=1&sn=814a022dc9aba668f18dc7cdf71b4d59&chksm=97f6b30da0813a1be6ef1289b5f4ca971f39fae64549f94b0f63eeab62a31861eed6d46bef35&scene=21#wechat_redirect) 180 | 181 | [基于 MVP 的原子性架构](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486897&idx=1&sn=fd3951347fe3a4910d6911cabf835c72&chksm=97f6b305a0813a137a63380c83bd765903de6aced4989a8284de55d6a1b8f459534aa6d53385&scene=21#wechat_redirect) 182 | 183 | [最简单但是又最灵活的 MVP 封装思路](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487185&idx=1&sn=3308c02d8bb33d8b38f475ef80d896fd&chksm=97f6b065a08139730f9fcfd9f79b414ad285c14ec38edcf4295a611686cbbbe1fbc859644150&scene=21#wechat_redirect) 184 | 185 | [剖析 Android 架构组件之 ViewModel](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487227&idx=1&sn=b38805ef59f9ecfeb5b72cbae2ed3df8&chksm=97f6b04fa081395970a81c480cf7c5dde3a02cc5cecb01da287189d59bd82dccd8de13418ffa&scene=21#wechat_redirect) 186 | 187 | [Android MVP 架构](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487333&idx=1&sn=c618db06fe1c39f5001c821c6bcc676e&chksm=97f6b1d1a08138c797109600513a60ef36246fb065b0eb6e17a3d168d029d300aa46fe95645a&scene=21#wechat_redirect) 188 | 189 | [搭建属于自己的Android MVP 框架](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487781&idx=1&sn=fd75a5efb19dd8a67ba1cf18b906d4a9&chksm=97f6af91a081268773365b0785e0c1d088cfb58809e1e1014d498d0047ea222a8405b1c2295c&scene=21#wechat_redirect) 190 | 191 | 192 | 193 | ### 源码解析 194 | 195 | [Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486486&idx=1&sn=7acc1c9dd8c600ad0ec2db7d32f82f1f&chksm=97f6b2a2a0813bb425cf8bf329bf0e856d3769ac8e21ed5a9a6cb7c57b1097c41f94afe4202d&scene=21#wechat_redirect) 196 | 197 | [Android 消息机制(Looper Handler MessageQueue Message)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486513&idx=1&sn=892a944854aff3edb9f0b9fb85bc01c6&chksm=97f6b285a0813b9363b814b5d974a39990e23db91440bc8958eb5cf8758afb45e37cef6759c5&scene=21#wechat_redirect) 198 | 199 | [Android 开发之漫漫长途 IX——彻底掌握 Binder](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486587&idx=1&sn=bbd08ab0168dc4947164af8274002886&chksm=97f6b2cfa0813bd9022c84de0ce2be3e128ed2a2141824c90474453dfc9ee5e2f5d3803ed391&scene=21#wechat_redirect) 200 | 201 | [Android 开发之漫漫长途 IX——彻底掌握 Binder](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486613&idx=1&sn=91cd6f7922cfde8ae08e423aab361394&chksm=97f6b221a0813b3728a4cc80d667ce995fc0bd2d64abc27b5a750b0f7a67c41418aaeafe22e1&scene=21#wechat_redirect)(第二篇) 202 | 203 | [Android 开发之漫漫长途 X——Android序列化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486647&idx=1&sn=0ec7b660d3f32e62e2881aff4a0d9c20&chksm=97f6b203a0813b15db85bedeff5dea3286c3becf0646185fafda60da520addfcfb19a6357fa6&scene=21#wechat_redirect) 204 | 205 | [Android开发之漫漫长途 XII——Fragment 详解](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486663&idx=1&sn=fc0c84a0a312d7dea06d879e263e50e3&chksm=97f6b273a0813b65fe53f62785c0c484aae34cc5a0eda6209af1c92007a36bde0070396919e4&scene=21#wechat_redirect) 206 | 207 | [Fragment 番外篇——TabLayout+ViewPager+Fragment](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486695&idx=1&sn=a350436b42fd29c1b466aa0b1ce70ca0&chksm=97f6b253a0813b453079528ef3440b2fd430c35ff06a7b65cf50b6a06583b16fad58c6b1ccd0&scene=21#wechat_redirect) 208 | 209 | [Android开发之漫漫长途 XIII——Fragment最佳实践](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486729&idx=1&sn=107fcc460b8fbee25094e089df74d60b&chksm=97f6b3bda0813aabbf5e5b9b52e264592c08af5d2715d7baa8df064ac0dd519a718d74724b2d&scene=21#wechat_redirect) 210 | 211 | [Android 开发之漫漫长途 XV——RecyclerView](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486837&idx=1&sn=d3734f8cbe114120e6b65b165b7bd93b&chksm=97f6b3c1a0813ad73880cf04f836caf13b0820f281df22532337378cfedb26651b4fa857e561&scene=21#wechat_redirect) 212 | 213 | [Android进程启动与Activity显示](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486964&idx=1&sn=2e1be34d465659bc7f7f99a01a20e77d&chksm=97f6b340a0813a56f36a6ed415732a3678f4a404e261a7bfa4b33d2bfc22566924b0607e04da&scene=21#wechat_redirect) 214 | 215 | [LiveData 源码分析之事件总线 LiveBus 实现](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487725&idx=1&sn=163df081088cfaf878816b41a78c9dfa&chksm=97f6ae59a081274fdb6fcdab98abefb7bda9ebbbc3355577c76383ee75353efc0b80d86422a7&scene=21#wechat_redirect) 216 | 217 | 218 | 219 | ### 瘦身、打包 220 | 221 | [Android 瘦身不反弹最佳实践](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486523&idx=1&sn=2129a8bdf824db0e587a04178067b578&chksm=97f6b28fa0813b990d687f21f0ea22bd3adf4920326bfe75541e2e4719bc540275b3b918b68c&scene=21#wechat_redirect) 222 | 223 | [Android性能优化之躺着就能APK瘦身](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487370&idx=1&sn=0f2a538198b9ad4701b8e54658e35ca6&chksm=97f6b13ea081382820aa6dc52ffb7d058ec25d1d34e363ec615aca3b9a5b525f13eb3301a65b&scene=21#wechat_redirect) 224 | 225 | [Walle——Android多渠道打包神器](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487651&idx=1&sn=5d2af74210b20689dc76952c306ab0e1&chksm=97f6ae17a08127016ab61e8e3d5264d29b058a36ba20419df2e2b574fed9f5ec92a46c73f6f7&scene=21#wechat_redirect) 226 | 227 | 228 | 229 | ### 技术教程 230 | 231 | [Android 一套完整的 Socket 解决方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486423&idx=1&sn=9fea0e36eeaa7cd9fde5b9ec14515644&chksm=97f6b563a0813c75e39f48dde7442fbdbf9d677c5dff845b4f9aaa8abc579aaace469c9e190f&scene=21#wechat_redirect) 232 | 233 | [简述JVM基础(八):线程安全和锁优化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486487&idx=1&sn=22c288993207a2399ec1cf13c173ff45&chksm=97f6b2a3a0813bb5c9502e06068629676a5ef3d13e8362584356983b7d6e6491958479931a66&scene=21#wechat_redirect) 234 | 235 | [Android线程篇(五):Java内存模型](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486664&idx=1&sn=49257dac463f86af2e0b3c819d333ab4&chksm=97f6b27ca0813b6a573a9c4dd1febd207b1f43cefb93da626f0e656dd57bf76288de9771e6ac&scene=21#wechat_redirect) 236 | 237 | [CompatWebView](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486491&idx=1&sn=24dcaffeabe62154a3f3e60fe44d9960&chksm=97f6b2afa0813bb91eb411119e90678f86369d78b296fad43523352a047d4cabbbaded175b27&scene=21#wechat_redirect) 238 | 239 | [使用 Charles 抓取 app 数据包](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486589&idx=1&sn=a74ead57439230c8b143366b739bd050&chksm=97f6b2c9a0813bdfbaf5bae2efca3f735773ff41f990472bc3e24e9f195042ecbe3138b6d6f2&scene=21#wechat_redirect) 240 | 241 | [Android 关于内存泄露,你必须了解的东西](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486611&idx=1&sn=93278395c7d5a7ab582ea1e10438b21d&chksm=97f6b227a0813b311876748d22a4e5896fe8d060f960d7e090d612b1d1c138a005a5bc34ff06&scene=21#wechat_redirect) 242 | 243 | [你真的懂 Java 的内存管理和引用类型吗?](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486596&idx=1&sn=fab08d97a1a12ddd973c7c9ab75f5bb9&chksm=97f6b230a0813b26b46ffb5a11b0a8a5bdfe737804c785b3c9b77576348fa2ae99f2f2cdbdbc&scene=21#wechat_redirect) 244 | 245 | [Android 用原生分享多张图片适配 7.0、8.0](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486625&idx=1&sn=b2ca0b3cfc4dd4100241735ca30e1334&chksm=97f6b215a0813b03cad1633397c31d904c77a7d437916aec46f327c613921cf1d6a5fdcf8e8e&scene=21#wechat_redirect) 246 | 247 | [打造一个通用的 RecyclerView Adapter](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486638&idx=1&sn=dd516259deee4dccc3b679b1aaf7ecf6&chksm=97f6b21aa0813b0c8f6d9183ed83a4a128347dd1ac51c17dd5d801302341438058b3d3c14bc7&scene=21#wechat_redirect) 248 | 249 | [Travis CI 邂逅 GitHub、Maven、Fir.im](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486666&idx=1&sn=2234895f2328ff8d57848829def31340&chksm=97f6b27ea0813b687cd08d890ba5ffd81609bfd5793a845968ce2ab071fe5e86960c6e67a76e&scene=21#wechat_redirect) 250 | 251 | [Android SDK开发与使用的那些事儿](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486727&idx=1&sn=3225c8b4eb215273902cbf90370a81bf&chksm=97f6b3b3a0813aa51ee906dabce8d468abd49ad7fec68d611fbac0f17860cdba4d90b3d2fab3&scene=21#wechat_redirect) 252 | 253 | [Gson 解析服务端返回的多种类型的 JSON](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486762&idx=1&sn=35f2a4d53dc36470994c8b24ca1474f6&chksm=97f6b39ea0813a88e4cf0b9b39cad5ef34ff2cdf82a879f2f57b8ec3ece0522eb524dbf32d31&scene=21#wechat_redirect) 254 | 255 | [Android O 适配 Notification Channel](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486761&idx=1&sn=6249dae99df8076d485837260a43bbff&chksm=97f6b39da0813a8bdf53043af9d792a4424449bf3ceb2b21aafecc87c1758a298ed7c27e08a0&scene=21#wechat_redirect) 256 | 257 | [Android 系统各个版本上https的抓包](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486834&idx=1&sn=91850a5d1ac13953fcb869bf1f232aab&chksm=97f6b3c6a0813ad0bd3df0b09ff0cdbcbd8c85021592febed13f5f265b97cd3a8bbb32e5ca55&scene=21#wechat_redirect) 258 | 259 | [Android-指纹解锁技术](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486833&idx=1&sn=655be3977ebb9176207cfac1c3de8d3b&chksm=97f6b3c5a0813ad331775332c30fa83d2d529a96295f265653a2013e3bf24841227c76d6dad5&scene=21#wechat_redirect) 260 | 261 | [App 版本更新接口的设计](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486874&idx=1&sn=359a9f2380ba430774a1b3805945061d&chksm=97f6b32ea0813a38e0438d7688fa74a3697c5aea2c2af3b7db6e3e9a0eeb41a59431212b3e78&scene=21#wechat_redirect) 262 | 263 | [Android Studio 查看Android内部隐藏源码](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486894&idx=1&sn=795f300c4da1e1fe00dfdc6494fa99ec&chksm=97f6b31aa0813a0ce02d6bd54d81d0b8eb80a27f8eca47a5fe19dbd5ae2eef2f0254b49bb9e3&scene=21#wechat_redirect) 264 | 265 | [Apk根据不同渠道更换SDK](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486912&idx=1&sn=1b18ce2a1aef5b1afe7b2b0c9c2ef6fd&chksm=97f6b374a0813a628a68f2daad52dfc8a29c5f6c32a9b1bd1b52e12f58c322132411d0046000&scene=21#wechat_redirect) 266 | 267 | [Android 串口通信:抱歉,学会它真的可以为所欲为](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486901&idx=1&sn=9c0b4f205041e88269eab74115596e36&chksm=97f6b301a0813a17da6399f917138c0ee98b39f51fb1ec18f2f4e3d7da44b50aa6e695eed80d&scene=21#wechat_redirect) 268 | 269 | [Android 根据配置数据动态设置应用内的icon](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486944&idx=1&sn=6908694b78c4e7f8942429ae718a7727&chksm=97f6b354a0813a42ef3cdd26dda390546c10245730def68f2fa77ccf49e0c7d65125148ebd35&scene=21#wechat_redirect) 270 | 271 | [Android APP打开另一个APP完整逻辑实现](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486943&idx=1&sn=bd3e717566de2d81c9f0690162cd002b&chksm=97f6b36ba0813a7d1fde83fb2734f4c8e8fb248c037c2118eb18a2f7a3a85715e2cb167e9aad&scene=21#wechat_redirect) 272 | 273 | [Android4.4运行过程中闪退java.lang.NoClassDefFoundError](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486913&idx=1&sn=2bc800db34c3f942aa201b052ffc3ce7&chksm=97f6b375a0813a63f372fdbca97d4fb276f15c778af5435adff67c715fa92ada7f3232c73630&scene=21#wechat_redirect) 274 | 275 | [监听WebView页面上所有的图片](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486961&idx=1&sn=c69d6323c53594a118aaf76fd043620d&chksm=97f6b345a0813a53c85931436f12291d12d9c7faf457c87a8546c625d05f484a9bc60f3d5b94&scene=21#wechat_redirect) 276 | 277 | [Room 使用之如何为字段设置非空约束](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486960&idx=1&sn=a3b7eefae88f63397fecc9c8d9870663&chksm=97f6b344a0813a52e9d4747fc1f91f236108934484ff6949ee55513d90b1492491132c7092fd&scene=21#wechat_redirect) 278 | 279 | [Android 异步生成图片](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486963&idx=1&sn=c19841319523bc4e6e73c6166c807493&chksm=97f6b347a0813a51ede853688502a86f9d5a35e80ea7122322d142b6fb31c63ba573972179e1&scene=21#wechat_redirect) 280 | 281 | [Android 从ViewPager嵌套的滑动问题引发的分析](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487016&idx=1&sn=6668a25d3c4ef67f450c93d14e6a3e5b&chksm=97f6b09ca081398ae0dccbb67bca696233795b14101496caa976b455a25a79dea5be001534cf&scene=21#wechat_redirect) 282 | 283 | [浅析Android平台图像压缩方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487015&idx=1&sn=30ddd9010f300107af103dc5cd347d2b&chksm=97f6b093a08139854f2dee273b6e3625841da323a6436b8bc9421496fd2383bb5abcfc259a00&scene=21#wechat_redirect) 284 | 285 | [那些好玩的 android 小事](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487040&idx=1&sn=f75f8ad14a1a6b4c221e1af121a890e9&chksm=97f6b0f4a08139e240dbec2ecf5621eabfabfc0f9e55f615f384bcc3359c1fc10a3a13ee0e84&scene=21#wechat_redirect) 286 | 287 | [Android Jetpack - 使用 Navigation 管理页面跳转](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487032&idx=1&sn=184d4614c4a3d5f8ccc25de536ba283a&chksm=97f6b08ca081399af48248ecf6dc81a15558e6eb8fa48de95da154c23d17ca1e28d878ac5611&scene=21#wechat_redirect) 288 | 289 | [善用 Android Studio 的异动管理功能](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487066&idx=1&sn=82c6669b33b9c1afee8c12037e96a2fe&chksm=97f6b0eea08139f866df347644c2ccceb3434f26ce86e3b95592caeb436d921f3ce13277c6c8&scene=21#wechat_redirect) 290 | 291 | [RK-Android-Usb无法读取以及原理分析](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487065&idx=1&sn=dc221f2f048ae0d92f58b5ced52cdf58&chksm=97f6b0eda08139fb20ace7298e22e33da3f48b126d82332611187d982cb490ccc59163d885eb&scene=21#wechat_redirect) 292 | 293 | [浅谈Android中的meta-data及其应用](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487099&idx=1&sn=1d13f7a8fa4d86769ee3212a2b0fcc0a&chksm=97f6b0cfa08139d9e916303c65b8129f0e019e5bd25f310bb3e36cab955d661661d67fabbec3&scene=21#wechat_redirect) 294 | 295 | [Android install apk 兼容至 Android 8](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487098&idx=1&sn=301a042eb7d552c6401a40fd43675873&chksm=97f6b0cea08139d81be613f2148ab516be444f82239100f27b9305ba5f7f8a79999a73fe79c0&scene=21#wechat_redirect) 296 | 297 | [就算开发Android APP也得懂一点API接口开发](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487097&idx=1&sn=e6f24709e5a4bd9cdc6d20626be5b4d2&chksm=97f6b0cda08139dbdad63922ab3cfb14a0f460c3636868c86b851da175aad177fc541998b470&scene=21#wechat_redirect) 298 | 299 | [Android开发需要了解的网络编程基础](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487089&idx=1&sn=b65ae055fda8929a1326c5fb5938fd92&chksm=97f6b0c5a08139d3dedbb2448defbb8803d09a52aa0ae57377df7d21997de4aba66ad6e2461a&scene=21#wechat_redirect) 300 | 301 | [Android 多进程通信之几个基本问题](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487133&idx=1&sn=ce55020d11d3952df11dd0948fdaaa2f&chksm=97f6b029a081393fbd4eab568c18ef0452b6dc143daa2126fd1fef96fc5ebcf2327a1fd892e2&scene=21#wechat_redirect) 302 | 303 | [Android:FlexboxLayout你值得拥有的流布局助力](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487124&idx=1&sn=65dd016c864035a80c0063b7f95fd4bd&chksm=97f6b020a0813936d76ee81673fd47c1aa30b5d4d23f67dcdbc1aefb40bca80b044946e1e80f&scene=21#wechat_redirect) 304 | 305 | [Android Jetpack - 使用 WorkManager 管理后台任务](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487123&idx=1&sn=6ea7c38b545c5240343c188e2f3de71c&chksm=97f6b027a081393104e4950499bbfd58fdbd20a9a9bca19974031800d286a7bf1588a00c2cc9&scene=21#wechat_redirect) 306 | 307 | [ItemDecoration 的一些使用小技巧](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487115&idx=1&sn=562083cee4cdabab4edcdee1aeeede57&chksm=97f6b03fa08139295a732661a4b8757d62f313cca39a9a44a8e038682416622b4e296d5afbe3&scene=21#wechat_redirect) 308 | 309 | [Android绘制优化内容总结避免过度绘制](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487143&idx=1&sn=f516abc67fd0d8efed93258f2ea831a0&chksm=97f6b013a0813905349f164a3f1797f36f8e206eefa99eb1759ba6614325e98e8c5e20e24043&scene=21#wechat_redirect) 310 | 311 | [实践App内存优化:如何有序地做内存分析与优化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487139&idx=1&sn=c045e08eb1d450e907b47d990da2bff1&chksm=97f6b017a081390144676541b8b68ae4e4f80804a8a42b093be324c25fdd3617eaa335a2c119&scene=21#wechat_redirect) 312 | 313 | [AndroidStudio封装SDK的那些事](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487136&idx=1&sn=f808ef33c5ee5b8001897536e3d6fb70&chksm=97f6b014a08139023f1c9804571e7e75587f1a6f2f79e25033bff1b61389f8697936123ba3fc&scene=21#wechat_redirect) 314 | 315 | [Android多屏幕适配之字体大小、行间距和字间距](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487173&idx=1&sn=bfe00aeafa1c113cc559478f79ddcac2&chksm=97f6b071a081396714852213206a8f01787612dce8e989080a5ee27e8a43395e4e9959b9e9df&scene=21#wechat_redirect) 316 | 317 | [Android 刘海屏适配总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487172&idx=1&sn=3360a6c26d2ab3790a6093a191fba97f&chksm=97f6b070a08139668d04fd238453e518e1ee89cb3b79db8bacbf54653b444fac3b0133a1b53a&scene=21#wechat_redirect) 318 | 319 | [安卓嵌套滚动NestedScroll了解一下](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487145&idx=1&sn=0193fdd9cca0d7c8057ad5697ada731b&chksm=97f6b01da081390bb5a1da5225ae57c6460c959cc83f4fde8af77c2e92c1d8aae8dcc4c0481d&scene=21#wechat_redirect) 320 | 321 | [Android三方应用实现静默安装](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487176&idx=1&sn=e606e30eac399b209593eeebc7c9047d&chksm=97f6b07ca081396a1f4659db17a88e9d4ef0605d5eb96afe42373a0cffac7b2d5c4534ca8f07&scene=21#wechat_redirect) 322 | 323 | [Andriod Studio两种签名机制V1和V2的区别](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487175&idx=1&sn=8e8836dc64235ed5ddd8ed1270e863dd&chksm=97f6b073a081396584a75ecb3b2c8a9ddf82782cd1e31cfdf106c08605dbd07cb4dbe09dba2a&scene=21#wechat_redirect) 324 | 325 | [Android自定义权限使用总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487197&idx=1&sn=1abf3bff6481d6b25511fc7043a13bc3&chksm=97f6b069a081397fd5f739b3a8ce8a5b245ee02f1b5899b556d9467720870768828f6f095082&scene=21#wechat_redirect) 326 | 327 | [优雅地管理Android应用的初始化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487213&idx=1&sn=208c535b129b65502fcbb927d197093b&chksm=97f6b059a081394fbfa709f8191a607390e799eaaf7f2ea21fc74078fd3c01897a5c57984b26&scene=21#wechat_redirect) 328 | 329 | [项目所须:加载大图片 图片压缩](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487204&idx=1&sn=93093eb7b41cb7edc0f6ce98035a0eb7&chksm=97f6b050a0813946901b6fdc51ccc3a6be62aa82bed9f24386ae04937f9cc5d3e1e012258183&scene=21#wechat_redirect) 330 | 331 | [『进阶之路』—— 线程池](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487232&idx=1&sn=cc345290dcadfb49488444380496d6ed&chksm=97f6b1b4a08138a2b96eb71bfecdbebac80f8229ac07d63082117a7493c9ae26c46dae2c3a5f&scene=21#wechat_redirect) 332 | 333 | [Android 序列化总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487281&idx=1&sn=971778e9ef4cd926f966061640079c69&chksm=97f6b185a08138933fcd30d2c10cad7825d7f51224a5f7b5f7d946ff091a1f88732d7acc7b34&scene=21#wechat_redirect) 334 | 335 | [Android 上关于设备唯一标识的调研](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487280&idx=1&sn=e145d4cde6286ea31d24f7f86941a0ea&chksm=97f6b184a0813892a0e42ec25372be38baac31649c058279fe15512c6bb342fa691efb322026&scene=21#wechat_redirect) 336 | 337 | [Android 如何从应用深入到Framework (一)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487251&idx=1&sn=0da6da823a03e15c8af4e0533a0430f3&chksm=97f6b1a7a08138b169b8a7efa1a16eaac6f8ebe5c0d200f7adbd7947a77f2dd23891dc13aede&scene=21#wechat_redirect) 338 | 339 | [Android 如何从应用深入到 Framework (二)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487284&idx=1&sn=292f7896dd84430c976f8dad4e95d415&chksm=97f6b180a081389615252e3c6ae9738d7af42f921714621a5f7536d64ab577419fc22138786e&scene=21#wechat_redirect) 340 | 341 | [Android 全面屏启动页适配的一些坑](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487248&idx=1&sn=530e0f8c437c520808e0e99f1ba5d0be&chksm=97f6b1a4a08138b2d1573a0c58f1483df0f23bb3b801055f9ba603265455b41ff03bc9a19562&scene=21#wechat_redirect) 342 | 343 | [Android 去掉系统默认提示音、移除音量调节的进度条、增加音量调节提示音](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487247&idx=1&sn=35385e9efd9d4e974150030187b94380&chksm=97f6b1bba08138ad74eeaddca9223d958675e1bc4b53b9699adf4f5ee3473c5a9dc5d5186d72&scene=21#wechat_redirect) 344 | 345 | [Android-Apng动画的播放](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487310&idx=1&sn=421d78956e19df0bbf43cb4bf348e341&chksm=97f6b1faa08138ec3fcb9fb1f371995da25e2785fdec8e819be7a28f255c69bab7d28f1daa8a&scene=21#wechat_redirect) 346 | 347 | [Android 国家化的坑 - ;小数点变成逗号](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487311&idx=1&sn=30a14e259313402ad76172e1955be5b0&chksm=97f6b1fba08138edd6aa3f1a2aa980d383abca1322e07d90da4c4b5e555aa5662a536e4b39de&scene=21#wechat_redirect) 348 | 349 | [Android :如何防止被抓包工具抓包](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487312&idx=1&sn=75aa6ed4a75bf4bae790bb783b548b18&chksm=97f6b1e4a08138f260a949aa8675d726b5af46eecc8c6989b6838a658a61aa081fa5e9719dbd&scene=21#wechat_redirect) 350 | 351 | [优雅地处理加载中(loading),重试(retry)和无数据(empty)等](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487313&idx=1&sn=2dc3e0e5ec308d9051b6566c10b0e47e&chksm=97f6b1e5a08138f32a0ff61315722ef72ae57437a05158bb20ff65274c60e55672869c434c18&scene=21#wechat_redirect) 352 | 353 | [Android通用UI封装----“我的”页面Item](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487325&idx=1&sn=6e97e2f3e68a8d1c1521f564dc587819&chksm=97f6b1e9a08138ff09a7a1b2a5ad5b487e9e7eb537ae691df4361421d58f6ea6dce72fbb46dd&scene=21#wechat_redirect) 354 | 355 | [Android 冷启动秒开实现](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487351&idx=1&sn=c767b83bd3d9b2df8af7d1e3ebf9387c&chksm=97f6b1c3a08138d58af7c0cd2739edb3ee79edfd2f6ce15e473001eae399ed3e9e55582f22c0&scene=21#wechat_redirect) 356 | 357 | [Android 学习之阴影效果](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487349&idx=1&sn=cfec94e724342f5d748c7eae986fe0d3&chksm=97f6b1c1a08138d712c3331639520db446d813f450a082da30daf1a7d1a0cc974d1b1c0e4db7&scene=21#wechat_redirect) 358 | 359 | [将 cglib 动态代理思想带入 Android 开发](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487334&idx=1&sn=3dbbdd8e89c135f76b0434ddc22c7460&chksm=97f6b1d2a08138c4b8f03ec7c30b8902851db7c3d9de400caedca1fd1ad4362f87a027a3879a&scene=21#wechat_redirect) 360 | 361 | [一键切换应用环境工具(EnvironmentSwitcher)了解一下?](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487369&idx=1&sn=63d2dc4d5c16950f5793794802e98150&chksm=97f6b13da081382b62c6fdbca8d18a0ebdc3e422dc4a7cc7b985eabffe0efec4b6f17698730e&scene=21#wechat_redirect) 362 | 363 | [Android基础 - 如何做鲁棒性更高的布局](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487368&idx=1&sn=d4ed65a190a577ae751d4ad48107d9aa&chksm=97f6b13ca081382a8deabe5f4c2616a5725db83951d5a4e9d93aafb0c0f43ebb782d0234fd2e&scene=21#wechat_redirect) 364 | 365 | [webview内存泄漏终极解决方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487367&idx=1&sn=225a45e90f4b77d1c8d6c780b076b87a&chksm=97f6b133a0813825d06e1e149615ea847813acdbbe8b362d84e5f6178465dd38f2c72a9f31e7&scene=21#wechat_redirect) 366 | 367 | [Lottie for Android 实战使用总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487352&idx=1&sn=ed2ddbe9c0c321aa2decb8b8233319e5&chksm=97f6b1cca08138dadd5571f5630cdd69f4cca21ef13312824dc6cbeafc5a04ab9af1045b8abb&scene=21#wechat_redirect) 368 | 369 | [安卓软件逆向工程基础概念](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487414&idx=1&sn=cce18c78c28a935ecb3618b54748b3a0&chksm=97f6b102a08138144fd9c02288b12faaa22595c461d357b37ca3b34960e0ed3ae1ef70ec5346&scene=21#wechat_redirect) 370 | 371 | [Android 可视化埋点方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487413&idx=1&sn=7eb3faaa1de81500dab6cc5b08db04b6&chksm=97f6b101a0813817e7c463b7702b5787ec8eff9d1498fbdbc3c1778fd27848e78d29046fe2d4&scene=21#wechat_redirect) 372 | 373 | [Android开发之漫漫长途 XVII—动画](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487412&idx=1&sn=866fbbeb65ab5bfc937123c6eaf4d9f7&chksm=97f6b100a0813816be7838303277d94a9cf915d8f2ceea3e4c0c69d7c86995bce45858145218&scene=21#wechat_redirect) 374 | 375 | [Android开发之漫漫长途 XVII—动画(续)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487443&idx=1&sn=c7c8934074e32fd75b4c27f7de504bfc&chksm=97f6b167a08138711abf3f6993382f9e09ed55e7af51645e6f004eddbbbc78358c914c252ec1&scene=21#wechat_redirect) 376 | 377 | [Android开发之漫漫长途 XIX—HTTP](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487486&idx=1&sn=726cf74bd1ff0f2620018de2e7788ad3&chksm=97f6b14aa081385c8cea2fba32ac655fbca2734837f1dcc2d09897edd1859020b9970c2d9f90&scene=21#wechat_redirect) 378 | 379 | [Android界面渲染优化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487445&idx=1&sn=653780979910a7c18937ac1272ef388c&chksm=97f6b161a081387722beca335d6cc5468071e3fed5a71bf80a8c049d63e11b0401262590844a&scene=21#wechat_redirect) 380 | 381 | [ANR 原理与实战技巧](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487496&idx=1&sn=81a46c2f67d4affef882058307a78112&chksm=97f6aebca08127aaa6025a4b31fa8ed450165d655b6a34bd59d34784b69d186516766c83f002&scene=21#wechat_redirect) 382 | 383 | [Android开发 - 获取系统输入法高度的正确姿势](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487501&idx=1&sn=b9c52ed913efdc6cfe3e4c8cff52e184&chksm=97f6aeb9a08127afc55446d269ef9777e6754438f25f1d45e4dcb8f0254aa02cc05e058aba36&scene=21#wechat_redirect) 384 | 385 | [通过JavaScript实现在Android WebView中点击查看图片,长按识别二维码](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487500&idx=1&sn=6472bd542bff93a65e75006fc107facf&chksm=97f6aeb8a08127ae76e01ec41963afda7ed9e6fa5e6b6b197774c9cc2e69735725cd7f59910d&scene=21#wechat_redirect) 386 | 387 | [项目埋点的演进](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487498&idx=1&sn=9d4dea133200ded018d86bb432402089&chksm=97f6aebea08127a80a7fd88bb44a6a8e9eeda3cd8563080e2c4f7ebd86f6b5d64923cf362535&scene=21#wechat_redirect) 388 | 389 | [Android 迁移到 Androidx](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487524&idx=1&sn=01295019833ee6965b90ac5019a1dac0&chksm=97f6ae90a08127867c2392294efee9bc400efde9a58d3119fc78ce0f516826f4754c53b87e4c&scene=21#wechat_redirect) 390 | 391 | [从另一个思路来学习安卓事件分发机制](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487601&idx=1&sn=b206e57f1383af4aac2891a267969471&chksm=97f6aec5a08127d37b98fddc142998e6d5a7c6fdfda8507617bb5a8a7bada75228130bfdcbf8&scene=21#wechat_redirect) 392 | 393 | [Android-图片的压缩(质量压缩和尺寸压缩)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487592&idx=1&sn=1f24406ce35ea38ad670b737362934e1&chksm=97f6aedca08127cac1706ee3bbbac95870fca650000cbdebbf0fc2427988ade9d46cd2c9cde1&scene=21#wechat_redirect) 394 | 395 | [Android开发之图像处理那点事——滤镜](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487644&idx=1&sn=5157cb6e584208b6f9e59bc7819940b3&chksm=97f6ae28a081273ed55086b52534aaa04196602f6bcd46e201afb8093e1ba240ac1dfdccefa0&scene=21#wechat_redirect) 396 | 397 | [AndroidStudio 性能优化指南(Windows 篇)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487603&idx=1&sn=94d3b55e8c12819fe401fef7fb9510ad&chksm=97f6aec7a08127d146b91f40f0b58c45f9cf19353f7df09e515023497392c01026bd4630f32e&scene=21#wechat_redirect) 398 | 399 | [如何统计Android App启动时间](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487602&idx=1&sn=d5ccc67e06acdcfb964b7e7ef443465a&chksm=97f6aec6a08127d05fe1ee37585b7477aca3dfdaae09497d63c0e03509e5ecec42ac121e98ab&scene=21#wechat_redirect) 400 | 401 | [Android CameraView 实用经验分享](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487653&idx=1&sn=214ec80233f80d477d83475b9813977e&chksm=97f6ae11a0812707695e0c800e353aad8eb5300d994a97242ae54a483b39e9312887ec062ebd&scene=21#wechat_redirect) 402 | 403 | [Android Application优化解耦](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487652&idx=1&sn=18bbe1db969b1758e4133cd531fd4393&chksm=97f6ae10a0812706bafea24800150c6451b01367ece36ddf7b5a3128be57eec5a88a97ebff28&scene=21#wechat_redirect) 404 | 405 | [Android 设备唯一标识(多种实现方案)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487727&idx=1&sn=2ce549547f6191e77a47c4a2ca8224f9&chksm=97f6ae5ba081274d9610a53632a997a49b5ea374dff6e99db73110aa4ead2a6e35ff120c7a2a&scene=21#wechat_redirect) 406 | 407 | [使用 TraceView 找到卡顿的元凶以及 StrictMode 优化代码逻辑](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487769&idx=1&sn=06c686f194e77cdbc75f90a26f18cc0e&chksm=97f6afada08126bb60db4a42e70101ac71cbb2e4945243d1def0e2e68c3db5bf537f2a3f6cf9&scene=21#wechat_redirect) 408 | 409 | [Android:手把手教你如何优雅的实现APP启动速度优化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487758&idx=1&sn=cea26794ac87b4d63a58dd3c8bd18353&chksm=97f6afbaa08126ac2203ab2d77e99c6f416a8eb74d9b6264bac184b6f5a5d73d8eaa57ecfe49&scene=21#wechat_redirect) 410 | 411 | [钉钉自动拍照打卡 App 的实现](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487783&idx=1&sn=f4e4d4876e0f38e2a8471d50c56bf3d3&chksm=97f6af93a0812685e9970b4dbc3d409cd58382470bb219641ab7c0af518e76fcbae9068f7cbc&scene=21#wechat_redirect) 412 | 413 | [安卓开发小总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487782&idx=1&sn=76484b0873e7aab42df203c37887097e&chksm=97f6af92a08126840b8dc4d920eb62bfa5a165627b7b6077f7506ad1282b777d7d6ff491a0ce&scene=21#wechat_redirect) 414 | 415 | [Android今日头条UI适配完善版](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487772&idx=1&sn=2eb3e43b7568a9f85e50ccbc98c7d3c3&chksm=97f6afa8a08126be50373fcadd8af9dbed939d272f2a2fc6df71d5092a1a051940f03062430d&scene=21#wechat_redirect) 416 | 417 | [Android内存管理机制](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487785&idx=1&sn=494c8227a4807cda1a7ea8af17420e98&chksm=97f6af9da081268b32e6e1a3115a80f2d742d4f81ed048709d6c5cc00985e0ae2f8d4d414b0b&scene=21#wechat_redirect) 418 | 419 | 420 | 421 | ### 其他技术 422 | 423 | [理想的程序员](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486475&idx=1&sn=ac78a62e68ad869aedbcd4ebccf506f6&chksm=97f6b2bfa0813ba96b9404009b914b83d190d4fa47028d0ab8e4a8f97298356660bcd106531a&scene=21#wechat_redirect) 424 | 425 | [记一次逆向 Android 的经历](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486789&idx=1&sn=e030cb5f9d63cbc49618608fd6b5a668&chksm=97f6b3f1a0813ae78fb42730754315b4661563daa980f2e46d162537c1fd4113c4165beb312a&scene=21#wechat_redirect) 426 | 427 | [工作了 5 年,发现很多的坚持都是错的](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486557&idx=1&sn=a1118539c17234b6659fb0ae95ac41f6&chksm=97f6b2e9a0813bff8144847edce7997fb4ae22571aeeb137cbfaa2de21465a9453ec87cbac16&scene=21#wechat_redirect) 428 | 429 | [腾讯开源:微信和移动开发的 10 大项目](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486745&idx=1&sn=30b3b1cefcfd67c0c42df1d61692f0d3&chksm=97f6b3ada0813abb38fafdd194448393a98433886361aafefcc2422168444a57825d1acb55c2&scene=21#wechat_redirect) 430 | 431 | [《自然》杂志:中国人越来越沉迷于对着一个叫“区块链”的东西胡言乱语](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486788&idx=1&sn=9c58638a2e1d340a44595b01bc153b3c&chksm=97f6b3f0a0813ae6720ba0a985133df31753baa01567340bccb667c8852a675673970c4ad593&scene=21#wechat_redirect) 432 | 433 | [祖传代码的重构体验](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486880&idx=1&sn=1ca4ef55f7f11034b57c2ee4053e8ca0&chksm=97f6b314a0813a0268a5b83f1becff05fcc9c534609bcac38aac341e01acfa7c9ba24f31394d&scene=21#wechat_redirect) 434 | 435 | [作为一名半路出家的程序员,要学的还很多](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486986&idx=1&sn=f84f65c7cf535c97463bc45c29fb74b7&chksm=97f6b0bea08139a8f298b454f57ef1a8a3138554844e815c56ff259dfa72ea8be2f557c51d01&scene=21#wechat_redirect) 436 | 437 | [一位Android程序员的年中反思](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487177&idx=1&sn=15071471a3ce6c647598fd95c5a6beaf&chksm=97f6b07da081396be4c73e23a0aef81e2b0313835fc56111212f0e52c3d3fa58231f9012e237&scene=21#wechat_redirect) 438 | 439 | [项目模块重构分享与思考](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487245&idx=1&sn=ed1635ba138bea7d5930ea36db87dd7e&chksm=97f6b1b9a08138afb5a6ef2a8af9f5616a69de17e13c5203da76f463ef31e05faf5c89d27ed9&scene=21#wechat_redirect) 440 | 441 | [代码重构的场景总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487497&idx=1&sn=d0a6c6957ccf7b29d896fcb575acd0ed&chksm=97f6aebda08127abb8c84f31f1518352dbd5d96e2ef9dd25aba242c86999cda3e7e7731375d3&scene=21#wechat_redirect) 442 | 443 | [我的毕业一年总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487442&idx=1&sn=7a5c8297bcc31b2a49aab2c73dca04c5&chksm=97f6b166a0813870a47ba26a5d619415bb5a37a194eda1c89ea10661cddaba68d3058989bec8&scene=21#wechat_redirect) 444 | 445 | [30条编程名言佳句: 这不是Bug只是未知的特性](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487420&idx=1&sn=8c8e9aad327af49192866dedec401474&chksm=97f6b108a081381e2907159ef344192547600a7d0241d2e95b60bc8bdb48087f827534546974&scene=21#wechat_redirect) 446 | 447 | [如何衡量一个 Android 应用开发人员的能力?](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487699&idx=1&sn=d3869789c7cd2377d1aab2c48368bcab&chksm=97f6ae67a0812771c1a28d87fd43dd483e4ae3e4d009456c64b83a527ffaceda9fe776d934f4&scene=21#wechat_redirect) 448 | 449 | [我们始终不能只靠技术来生活](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487768&idx=1&sn=f4bfac98790ce1252cfc8cc531079bc3&chksm=97f6afaca08126ba0f83d69bf7249216f3ba44d9d27c896ee1461d2d773a313520d94ccc11ce&scene=21#wechat_redirect) 450 | 451 | [对 Kotlin 与 Java 编程语言的思考](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487729&idx=1&sn=98c220302f1c186a48e3794296ee12cc&chksm=97f6ae45a0812753f9e2b39beec359d0238a1c9a15d705580bbcfc8a76be12a7d5e4c997e743&scene=21#wechat_redirect) 452 | 453 | 454 | 455 | > Android 开发者技术平台,欢迎将你的技术文章分享给大家,2019 我们一起进步! 456 | 457 |  458 | --------------------------------------------------------------------------------
233 | * 先通过ThumbnailUtils来创建一个视频的缩略图,然后再利用ThumbnailUtils来生成指定大小的缩略图。 234 | * 如果想要的缩略图的宽和高都小于MICRO_KIND,则类型要使用MICRO_KIND作为kind的值,这样会节省内存。 235 | * 236 | * @param videoPath 视频的路径 237 | * @param width 指定输出视频缩略图的宽度 238 | * @param height 指定输出视频缩略图的高度度 239 | * @param kind 参照MediaStore.Images.Thumbnails类中的常量MINI_KIND和MICRO_KIND。 240 | * 其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96 241 | * @return 指定大小的视频缩略图 242 | */ 243 | private Bitmap getVideoThumbnail(String videoPath, int width, int height, 244 | int kind) { 245 | Bitmap bitmap = null; 246 | // 获取视频的缩略图 247 | bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind); 248 | bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, 249 | ThumbnailUtils.OPTIONS_RECYCLE_INPUT); 250 | return bitmap; 251 | } 252 | ``` 253 | - - - - - 254 | ```java 255 | /** 256 | * 从系统文件管理获取选择的文件路径 257 | * 258 | * @param context 259 | * @param uri 260 | * @return 261 | */ 262 | private String getFmPath(Context context, Uri uri) { 263 | if ("content".equals(uri.getScheme())) { 264 | String[] projection = {"_data"}; 265 | Cursor cursor = null; 266 | try { 267 | cursor = context.getContentResolver().query(uri, projection, null, null, null); 268 | int column_index = cursor.getColumnIndexOrThrow("_data"); 269 | if (cursor.moveToFirst()) { 270 | return cursor.getString(column_index); 271 | } 272 | } catch (Exception e) { 273 | 274 | } 275 | } else if ("file".equalsIgnoreCase(uri.getScheme())) { 276 | return uri.getPath(); 277 | } 278 | return null; 279 | } 280 | ``` 281 | - - - - - 282 | ```java 283 | 获取手机IP 284 | 285 | 1.使用WIFI 286 | 287 | 添加权限 288 | 289 | 290 | 291 | 292 | 代码: 293 | public void onCreate(Bundle savedInstanceState) { 294 | super.onCreate(savedInstanceState); 295 | setContentView(R.layout.main); 296 | 297 | //获取wifi服务 298 | WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 299 | //判断wifi是否开启 300 | if (!wifiManager.isWifiEnabled()) { 301 | wifiManager.setWifiEnabled(true); 302 | } 303 | WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 304 | int ipAddress = wifiInfo.getIpAddress(); 305 | String ip = intToIp(ipAddress); 306 | EditText et = (EditText)findViewById(R.id.EditText01); 307 | et.setText(ip); 308 | } 309 | private String intToIp(int i) { 310 | return (i & 0xFF ) + "." + 311 | ((i >> 8 ) & 0xFF) + "." + 312 | ((i >> 16 ) & 0xFF) + "." + 313 | ( i >> 24 & 0xFF) ; 314 | } 315 | 此方法是没有问题的,Android 高低版本都合适 316 | 317 | 2、使用GPRS 318 | 319 | 权限: 320 | 321 | 代码: 322 | //获取本地IP 323 | public static String getLocalIpAddress() { 324 | try { 325 | for (Enumeration en = NetworkInterface 326 | .getNetworkInterfaces(); en.hasMoreElements();) { 327 | NetworkInterface intf = en.nextElement(); 328 | for (Enumeration enumIpAddr = intf 329 | .getInetAddresses(); enumIpAddr.hasMoreElements();) { 330 | InetAddress inetAddress = enumIpAddr.nextElement(); 331 | if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) { 332 | return inetAddress.getHostAddress().toString(); 333 | } 334 | } 335 | } 336 | } catch (SocketException ex) { 337 | Log.e("WifiPreference IpAddress", ex.toString()); 338 | } 339 | return null; 340 | } 341 | ``` 342 | - - - - - 343 | ```java 344 | /** 345 | * X5 WebView 如下设置,加载 word 或者其他网页链接 在退出页面时出现异常的解决办法:onDestroy 方法 346 | */ 347 | WebView x5WebView = new WebView(this); 348 | 349 | WebSettings webSettings = x5WebView.getSettings(); 350 | webSettings.setAllowFileAccess(true); 351 | webSettings.setSupportZoom(true); 352 | webSettings.setUseWideViewPort(true); 353 | webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); 354 | webSettings.setLoadWithOverviewMode(true); 355 | webSettings.setBuiltInZoomControls(true); 356 | webSettings.setSupportMultipleWindows(true); 357 | webSettings.setAppCacheEnabled(true); 358 | webSettings.setDomStorageEnabled(true); 359 | 360 | /** 361 | * 在页面的生命周期方法 onDestroy 做如下判断即可 362 | */ 363 | @Override 364 | protected void onDestroy() { 365 | if (x5WebView != null) { 366 | x5WebView.getSettings().setBuiltInZoomControls(true); 367 | x5WebView.removeAllViews(); 368 | x5WebView.setVisibility(View.GONE); 369 | x5WebView.destroy(); 370 | } 371 | super.onDestroy(); 372 | } 373 | ``` 374 | - - - - - 375 | -------------------------------------------------------------------------------- /codeXiaoSheng17_end.md: -------------------------------------------------------------------------------- 1 | # AndroidSourceCodeXS 2 | Android 旅途路上的一些用得着的资源整理 3 | 4 | ## 公众号 「code小生」 2017推文记录(年终) 5 | 6 | > 对下半年所分享的文章进行整理,[**上半年总结的 98 篇好文请点击这里**](https://github.com/Android-Mu/AndroidSourceCodeXS/blob/master/codeXiaoSheng17_middle.md), 7 | 很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可以查找了。 8 | 9 | ### App 系列(高仿、练手等) 10 | [你好,芒果!使用 RxKotlin 开发的 Dribbble App.](http://mp.weixin.qq.com/s/qcB7qhQfaehvBL-rD7EC8w) 11 | 12 | [分享我学习 Androd 开发过程中写的小项目](http://mp.weixin.qq.com/s/iDAB7akk9QhHq5JrKzq60A) 13 | 14 | [来自大学生投稿:一个适合新手上手的商城项目](http://mp.weixin.qq.com/s/VxpCVlJhU3_QQgHK2HJ9Bg) 15 | 16 | ["DeepNight-in-kotlin"一个纯看妹纸的 Kotlin 开源项目](http://mp.weixin.qq.com/s/gH4O_daurb0pompeDybszw) 17 | 18 | 19 | ### 自定义 / 仿系列 20 | [自定义 View—手把手教你撸出一个圆形加载进度条](http://mp.weixin.qq.com/s/SL2Axl21NVfx9qz-q_CPiw) 21 | 22 | [Android 仿微信朋友圈,缩放归位功能详细解析](http://mp.weixin.qq.com/s/u-XqKMemuDZ-PM8SoD-OWg) 23 | 24 | [玩转仿探探卡片式滑动效果](http://mp.weixin.qq.com/s/XYcXXehUAJIZU_ykmKWG0Q) 25 | 26 | [高仿网易严选底部弹出菜单](http://mp.weixin.qq.com/s/kMozvRYCnEIkIBFLapZKAQ) 27 | 28 | [自定义 Drawable 实现灵动的红鲤鱼动画(上篇)](http://mp.weixin.qq.com/s/j5eW_jqvfA-WLJDFFRun7w) 29 | 30 | [Android 自定义 View 之继承扩展(仿网易云音乐听歌识曲)](http://mp.weixin.qq.com/s/M2ukB2CnNFZhjNx9a8PT0w) 31 | 32 | [Android 高仿懂球帝我是教练效果](http://mp.weixin.qq.com/s/wNQZbhL6nMzCiqGUikK2FQ) 33 | 34 | [Android 上一个类似 PathMenu 效果的自定义 View 源码分析](http://mp.weixin.qq.com/s/bS20UZfnBy4iQtYr_s7Gkw) 35 | 36 | [自定义 View:用贝塞尔曲线绘制酷炫轮廓背景](http://mp.weixin.qq.com/s/SzZuiRMz8QWzNqCjq2gI_A) 37 | 38 | [回炉再造,灵活的 YMenuView 2.0 诞生](http://mp.weixin.qq.com/s/Cl3JHw84L1XBgKBMeveE4A) 39 | 40 | [自定义 LayoutManager 实现弧形以及滑动放大效果 RecyclerView](http://mp.weixin.qq.com/s/VQGx1_Q-7No0gXficmjujw) 41 | 42 | [自定义 View 之炫酷的成绩展示界面](http://mp.weixin.qq.com/s/WamWBViJMNksefxs8xIB_Q) 43 | 44 | [仿知乎内容广告栏 WindowImageView](https://mp.weixin.qq.com/s/VZnDPLzMDD-c7nV0KIWPnQ) 45 | 46 | [仿微信表情输入键盘(支持 Gif 表情图文混排 )](http://mp.weixin.qq.com/s/A-zDgAKx_xkgWkdOHBpeYg) 47 | 48 | 49 | ### 框架/库(封装使用) 50 | [为 Retrofit2 提供的 FastJson 转换库](http://mp.weixin.qq.com/s/2QbqVmh0-5v10E-Ge-3Dog) 51 | 52 | [一步一步带你认识 MVP+Retrofit+Rxjava 并封装(二)](http://mp.weixin.qq.com/s/Iswvq0zoqi9qQp3eGVD7Iw) 53 | 54 | [Android 和 H5 交互-框架篇](http://mp.weixin.qq.com/s/CDinDcARYfOnL4yysspQsQ) 55 | 56 | [大神带你看——fastjson 那些事.pptx](http://mp.weixin.qq.com/s/lOMipMy29MgmnfpgK2iHww) 57 | 58 | [三行代码实现 TabLayout+ViewPager 的 Tab 滑动效果,从封装到开源](http://mp.weixin.qq.com/s/VhrffiRARmYeTlFqrmjmeA) 59 | 60 | [小之的架构之路——Android MVVM 面向接口型框架封装和单元测试](https://mp.weixin.qq.com/s/bOBp7U3BA6CQ7PWjWw979g) 61 | 62 | [少年郎,你需要封装好的 ViewPager 工具类](http://mp.weixin.qq.com/s/UtvhSllW_-59wZjIGaa5FQ) 63 | 64 | 65 | ### 求职 66 | [帝都三年 Java,说说我的求职之路](http://mp.weixin.qq.com/s/Kmi8Xs35vT84GtAjnp5QeA) 67 | 68 | [四步准备 Android 面试](http://mp.weixin.qq.com/s/ysKi_XJ1nAWULJ-N_UCfHg) 69 | 70 | [Android 面试 | 全站式导航](http://mp.weixin.qq.com/s/fTfudY1DBYS5JiSkPnbjAg) 71 | 72 | [值得借鉴:耗时两个月的求职经历](http://mp.weixin.qq.com/s/leuQDDAFvuGZjkdAkmzZHQ) 73 | 74 | [面试官之初体验,请考虑](http://mp.weixin.qq.com/s/IIaQn4veC9_YVJL2fGiYgw) 75 | 76 | [经历的某度的一场面试](http://mp.weixin.qq.com/s/qlSiIJRwPMpPbpji5Lx5uA) 77 | 78 | [一个三本学生的面试之旅](http://mp.weixin.qq.com/s/vqAf6UF99zfIQGDjcjEclA) 79 | 80 | [漫无止境的秋招](http://mp.weixin.qq.com/s/mq1Fo5pD8CLuwpOAKXqnUA) 81 | 82 | 83 | ### 干货 84 | [程序员,你还没有软技能吗?难怪你不幸福](http://mp.weixin.qq.com/s/M6vd26jO4-IccS-DX8k59A) 85 | 86 | [十年的老代码,你敢动?](https://mp.weixin.qq.com/s/-XX02ec-L1z-_ZhwIYGRXA) 87 | 88 | [程序员成长历程的四个阶段](http://mp.weixin.qq.com/s/lUxIXhlRGsJxOBjumTFsYw) 89 | 90 | [2017 | 我在 5 个月时间里分享了 98 篇文章](http://mp.weixin.qq.com/s/Dh5ur11SDXgQAu7jKtDU8A) 91 | 92 | [「译文」资深程序员应该有的样子](http://mp.weixin.qq.com/s/JTIrgQ9PKXHCCejuhi4XeA) 93 | 94 | [预告 | 送书福利](http://mp.weixin.qq.com/s/oa01iVP7aOxBlE36iI0Q7A) 95 | 96 | [非常有用的资源合集-开发设计再也不愁啦](http://mp.weixin.qq.com/s/8hPVS8e2cq3JRpG1mRizww) 97 | 98 | [给编程生涯充电的 10 本书](http://mp.weixin.qq.com/s/Asx_9gNcYely8Yo6oZCmMA) 99 | 100 | [推荐几个开源库](http://mp.weixin.qq.com/s/wpygDxIMzV4SkOr5vqPRZQ) 101 | 102 | 103 | ### 源码分析 104 | [三步掌握 Android 中的 AIDL](http://mp.weixin.qq.com/s/KkGefJxHF_MLlb5K2p-WWg) 105 | 106 | [Android 进阶 - 视图层级实时分析(含福利)](http://mp.weixin.qq.com/s/CkTNrLu0AIDGsPQKIXz-ug) 107 | 108 | 109 | ### 职场 110 | [中国程序员如何升职加薪,也许我们该学学印度人](http://mp.weixin.qq.com/s/aWvYfjvH9fRVP2oRPZvA_A) 111 | 112 | [跃迁:成为高手的技术](http://mp.weixin.qq.com/s/dF1t5v8qxZH8SMkUHAvB8g) 113 | 114 | 115 | ### 经验分享 116 | [程序员应该读的 7 本计算机书](http://mp.weixin.qq.com/s/rRQB1zT1T5vwUpWAdb0Z-g) 117 | 118 | [一个老程序员的建议](http://mp.weixin.qq.com/s/lJliBcfm1YO9gjnMRwgjUQ) 119 | 120 | [Android 新手如何学习开发一款 app?](http://mp.weixin.qq.com/s/ukVT1VjeM_-MgZN7zx_1FQ) 121 | 122 | [种一棵树最好的时间是十年前,其次是现在](http://mp.weixin.qq.com/s/fJNJmLCumyLf06sJsr81CA) 123 | 124 | [30 岁程序员的选择,一线 OR 二线?](http://mp.weixin.qq.com/s/n5A1nkzf0mgd2EXWvbSBSg) 125 | 126 | [软件开发中的 10 条最佳指导原则](http://mp.weixin.qq.com/s/u-XOfzCo7PY51gwol7PfCw) 127 | 128 | [如何打造个人技术影响力](http://mp.weixin.qq.com/s/nGxeJB-fPpOWwg13Ii5H9w) 129 | 130 | [6 天时间修改 1 行代码:现实中的软件开发流程](http://mp.weixin.qq.com/s/2MZ_xBZ1_U4I5sw4pktmAA) 131 | 132 | [程序员、架构师、技术经理、技术总监和 CTO 都是干什么的?](http://mp.weixin.qq.com/s/m5mPLK8qp2KOHdUwUs95kw) 133 | 134 | [如何有效报告 bug](http://mp.weixin.qq.com/s/1X_ZodEa05pOAUS641MITw) 135 | 136 | [我的 10 年自学编程之路](http://mp.weixin.qq.com/s/n9saZOwsBVZebkDWPZ5oQg) 137 | 138 | [别让程序员停止在 35 岁,如何让我们走得更远](http://mp.weixin.qq.com/s/njGNL6F-aHgP6gUo5ouvsw) 139 | 140 | [编程的自学方法](https://mp.weixin.qq.com/s/dsBoZHfsb97owCKiQVIF6g) 141 | 142 | [开除了没情商的“技术大神”后,整个团队都好起来了](http://mp.weixin.qq.com/s/YrfESqAh-hCOLh3fHsstEQ) 143 | 144 | [程序员的五种不同寻常的特质](http://mp.weixin.qq.com/s/PFkE_zM-nrdOeU2fRK3y2Q) 145 | 146 | 147 | ### 完整系列 148 | [Android 开发之漫漫长途Ⅰ—Android 系统的创世之初以及 Activity 的生命周期](http://mp.weixin.qq.com/s/XB7bjkEPz8fcL3qrHadUMg) 149 | 150 | [Android 开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)](http://mp.weixin.qq.com/s/-hgEHOxjcGEgmD0CqUFx3Q) 151 | 152 | [Android 开发之漫漫长途 Ⅲ—Activity 的显示之 Window和View(2)](http://mp.weixin.qq.com/s/YHrubcanydIkbu1PKSHrCw) 153 | 154 | [Android 开发之漫漫长途 Ⅳ——Activity 的显示之 ViewRootImpl 初探](http://mp.weixin.qq.com/s/DKgwS6wkX3xP6ypScDmZUA) 155 | 156 | [Activity 显示之 ViewRootImpl的PreMeasure、WindowLayout、EndMeasure 等方法](http://mp.weixin.qq.com/s/QnW3BRo4_ToL8TLGTHJ1IA) 157 | 158 | 159 | ### 项目中的技术 160 | **Gradle** 161 | [Android 解锁 Gradle 依赖新姿势](https://mp.weixin.qq.com/s/bzfe0CT4jFGVhwE2LZc1Ig) 162 | 163 | [Gradle 的高级技巧](http://mp.weixin.qq.com/s/dSFdnjEq67UIoRixNeFc2w) 164 | 165 | [提速 Android Gradle 构建](http://mp.weixin.qq.com/s/6XhH7_kmzTS6JPwdJ97L7A) 166 | 167 | 168 | **优化/瘦身** 169 | 170 | [Android 性能小技巧](http://mp.weixin.qq.com/s/C8J7BWVufogcCeALkQBGOA) 171 | 172 | [Android APK 瘦身实践](http://mp.weixin.qq.com/s/3IALGEB6YnFb4Wj8Q4JqvA) 173 | 174 | **组件化** 175 | 176 | [Android 组件化 —— 路由设计最佳实践](http://mp.weixin.qq.com/s/f9D8P0VF2cspvfUiIWNb4w) 177 | 178 | [Android 彻底组件化 demo 发布](http://mp.weixin.qq.com/s/aWUixHMhU8g0W4dapr0HPg) 179 | 180 | [Android 彻底组件化番外篇-gradle3.0.0](http://mp.weixin.qq.com/s/kr4SqGcTnWmsQMwHHbLCrw) 181 | 182 | 183 | **小程序** 184 | 185 | [微信小程序实战篇-个人中心](http://mp.weixin.qq.com/s/53wefLCa0113Arka7AuzSA) 186 | 187 | **JVM** 188 | 189 | [Android 进阶之简述 JVM 基础(一):走进Java](http://mp.weixin.qq.com/s/7vwQMEHamHSuDZ4c5DjIoA) 190 | 191 | [Android 精进之简述 JVM 基础(二):Java内存区域与内存溢出异常](https://mp.weixin.qq.com/s/FtgS0VI9xl2-lyYiMniRkA) 192 | 193 | [Android 精进:简述 JVM 基础(三):垃圾收集器与内存分配策略](http://mp.weixin.qq.com/s/1n9ZYKfxwQle7WdvNqUMZg) 194 | 195 | [简述 JVM 基础(四):类结构文件](http://mp.weixin.qq.com/s/Xucw1VeYGgmF9O7T16CVow) 196 | 197 | [简述JVM基础(五):虚拟机类加载机制](http://mp.weixin.qq.com/s/gdfbGETzGA_V5_RqLYXs3g) 198 | 199 | [简述JVM基础(六):虚拟机字节码执行引擎](http://mp.weixin.qq.com/s/ZP4TyBFKmjxRxULhl1NRWA) 200 | 201 | [简述JVM基础(七): Java 内存模型与线程](http://mp.weixin.qq.com/s/8y1FknUY7NcmgNYwVEB7hQ) 202 | 203 | 204 | --- 205 | 206 | [Android 计步模块(类似微信运动)](http://mp.weixin.qq.com/s/M7ksUmf1-L2FdsrJ3dMQpg) 207 | 208 | [HTTP1.0、HTTP1.1 和 HTTP2.0 的区别](http://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A) 209 | 210 | [你被下拉刷新和上拉加载搞烦了吗?](http://mp.weixin.qq.com/s/2-utimMTf2CwgNmbSUaNJA) 211 | 212 | [Android 下实现高效的模糊效果](http://mp.weixin.qq.com/s/WnTkAXXMgT05MqnDL1BeGg) 213 | 214 | [RecyclerView 简单到想哭的多条目实现](http://mp.weixin.qq.com/s/PeECYWvD0W6LeIUn1_ebwA) 215 | 216 | [程序员都该懂点 HTTP](http://mp.weixin.qq.com/s/38GrbReICfu54-nEWylqIQ) 217 | 218 | [WebView 开车指南之最全实用案例](http://mp.weixin.qq.com/s/Tcfjd3OFgeQC-huFCOBP0w) 219 | 220 | [震惊!阿里热更新框架 Sophix 背后隐藏的真相竟然是……](http://mp.weixin.qq.com/s/RSDWeJ-iv9IbKtr2scYXLA) 221 | 222 | [Android 仿微信朋友圈全文、收起功能](http://mp.weixin.qq.com/s/X5jl9pivAYxtwbp02WCUMA) 223 | 224 | [Android 的毛玻璃模糊效果,我使用 OpenCV 来搞](http://mp.weixin.qq.com/s/9DZnjOh31DvJLH7xcNhAuQ) 225 | 226 | [「DragMoreScrollView」一种相册交互效果的实现](http://mp.weixin.qq.com/s/yl0ww0MzKwKb4fN6V3RVZw) 227 | 228 | [关于多选(有动画)解决方案,你需要的可能是这个](http://mp.weixin.qq.com/s/bf0CLdBsCHd67YpaSlX3rA) 229 | 230 | [关于 Android Zxing 3.3.0 的填坑](http://mp.weixin.qq.com/s/08XNoEBmFOmCc-U4nzo8fw) 231 | 232 | [Android 录音功能直接拿去用](http://mp.weixin.qq.com/s/LorIJvuYuTNtMUqUt_uH5Q) 233 | 234 | [Android 实现 dialog 的 3D 翻转](http://mp.weixin.qq.com/s/LEOB83WC5Jn_LT-dWVPSqw) 235 | 236 | [仿房产销冠 APP 销控表界面-多 RecyclerView 同步滚动](http://mp.weixin.qq.com/s/fuX2FotrO9isrYOmd8jo4Q) 237 | 238 | [D 项目 Android 模块化 VCS 演进之路](http://mp.weixin.qq.com/s/BbDYIJ9EKHl_X5vtogqkWQ) 239 | 240 | [使用 ACTION_IMAGE_CAPTURE 可能存在的风险](http://mp.weixin.qq.com/s/MeYkKeDMwrjPEvcU96NR_w) 241 | 242 | [Android 中的工厂模式(减少 if-else 和 switch-case)](http://mp.weixin.qq.com/s/J0uAQy0iMDNBy45TQbUzFA) 243 | 244 | [Android Transition Framework 详解---超炫的动画框架](http://mp.weixin.qq.com/s/4_sjHlIrwzOHiK1Sp4Zgog) 245 | 246 | [Android 一起来看看 7.0 的新特性 FileProvider](http://mp.weixin.qq.com/s/05EIPgg_4LjrRQxPjqG-gg) 247 | 248 | [Android 如何在应用程序一段时间无操作后 退出登录](http://mp.weixin.qq.com/s/3ChfvTgQLzsSU_eedZL8bg) 249 | 250 | [Android Dex 分包](http://mp.weixin.qq.com/s/CYFNKPtRgfnbqJyN4IxE3Q) 251 | 252 | [细细品读 Retrofit 的设计之美一](http://mp.weixin.qq.com/s/I4M1QCxQx49IA-hVjhelKQ) 253 | 254 | [细细品读 Retrofit 的设计之美 二](http://mp.weixin.qq.com/s/ReluZMc73D6-VReFX7CgDQ) 255 | 256 | [Android Binder—APP->framework(mRemote的前世今生)](https://mp.weixin.qq.com/s/qWea3A7e0Tu3vZqJLSCT_w) 257 | 258 | [使用 Dagger2 前你必须了解的一些设计原则](http://mp.weixin.qq.com/s/bCBrz6gISlq_t2BrpuxTkg) 259 | 260 | [在 Android 上,一个完整的 UDP 通信模块应该是怎样的?](http://mp.weixin.qq.com/s/qkrcF7zAVeiY0_KScatIpQ) 261 | 262 | [MediaPlayer 实现金额的语音播报功能](http://mp.weixin.qq.com/s/vuEK1vKJqR1Qx7I44pYeiA) 263 | 264 | [Android 广播的那些事儿](https://mp.weixin.qq.com/s/hAt4saeSLS5MWhHPEkbXrw) 265 | 266 | [视差动画 - 雅虎新闻摘要加载](http://mp.weixin.qq.com/s/fgih9IsLPJbNK8EvQt6YBw) 267 | 268 | [Android App 自动化测试: OPEN-STF环境搭建](http://mp.weixin.qq.com/s/JNHKJfnW74tDeVilIfnfMg) 269 | 270 | [一个容错的 Gson 新世界](http://mp.weixin.qq.com/s/bvu_5odxqpDXzAwHctNXfw) 271 | 272 | [Android 谈谈自动化测试](http://mp.weixin.qq.com/s/-0e1wd2iveQPMWgGFcmOwQ) 273 | 274 | [Android•Lottie 动画库填坑记](http://mp.weixin.qq.com/s/ipu32zPjaHeqICgOGqct9g) 275 | 276 | [MixPanel -Android 端埋点技术研究](http://mp.weixin.qq.com/s/uzvzF2owmw_g5vP-Np7x5w) 277 | 278 | [视频播放技术汇总(列表播放,小窗播放,跨界面播放,播放中网络切换提示)](http://mp.weixin.qq.com/s/_4CXBIjVcOld76523ZGzFA) 279 | 280 | [巧用 Fragment,解耦 Android6.0 权限适配手记](http://mp.weixin.qq.com/s/UPU-suPWvPFWG42ZWDWKkw) 281 | 282 | [漫画:什么是B-树?](http://mp.weixin.qq.com/s/w4BU3P1909n7iPcqk68N7Q) 283 | 284 | [微信 Tinker 在 Android 中集成以及使用](http://mp.weixin.qq.com/s/MFpvNeVHuv2J4m_Wz-NZbw) 285 | 286 | [Android 端“被挤下线”功能的实现](http://mp.weixin.qq.com/s/rGOosMyAIVvbafj1vXpj8A) 287 | 288 | [Android 手机 全面屏(18:9屏幕)适配指南](http://mp.weixin.qq.com/s/UfqJ0suGkoxrZiSdTn8Lpw) 289 | 290 | [Android 借助 Python 实现自动打包上传 fir](http://mp.weixin.qq.com/s/BUht6BR0T0yAi6RrAVIwQA) 291 | 292 | [带你通俗易懂的理解——线程、多线程与线程池](http://mp.weixin.qq.com/s/mA59X7bOotyWwvf2V6zMIA) 293 | 294 | [Android NFC 技术解析,附 Demo 源码](https://mp.weixin.qq.com/s/lVvvIGapceFrT7_oo_rPBw) 295 | 296 | [Android 中.aar文件生成方法与用法](http://mp.weixin.qq.com/s/NN5pJNoUXGRZJJL5yBEQ4A) 297 | 298 | [Android 键盘适配-中英文适配](http://mp.weixin.qq.com/s/Yncr0XZ4MCWZH2vzTVyYJw) 299 | 300 | [软件开发知识体系](http://mp.weixin.qq.com/s/A5n9PG0aUl2z2z3zakZF3A) 301 | 302 | [热修复——Tinker 的集成与使用](http://mp.weixin.qq.com/s/xpB_ipYv9cN8k8fdr_7wCw) 303 | 304 | [AndroidStudio JNI详细教程+Gradle3.0 以上 JNI 爬坑之旅](http://mp.weixin.qq.com/s/hdWjr7A7wiSoHKI3VnsT5w) 305 | 306 | [热修复——Bugly 让热修复变得如此简单](http://mp.weixin.qq.com/s/rv7cUIOoLx60QZisAG0yyg) 307 | 308 | [Android Lint增量扫描实战纪要](http://mp.weixin.qq.com/s/RMz0y0nXatupoUomoWOtmQ) 309 | 310 | [理解 Android 硬件加速原理的小白文](http://mp.weixin.qq.com/s/Xodc0Eg7_rn24OdKRbntSA) 311 | 312 | -------------------------------------------------------------------------------- /codeXiaoSheng17_middle.md: -------------------------------------------------------------------------------- 1 | # AndroidSourceCodeXS 2 | Android 旅途路上的一些用得着的资源整理 3 | 4 | ## 公众号 code小生 2017推文记录(半年总结) 5 | 6 | > 对上半年所分享的文章进行一个整理,很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可以查找了。[下半年不断更新...](https://github.com/Android-Mu/AndroidSourceCodeXS/blob/master/codeXiaoSheng17_end.md) 7 | 8 | ### App 系列(高仿、练手等) 9 | [**SmartRecom:一款干货满满,助你进阶的 App 项目**](http://mp.weixin.qq.com/s/u8oo7cdb-sqtge4jVw8lbg) 10 | 11 | [**Android 仿今日头条的开源项目**](http://mp.weixin.qq.com/s/xdFskas_X4FwCqUES-JAjQ) 12 | 13 | [**手把手教你从零开始做一个好看的 APP**](http://mp.weixin.qq.com/s/jOW40fpAlNGvrOfQe9vJyA) 14 | 15 | [**KeepGank.IO - 又一款开源 Gank.IO 客户端. 欢迎 star**](http://mp.weixin.qq.com/s/twunvTc8IY9tSoC7kc-SXg) 16 | 17 | [**一个用来巩固 Android 基础的 APP**](http://mp.weixin.qq.com/s/K6wVgsn4MI0mx2cwKWFPUw) 18 | 19 | [**jsoup爬虫简书首页数据做个小Demo**](http://mp.weixin.qq.com/s/8QcXFaBLsgUiSRH2Gy_szQ) 20 | 21 | [**快毕业了,撸一个小项目(新闻段子客户端)**](http://mp.weixin.qq.com/s/gMzDv_sCJS6Vzx76liI-Rg) 22 | 23 | [**Android 一款十分简洁、优雅的日记APP**](https://mp.weixin.qq.com/s/0hMV7IMei74LTuUmFQ1Snw) 24 | 25 | ### 自定义 / 仿系列 26 | [**仿 Nice 首页图片列表 9 图样式,并实现拖拽效果**](http://mp.weixin.qq.com/s/XBM7eYuFl7I8mNCTizKuyA) 27 | 28 | [**仿简书动态 searchview 的实现,代码就这么多点**](http://mp.weixin.qq.com/s/YIYDVyDLeevHRJ0tZfs1_A) 29 | [ 30 | **Android 使用 Path 仿支付宝支付成功失败动画**](http://mp.weixin.qq.com/s/76yng2hofs0DBaKq55Ufjg) 31 | 32 | [**Android 仿 QQ 侧滑菜单**](http://mp.weixin.qq.com/s/mgU5M9mR_gZa5K-L92ZjBA) 33 | 34 | [**京东快报轮播公告的实现**](http://mp.weixin.qq.com/s/dmGzlEYn7fOk1LakiIrEAw) 35 | 36 | [**[Android] 自定义 View 之仿 QQ 讨论组头像**](http://mp.weixin.qq.com/s/0WSfWzoX9MnUOj79_P7pig) 37 | 38 | [**一步步教你画股票图,K 线图,高仿雪球股票**](http://mp.weixin.qq.com/s/1YjGkgGKpMSYDdkSu18ZUQ) 39 | 40 | [**Android 自定义控件(仿天猫搜索框)**](http://mp.weixin.qq.com/s/zxSd9AMAItocZJczW4FxDA) 41 | 42 | [**自定义圆环百分占比 view (label 文字支持自动换行和设置显示行数)**](http://mp.weixin.qq.com/s/1IYsvApJERkPU-10keJ8-w) 43 | 44 | [**Android 仿 instagram 和微博的头像点击加载动画**](http://mp.weixin.qq.com/s/Ii1brow3qiEOxrdCHehImw) 45 | 46 | [**真正的画廊,左右条目可点击居中,左右条目可滑动**](http://mp.weixin.qq.com/s/xtw6OjMhn1o4eW8tiHQD5g) 47 | 48 | [**从未如此惊艳!你好,SuperTextView**](http://mp.weixin.qq.com/s/5eZxtu-_O0_hqW2b_prK_g) 49 | 50 | [**Android 撸起袖子,自己封装 DialogFragment**](http://mp.weixin.qq.com/s/jwxfcvgnoIFViJ6Bcb8V1w) 51 | 52 | [**类似 QQ 的文件管理器**](https://mp.weixin.qq.com/s/e7otNLqCSBW9rz4ChLx_cg) 53 | 54 | [**Android 模仿微信选择图片**](http://mp.weixin.qq.com/s/e5cG1soYm7m2KMB2PnTiqw) 55 | 56 | [**教你手写一个贝塞尔曲线效果的 Loading View**](http://mp.weixin.qq.com/s/ZK7BDlK8dE2oRqieGvBXew) 57 | 58 | [**仿简书长按文章生成图片效果**](http://mp.weixin.qq.com/s/sSIrHOChrgi6ccFKWm80uQ) 59 | 60 | [**Android自定义view之属性动画熟悉**](http://mp.weixin.qq.com/s/9AvvuKkiW8tveiEVQ0y5oA) 61 | 62 | [**Android自定义控件之天气视图**](http://mp.weixin.qq.com/s/-Up4UwJiS2UQ_hS5yefd4Q) 63 | 64 | [**手把手教你打造RecyclerView滚动特效**](http://mp.weixin.qq.com/s/SCaWJFRMI4oVIJLOvGYw7Q) 65 | 66 | ### 框架/库(封装使用) 67 | [**一步一步带你认识 MVP+Retrofit+Rxjava 并封装(一)**](http://mp.weixin.qq.com/s/VJHbdNc4HmEvk0LNK8tftg) 68 | 69 | [**Android 基于 glide 4.0 封装图片加载库**](http://mp.weixin.qq.com/s/7VK9CLvJ-ZMW0dLHs6qJVg) 70 | 71 | [**MVP+多线程+断点续传 实现 app 在线升级库 (手把手教你打造自己的 lib)**](http://mp.weixin.qq.com/s/r47F32QY9olF6wVAF3d-0Q) 72 | 73 | [**教你打造 Android 揭面水波动画库-AnimationHelper**](http://mp.weixin.qq.com/s/Dx7u7sxI-lBSCbokKWUHHg) 74 | 75 | [**【Android】Realm 详解**](http://mp.weixin.qq.com/s/mbZsvdImJE_RszoK1vMjGg) 76 | 77 | [**Retrofit2+okhttp3缓存设置**](http://mp.weixin.qq.com/s/JMd8_62yNhN9VCzlt13PZg) 78 | 79 | [**阿里巴巴推出超强针对布局方案和布局复用的开源框架(vlayout)**](http://mp.weixin.qq.com/s/BYtF_Kzy7OWePJRNpfoHWQ) 80 | 81 | [**Android 实现一个简单的下载工具**](http://mp.weixin.qq.com/s/9WYNEhQ2NpK_dh6fOXeuFQ) 82 | 83 | [**Android架构那些事之第三方库的隔离**](http://mp.weixin.qq.com/s/Q-H30R1jQinbaB3jYowOZQ) 84 | 85 | 86 | ### 求职 87 | [**2017 年 Android 曲折的求职之路**](http://mp.weixin.qq.com/s/N8EcP9dV1LWzkQDNRF2YOg) 88 | 89 | [**2017 Android 暑期实习生面试经验谈**](https://mp.weixin.qq.com/s/HjUOj7M9b94w97ROh8T91g) 90 | 91 | [**杭州找 Android 工作的点点滴滴**](http://mp.weixin.qq.com/s/86ejicK5BBo3LYoAEBlhaA) 92 | 93 | [**那些IT培训出来的Android工程师,希望你面试时涨点记性**](http://mp.weixin.qq.com/s/wd2vaDa1Pi3DpAXDjbebgA) 94 | 95 | [**为跳槽的你献计献策(Android)**](http://mp.weixin.qq.com/s/NiRoLfuN4B2PeNLlQpieNw) 96 | 97 | ### 干货 98 | [**瓶颈:没有技术深度的苦恼**](http://mp.weixin.qq.com/s/GuiP2dmkM9z8rzzxdn3Pww) 99 | 100 | [**良心推荐:总结 Android 开发中必备的代码 Review 清单**](http://mp.weixin.qq.com/s/0U733-oOv6HTW-tmhWi4Vw) 101 | 102 | [**想编程,是勤奋自学还是去培训班学习?**](https://mp.weixin.qq.com/s/bRKqNu6AntHAooCJg2VZJg) 103 | 104 | [**编程之旅,致新入行的朋友**](https://mp.weixin.qq.com/s/TBhccRDmI47e2vl8TcX4SA) 105 | 106 | [**程序员,你还没有软技能吗?难怪你不幸福**](http://mp.weixin.qq.com/s/M6vd26jO4-IccS-DX8k59A) 107 | 108 | [**2017,你绝对想尝试的新安卓库**](https://mp.weixin.qq.com/s/-O8G1wInED5PhMOo_d6KOg) 109 | 110 | [**[干货]Android 中的 Calendar,听说你有这样的需求**](http://mp.weixin.qq.com/s/w_NiEJLx0AECepZ8cRhzsg) 111 | 112 | [**变革者——献给所有软件开发自学者**](http://mp.weixin.qq.com/s/B_I5Q75Bp1z0am-5wqKeXQ) 113 | 114 | ### 源码分析 115 | [**Android 之 Context 底层原理**](http://mp.weixin.qq.com/s/mkSJKT7zbzcSlY4GQ_v-9Q) 116 | 117 | [**可能是讲解 Binder 机制最好的文章**](http://mp.weixin.qq.com/s/pPrfIq-8yV5CnbIIKprm7Q) 118 | 119 | [**全栈级别梳理-Android系统启动流程**](http://mp.weixin.qq.com/s/vZsqyfL4ss2sMLr_nZLcow) 120 | 121 | [**浅析HandlerThread**](http://mp.weixin.qq.com/s/eZnhFc-U6QW2bfGz3ppYOA) 122 | 123 | [**源码分析之LayoutInflater**](http://mp.weixin.qq.com/s/Xkx4OJ2ed-itqGfzD-538Q) 124 | 125 | ### 职场 126 | [**程序员如何选择未来的职业路线**](http://mp.weixin.qq.com/s/u9xrlRvSPrH9KYpVWYIxcQ) 127 | 128 | [**【转】程序员该如何定位?看这四大方向**](http://mp.weixin.qq.com/s/8jMnBGEoHegQ-rMIj1C2kA) 129 | 130 | ### 经验分享 131 | [**程序员之路-学习经验总结分享**](http://mp.weixin.qq.com/s/0U3DHX60c2rYHUX01iagMw) 132 | 133 | [**如何提升你的能力?给年轻程序员的几条建议**](http://mp.weixin.qq.com/s/0azo-znEXajF2R54g_0q3g) 134 | 135 | [**给一年左右经验想去大厂的同学们的一些建议**](https://mp.weixin.qq.com/s/z-BbaMOYkGU0AF8_x6EpJg) 136 | 137 | [**Android 技术总监应该干的那些事**](http://mp.weixin.qq.com/s/o4ac8J8gC60__9hFkOzvkw) 138 | 139 | ### 完整系列 140 | #### NDK 141 | [**Android NDK 开发之旅 1--C 语言基础--基本数据类型**](http://mp.weixin.qq.com/s/Lhtk02a3tVeM5Zn5Hrv6Nw) 142 | 143 | [**Android NDK 开发之旅 2--C 语言基础--指针**](http://mp.weixin.qq.com/s/6VGYIzs32A1KmiNIGrqqQg) 144 | 145 | [**Android NDK 开发之旅 3 -- C 语言基础--内存分配**](http://mp.weixin.qq.com/s/-GpOZQaMspA_uNvef0UwnQ) 146 | 147 | [**Android NDK 开发之旅 4--C 语言基础--字符串**](http://mp.weixin.qq.com/s/ULWt4FxksS2BvPnkN2745A) 148 | 149 | [**Android NDK 开发之旅 5--C 语言基础--结构体**](http://mp.weixin.qq.com/s/JHA3dZd6YprJtWhRYMLsFA) 150 | 151 | [**Android NDK 开发之旅 6--C 语言基础--联合体与枚举**](http://mp.weixin.qq.com/s/_OyWzA1iCRiw2zTamQlOjw) 152 | 153 | [**Android NDK 开发之旅 7--C 语言基础--IO**](http://mp.weixin.qq.com/s/uOZ5TGaaGVWgs8lvLn9F-g) 154 | 155 | [**Android NDK 开发之旅 8--C 语言基础--预编译**](http://mp.weixin.qq.com/s/xlmo7xypqvDLVoM5H8_Uhg) 156 | 157 | [**Android NDK 开发之旅 9--JNI--JNI 开发流程**](http://mp.weixin.qq.com/s/LhhLa2x_vG6qRtNb3mek_w) 158 | 159 | [**Android NDK 开发之旅 10—14**](http://mp.weixin.qq.com/s/-lhGXHhPIpQ9G1Bo7-5rmw) 160 | 161 | #### RxJava 162 | [**给初学者的 RxJava2.0 教程**](http://mp.weixin.qq.com/s/Az0RzhKCPA0YQUym7RyIcQ) 163 | 164 | #### 设计模式 165 | [**开发中的设计模式总结**](http://mp.weixin.qq.com/s/XpJMsamUYz0YpKjXIcbR3A) 166 | 167 | ### 项目中的技术 168 | [**Android Kotlin&BLE(低功耗蓝牙) 笔记**](https://mp.weixin.qq.com/s/D_zp1036eufuYCjPpR4FDw) 169 | 170 | [**Kotlin Primer·第六章·集合泛型与操作符**](http://mp.weixin.qq.com/s/JTvj6srNjvy4Ex-_ZfVY9Q) 171 | 172 | [**优雅地刷新 RecyclerView**](http://mp.weixin.qq.com/s/NXiLi3nGa2sCAUtzzHjurQ) 173 | 174 | [**App 竞品技术分析(系列)**](http://mp.weixin.qq.com/s/_9D38SOYReTCHzYnpd0tVg) 175 | 176 | [**Glide 加载图片实现进度条效果**](https://mp.weixin.qq.com/s/QNk4UrTfPc9CkiF3b3fdQA) 177 | 178 | [**Android 模块化探索与实践**](http://mp.weixin.qq.com/s/A9uVEyXEZJ-z7wOSTS5_0Q) 179 | 180 | [**Android 让你的布局飞起来**](http://mp.weixin.qq.com/s/j-uSXSVh8bLLuiBH6dk1sA) 181 | 182 | [**项目需求讨论-RecycleView 分页加载实现分析**](http://mp.weixin.qq.com/s/6CbpduZKUCgHiy0pp1cahA) 183 | 184 | [**Android 搜索结果显示高亮(有数据滑动底部自动刷新)**](http://mp.weixin.qq.com/s/u0e0OlJuhiJz3ca_fTJgzQ) 185 | 186 | [**Android 通用的下拉刷新,重温事件传递**](http://mp.weixin.qq.com/s/t53INi1kEZggXwLGCioqqA) 187 | 188 | [**Android 检查版本升级应该怎么做?**](https://mp.weixin.qq.com/s/W8wRz_qtTTldslVpzgcu0A) 189 | 190 | [**Android 夜间模式换肤**](http://mp.weixin.qq.com/s/WcG_LKwPy-qQ-NaY1JyUKg) 191 | 192 | [**Android 选择图片上传功能【支持多选拍照预览等】**](http://mp.weixin.qq.com/s/0nfnbCZMM5bKpaG3169CBw) 193 | 194 | [**聊聊安卓 App 里的搜索**](http://mp.weixin.qq.com/s/oz0d5mOfqhgkCe6fjVmvMw) 195 | 196 | [**分享一种 RecyclerView 滑动到底部自动加载的实现方案**](http://mp.weixin.qq.com/s/Oivap3YCeT5IXsVpl7n-lQ) 197 | 198 | [**Android 中使用 RecyclerView + SnapHelper 实现类似 ViewPager 效果**](http://mp.weixin.qq.com/s/DMksgHOuGWhztESGfDgucA) 199 | 200 | [**加快 apk 的构建速度,如何把编译时间从 130 秒降到 17 秒**](http://mp.weixin.qq.com/s/TYBDXB-cYwkn8fQGSNTu3g) 201 | 202 | [**Android 优化 APP 构建速度的 17 条建议**](http://mp.weixin.qq.com/s/2PoLfcnDYmVRSuhImHJDRQ) 203 | 204 | [**Android应用瘦身,从18MB到12.5MB**](http://mp.weixin.qq.com/s/EEuhjTWkLNrUBnS_WIISmw) 205 | 206 | [**细细品读!深入浅出,官方文档看ConstraintLayout**](http://mp.weixin.qq.com/s/kFPDThFZo7ZGOBLUv22myQ) 207 | 208 | [**安卓中如何给按钮添加点击音效**](http://mp.weixin.qq.com/s/tRCtm6xf48ujVyjrK71BeA) 209 | 210 | [**知乎和简书的夜间模式实现套路**](http://mp.weixin.qq.com/s/2IIx-KMET2hN5wVi1X86pA) 211 | 212 | [**学会这两招,再敲代码,才给力**](http://mp.weixin.qq.com/s/IO-nDY_gMBpSRAOqFPKwCg) 213 | 214 | [**使用 Scalpel 3D展示界面布局**](http://mp.weixin.qq.com/s/RfFIxjHvjodCiihaUpeorw) 215 | 216 | [**Android 时间轴的实现(RecyclerView更简单)**](http://mp.weixin.qq.com/s/pJlXVmlPrfcvOPBqqaFvXA) 217 | -------------------------------------------------------------------------------- /codexiaosheng18.md: -------------------------------------------------------------------------------- 1 | ### 2017 文章合集 2 | 3 | [2017 年度文章分类整理](https://blog.csdn.net/wufeng55/article/details/78942859) 4 | 5 |  6 | 7 | 下面是 2018 年公众号所发表的文章分类整理 8 | 9 | ### 面经 10 | 11 | [一年经验 Android 面试记录](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486756&idx=1&sn=1f07f1afa2c0c6577c7355d3aa736acc&chksm=97f6b390a0813a861b54af2437b71caa552f010cb740cffdf5668fa88a370c7047cd85724b84&scene=21#wechat_redirect) 12 | 13 | [记自己 2018 年三月份的面试经历](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486829&idx=1&sn=18ade53089ea0303899e3305b9621c6f&chksm=97f6b3d9a0813acf2c5e84dd82389c9f4c736b8a898b8269ca867fff396a81175cd2d950dd0e&scene=21#wechat_redirect) 14 | 15 | [怎样在 Android 面试中聊聊多线程](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486835&idx=1&sn=664317772ecefdc9ebe30396e0f1c526&chksm=97f6b3c7a0813ad1dd31094a5049cd2a2cbf2cf83d09a3d5be3fa7b57b9bf81ad60198fddb8f&scene=21#wechat_redirect) 16 | 17 | [2018 Android ;面试心得,已拿到 offer](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486871&idx=1&sn=aaf0da72673637f4d8db4aedad09cc8e&chksm=97f6b323a0813a35e193877855b666b1c95817ccfac57e0cd384621ef4f565547505f82252f2&scene=21#wechat_redirect) 18 | 19 | [从技术面试官的角度谈谈简历和面试那些事儿](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486942&idx=1&sn=ab43189166cf09db7073b70d729748e1&chksm=97f6b36aa0813a7c34ece4d544344559d7c0b66a8ad91e03150d82356c1637c9c5c8270ea6d8&scene=21#wechat_redirect) 20 | 21 | [Android开发面试经—常见面试官提问Android题](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487411&idx=1&sn=b72ce32a6e57841c132f7b0510e9fbbf&chksm=97f6b107a0813811c5fc7ba7117d4677fb28915cd75d8f80d005f1f1233e6ff97925437d039a&scene=21#wechat_redirect) 22 | 23 | [蚂蚁金服面试经历-临场发挥](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487444&idx=1&sn=34b3294089639032d6e3709136bbc2aa&chksm=97f6b160a08138767e2bef423764311ad32605b8eaa1cad4e5aac0c43522453144251bf4cf21&scene=21#wechat_redirect) 24 | 25 | [OPPO Android 开发技术面总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487726&idx=1&sn=1f883e8c20c60eef2217c80d48f57c5f&chksm=97f6ae5aa081274ca7167dd8227129512a31501fdb18f861f81c608b84df6cdba8104e97ce13&scene=21#wechat_redirect) 26 | 27 | 28 | 29 | ### 项目、开源库 30 | 31 | [碎阅:一款基于 douban 及 ONE API 开发的资讯类 App](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486782&idx=1&sn=b92af64d826dea20693d8ce8faa73102&chksm=97f6b38aa0813a9cf5396bbc8b0c90dbdd3c9845025d0d0a9691b44f9b4ec67d52a0f44b8aff&scene=21#wechat_redirect) 32 | 33 | [Android 权限-HaloPermission 详细介绍](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486881&idx=1&sn=254fe7c01e39a3811089194e8cbfb9a5&chksm=97f6b315a0813a032b4c431f6186ddd8e4c24e64ae9b15c10bfd3c32c2b47a079321e04cb73a&scene=21#wechat_redirect) 34 | 35 | [年中 Android 开源库推荐](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487013&idx=1&sn=00d45c988dfa7339c6d8911704848683&chksm=97f6b091a08139877a1b896ba1ceea14b173add6d7e30f17b47b172e3cdd8c171e59e44b28da&scene=21#wechat_redirect) 36 | 37 | [Android断点续传下载器JarvisDownloader](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487146&idx=1&sn=2001d56a1b6c5f283637b8d8f690309e&chksm=97f6b01ea081390872fd81d9af173ecca7f264377a9e5d885d550f20e253385144c0de8d9c70&scene=21#wechat_redirect) 38 | 39 | [行万里路:打造一个灵活易用的Banner组件](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487205&idx=1&sn=efc692ea1109b43089f13600ae3949b2&chksm=97f6b051a0813947524a5a079e59b00f1dc2c77f893fb01d07954203d78b3bbb6e3854319d38&scene=21#wechat_redirect) 40 | 41 | [Android开发之漫漫长途XVI——ListView与RecyclerView项目实战](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487350&idx=1&sn=23d27553af7fc8bdd83c44b37ee95f03&chksm=97f6b1c2a08138d4c535e5be573a90d678343e05de4f6cb61e24bd236263434ab581589038af&scene=21#wechat_redirect) 42 | 43 | [Android人脸识别app——基于Face++,MVP+Retofit+RxJava+Dagger高度解耦](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487353&idx=1&sn=6441e7f5788f6152b9f3289e3fe091fa&chksm=97f6b1cda08138dbc9a10bb4662e2bd911194befaa9d06d99c72b8a5638a7333289a9d787709&scene=21#wechat_redirect) 44 | 45 | [首个hybird商业项目踩坑总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487499&idx=1&sn=de2f30a605f752a115d8f77b10c59c4b&chksm=97f6aebfa08127a9bf4e79e596967e959d0168f193ae240212c4433d0b58ff0c483735852989&scene=21#wechat_redirect) 46 | 47 | 48 | 49 | ### 功能 Demo 50 | 51 | [实现城市列表的排序及模糊查询](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486422&idx=1&sn=0375f1630e95c207ee81aa78061851d5&chksm=97f6b562a0813c742ad7b78381cb9d4973b224e7bcad8677918095ac535260d56aa3f0c2e495&scene=21#wechat_redirect) 52 | 53 | [基于 zxing 的二维码扫描](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486457&idx=1&sn=f238cd165e6490f8b6a6211e557da1b4&chksm=97f6b54da0813c5bcc6294650bb3140de5e1d7ad0c10786aeca419fc5ef8640b7ccbc0dd2ba4&scene=21#wechat_redirect) 54 | 55 | [[Android进阶\]OFO首页实现小窥](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486469&idx=1&sn=255fab2c72bc839928c812f4e3924b3b&chksm=97f6b2b1a0813ba709c09f0b55e46bb646d8a7fb7525dd59f4819c861bdb0a75c6e61b43c71a&scene=21#wechat_redirect) 56 | 57 | [Android 自己开发的消息事件小项目DBus](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486514&idx=1&sn=e9e68fb2ec967c55125a88562604de4a&chksm=97f6b286a0813b9069bc2b22450f14df8f0f457b92916d0702eff1e369f8787a420e2845b6c1&scene=21#wechat_redirect) 58 | 59 | [教你用Java来玩答题(百万英雄/冲刺大会等)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486520&idx=1&sn=88b3df003a3de815fdf74dd16a675f9b&chksm=97f6b28ca0813b9a8368bd15aa4be97c9af95ae6341d1125bbf7d404e0a0c41c6bb86505a965&scene=21#wechat_redirect) 60 | 61 | ["巧"仿蚂蚁森林水滴动效](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486588&idx=1&sn=66d11acd21409e828aadef10aa765d1a&chksm=97f6b2c8a0813bde7a37357756741534cad906fd7fa9d5e529292b17258cc09dc20b064e7320&scene=21#wechat_redirect) 62 | 63 | [Charles - Android 多媒体选择器](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486623&idx=1&sn=8077efd65bfff257c4423525413e1432&chksm=97f6b22ba0813b3dcb19d123270a9d1810fc67ec8262f480d17c731122daee65e7f353c8b90f&scene=21#wechat_redirect) 64 | 65 | [Android 语音播报实现方案(无SDK)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486626&idx=1&sn=f252ab89c0d8ae94f519ee74469f5540&chksm=97f6b216a0813b0064aa7a239ffc49c32004276a4c508ee426e12b498e5be7a98ae54a5b2f19&scene=21#wechat_redirect) 66 | 67 | [Android Oss 上传图片的使用](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486760&idx=1&sn=c8e896c4f08fb8ec1c86ab6406a07e78&chksm=97f6b39ca0813a8aca64fd7898db91b7e7ce33920ef2910229b2be44372743630844a35ab938&scene=21#wechat_redirect) 68 | 69 | [教你打造好用KeyBoard(附代码库)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486945&idx=1&sn=1e0e427d7a4a870e29fe0be9c4f781bd&chksm=97f6b355a0813a438a53d4f51b3e578240b3fab31b56a3b3abef8d719ca6d1846df389a7569f&scene=21#wechat_redirect) 70 | 71 | [3D版翻页公告效果](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486946&idx=1&sn=021cbc3a7ac999925a1e889a6c4c5ef3&chksm=97f6b356a0813a40d3c1f069cf508166fefe86e2f8eacd01589692eac5b2695ee0a3e53c961d&scene=21#wechat_redirect) 72 | 73 | [好用解耦的Pin码应用锁(附代码库)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486973&idx=1&sn=8fcf7100d3fc7534c1bb0e64c9cba709&chksm=97f6b349a0813a5f63215debf2b9381fbbcbe98fded568a90fb61f085b7f44a3ce261a5ae1d5&scene=21#wechat_redirect) 74 | 75 | [Android瀑布流优化,解决Recyclerview展示大批量图片时Item自动切换、闪烁、空白等问题](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486968&idx=1&sn=699c2c670933ca49ed1a1002d18c6f5f&chksm=97f6b34ca0813a5a5bed7238aa149dcce35a4f834690b1bab31f1d3641ebd28d8cdf29e01ffe&scene=21#wechat_redirect) 76 | 77 | [Android 仿支付宝城市服务栏目tab选择滑动子View效果](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487014&idx=1&sn=d52911b24beaff6a76ee1d3bab3609bc&chksm=97f6b092a08139843b9a751bdb4ec7fa58f6bd942ea1f1e099abe4b5a5e7c3619b6b2d45dc3d&scene=21#wechat_redirect) 78 | 79 | [Android照片墙应用](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487067&idx=1&sn=63d9410d851c874ac5dd24662dde3110&chksm=97f6b0efa08139f91a71c0189b3b4a170d7134dd8a79f6fc7352ad763e58db0e946c5de6046a&scene=21#wechat_redirect) 80 | 81 | [LayoutTransiton实现简单的录制按钮](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487064&idx=1&sn=59082adf46470cd80a9e9ab5b0caa0b9&chksm=97f6b0eca08139fac27323b3b153abab246c6a07221354bab232a76cc8f26d49f4fbd1577e48&scene=21#wechat_redirect) 82 | 83 | [Activity添加滑动关闭功能-[Android_YangKe\]](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487135&idx=1&sn=b81f40d83c1c3c3bad4a37870e66dce9&chksm=97f6b02ba081393df49f973cd027266a6f97002d70c24d351633336b966571468755003fd8dd&scene=21#wechat_redirect) 84 | 85 | [高仿贝壳找房之使用陀螺仪移动图片Drawable](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487134&idx=1&sn=911efca329c2553694a70a68870f9a98&chksm=97f6b02aa081393cbc48f7c1cd5b7a594e4b3711b027614cce5b2af24ea75becb79c7e62fc9a&scene=21#wechat_redirect) 86 | 87 | [RecyclerView点击item图片,从点击位置,放大到全屏,再次点击关闭](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487144&idx=1&sn=f6844a6e4f10170ae37b93e7b8d2d62e&chksm=97f6b01ca081390a6b5d62ff28d4380f0cd0a79e7b2e112f19d999e23b0df7dfd633dace5506&scene=21#wechat_redirect) 88 | 89 | [Android自定义频道选择器、频道定制](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487195&idx=1&sn=b6f4fb8b6bb41b34924ffccfe1ad5f2d&chksm=97f6b06fa0813979ca6fe00b56b0f735a408a61b179e8674b6ebfc86bb5807367244cf4c4283&scene=21#wechat_redirect) 90 | 91 | [长图片自动循环滚动效果 (仿小红书)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487209&idx=1&sn=a992eaf778a08ffe97519fc6f3949f08&chksm=97f6b05da081394b3e829e0a6572edd7be99bfc413bf7ec1821a0f7d353f5446a4729aae5970&scene=21#wechat_redirect) 92 | 93 | [用RecyclerView的LayoutManager实现grid整页翻页效果](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487332&idx=1&sn=c79ab43087a54b0aa240ffaceaa64c06&chksm=97f6b1d0a08138c6058df724a18cb1cfd704d21127d19f1dbaed773da27b11bb3baf8fcb9082&scene=21#wechat_redirect) 94 | 95 | [基于 opencv 实现人脸检测](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487515&idx=1&sn=c0c46e2af702cab4694f7ba3ae772da0&chksm=97f6aeafa08127b9940d2451b43190ef8a676823c1b3c8e8fc87f55aa2c1d3f5dd36270085f1&scene=21#wechat_redirect) 96 | 97 | 98 | 99 | ### Kotlin 100 | 101 | [使用 Kotlin 实现自定义 LayoutManager+ItemTouchHelper 实现炫酷卡片布局](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486624&idx=1&sn=152c1605188446ddd8dc865a1a7f2d5c&chksm=97f6b214a0813b02e916688746b7a134e45843fa7f8c9a65cf699e93b02599c3095e1d85c51b&scene=21#wechat_redirect) 102 | 103 | [号外!号外!全网第一手Android P刘海屏适配大揭秘,唯一Kotlin算法](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486958&idx=1&sn=efedaaddc94a85a013075d3d5fe95578&chksm=97f6b35aa0813a4cd9ec6cae7b7bb33ce55b59a3f846a1463595c8960cad9ab7980c79f1286a&scene=21#wechat_redirect) 104 | 105 | [用 Kotlin 编写的 MVP+RxJava+Retrofit 黄历 demo](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487282&idx=1&sn=b8f0072360fb141e79ebdebc9e012f1d&chksm=97f6b186a0813890387128a394a84e6fcc86ede254913a762ce12049db126528298674580ed6&scene=21#wechat_redirect) 106 | 107 | 108 | 109 | ### Gradle 110 | 111 | [Android Gradle 多渠道打包](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486694&idx=1&sn=f6114223b83e15921ec68fd7a577713d&chksm=97f6b252a0813b44413b908796e4d41846c79ba374cd1af5f198db9f7c08812a05f638794400&scene=21#wechat_redirect) 112 | 113 | [Gradle基础知识点总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487132&idx=1&sn=c0ebeee4c777edabf7006c39df7c7dfa&chksm=97f6b028a081393e9aa649261b95333dc31d9a9f92b8b934d89e168f2c9759b06b1972634f70&scene=21#wechat_redirect) 114 | 115 | [Gradle构建的生命周期和其对象的理解](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487784&idx=1&sn=88c496f6910c02e5e03be734121d02c4&chksm=97f6af9ca081268a3374a45653b5fc7ca5ee044634f341af0bd13280206e9a1e3712511741db&scene=21#wechat_redirect) 116 | 117 | 118 | 119 | ### 三化(组件化、插件化、模块化)以及热修复 120 | 121 | [Android 彻底组件化—如何使用 Arouter](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486586&idx=1&sn=869b0ca77043cfd39e2e596f169a5d95&chksm=97f6b2cea0813bd898949f4bb0e70a8699b397289d079d10d07840a019d3cd487646ba8ea685&scene=21#wechat_redirect) 122 | 123 | [AndFix 的使用分析](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486612&idx=1&sn=589654055378e6ccc56374a22ffded0d&chksm=97f6b220a0813b36b7a52ee63869573b9fa2ca126fec4714570afe26440db90d84c85ea5de74&scene=21#wechat_redirect) 124 | 125 | [Android 多模块多组件开发 - 打造属于自己的路由](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486639&idx=1&sn=b1cb1b3df5427ffbfb8bc11461442c1d&chksm=97f6b21ba0813b0ded953f5eea1adcf8a2ec7c47a7b7a5e2e890aee6ff493cfbec9175e0d21d&scene=21#wechat_redirect) 126 | 127 | [热修复技术的实践之旅——微信TinkerPatch热修复结合Walle多渠道打包的详解](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487017&idx=1&sn=8abaad1612f871980c042f0fd214975d&chksm=97f6b09da081398b63c2dcd7642b858229ea7c82246af493041ff325c25beb01879bf24d6a0b&scene=21#wechat_redirect) 128 | 129 | [组件化框架简介](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487068&idx=1&sn=654638a50d00e08fc46988074fbea2e9&chksm=97f6b0e8a08139fe0d4b3d54ee1db64cf820e22f492e47c9c080fe7efd498e9273095050e1e4&scene=21#wechat_redirect) 130 | 131 | [浅谈 Activity,Fragment 模块化封装](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487096&idx=1&sn=28450ffbe412dbda4efe77ad2e71652d&chksm=97f6b0cca08139dab6072fa1ae9b3f705d33afa84add22e062e63dd6f5a591750db2d1db7932&scene=21#wechat_redirect) 132 | 133 | [自己动手做 android 路由框架](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487196&idx=1&sn=1011ecd14e08b902cddc80ec416af132&chksm=97f6b068a081397e9f654938d2f599eac95c9648a0c3854d4492d545f0968725151041cf62a6&scene=21#wechat_redirect) 134 | 135 | [Android 通用的组件自动注册、自动初始化解决方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487228&idx=1&sn=2885e7c42b76e3bfc75acadb6f8d2dc9&chksm=97f6b048a081395e94bac9d3d9c80ef2498d78fa685c6ce5d3097c1c8d4798ffddb496653058&scene=21#wechat_redirect) 136 | 137 | [自己动手写Android插件化框架](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487446&idx=1&sn=99dc74cb38900a1c16fbd89888c48fa8&chksm=97f6b162a0813874518f5567ed9f7066fda4656d90e79479eaa2624978f0abb6a8bce8875b15&scene=21#wechat_redirect) 138 | 139 | [最简单有效的低侵入性的 Android 组件化方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487525&idx=1&sn=ef3ddc7d1701b84058cc8d46eee26835&chksm=97f6ae91a0812787f5e1ab323420ecbb1504e14377417784a370b9635e499176d598533ee61c&scene=21#wechat_redirect) 140 | 141 | [该用路由来管理你的界面跳转了](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487759&idx=1&sn=05de7dbec6b3fe9bfcb4c171477b6587&chksm=97f6afbba08126adba137f7b9d17148e62188eeeda629392e66c4d92dcc2905e52701250541d&scene=21#wechat_redirect) 142 | 143 | [一篇文章搞懂 Android 模块化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487771&idx=1&sn=3e3d2be7f5f5e26e1d462034a9d09a73&chksm=97f6afafa08126b98b4c72fd9296554210c3cce00dc69d694fc0eab8eeafbe1340c7b83433ec&scene=21#wechat_redirect) 144 | 145 | 146 | 147 | ### 自定义 148 | 149 | [Android开发之漫漫长途番外篇——自定义View的各种姿势1](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486495&idx=1&sn=e77c49232bd6a8653952df594e1cf539&chksm=97f6b2aba0813bbde4fe3673d4fb37a7f1e273ca0caeaa12297c2f129f6f9687f97f8f166218&scene=21#wechat_redirect) 150 | 151 | [自定义View(七)-View的工作原理- Activity的布局加载](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486646&idx=1&sn=2e77044b0e3da80631c4d503245c9cd4&chksm=97f6b202a0813b14d6ae9561fdd78708b344c5ad63ceb63a016360e31162cb3ec1e12047a8d5&scene=21#wechat_redirect) 152 | 153 | [自定义View(八)-View的工作原理- View的measure](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486665&idx=1&sn=4a0465f0b1add06d7de37a8f701d2bad&chksm=97f6b27da0813b6b9655c59d043f1f4de3d6fd053a4b0fab193c40f759f5e8804123929b711d&scene=21#wechat_redirect) 154 | 155 | [自定义View(九)-View的工作原理- View的layout()和draw()](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486696&idx=1&sn=5bbedd8dc8972b0dda40201071939f36&chksm=97f6b25ca0813b4af68be91578fecfb99029601203095b31452fb27d05a28ee7f5670b064053&scene=21#wechat_redirect) 156 | 157 | [Android 自定义网格布局,九宫格布局加强版](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486962&idx=1&sn=6ffe1b04739011556cdcdfc2c79b2452&chksm=97f6b346a0813a503161c73c52ac87419c84b5a677356ba8bbc886364051b46590da231f744a&scene=21#wechat_redirect) 158 | 159 | [Android 自定义控件之角度传感器实现 3d 景深效果](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487226&idx=1&sn=b6d1857ef64250bbaf09e172df86679d&chksm=97f6b04ea08139582912dc5b8fd33ebe062884e1556aa0f07bb36488a6d4166f76659ff81ccc&scene=21#wechat_redirect) 160 | 161 | [Android开发之自定义相机、相册趟坑之旅](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487246&idx=1&sn=cdc38cfb7d22fbc035b96263a7202fba&chksm=97f6b1baa08138ac294c28a036308f68f3b02029273985f9e04b5152947420429edb38e83118&scene=21#wechat_redirect) 162 | 163 | 164 | 165 | ### Android 架构/开发框架 166 | 167 | [MVI 设计模式尝鲜(实现一个联网的天气查询Dome)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486456&idx=1&sn=fab25b3b85c8ad178d6c4b0d498206d5&chksm=97f6b54ca0813c5a0b2758836105b569c5ae86379c9019907240c283bb4014de8ab727817579&scene=21#wechat_redirect) 168 | 169 | [Android 架构组件 Room 介绍及使用](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486728&idx=1&sn=e9211eb04079ff6b666d54836b12c913&chksm=97f6b3bca0813aaa5f3bd192d6262af881f99c716c70ad478e3fd16cacc40ecbdebf5aec1435&scene=21#wechat_redirect) 170 | 171 | [从google todo-mvp示例再次学习MVP](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486726&idx=1&sn=432f248d4aa07e87d9d5ce0a82c02026&chksm=97f6b3b2a0813aa4433c432b9fdda5a4f74f1fff1b1a63ba9d5d62d2e8d757c9fb87d210cad5&scene=21#wechat_redirect) 172 | 173 | [优化你的代码结构 --- MVP](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486836&idx=1&sn=ef99d4483d9c3726ab568ebf1056046f&chksm=97f6b3c0a0813ad6422caa308cbb4494fbf7a0445424aea4f5dbd9296e6c19d960541f690326&scene=21#wechat_redirect) 174 | 175 | [软件架构:基础概念总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486895&idx=1&sn=41aeffae5db4ac461119785e5611ef65&chksm=97f6b31ba0813a0d1f576828cf59b6e4488967212405efbade50f3528c22ec44ae20bf9f5f90&scene=21#wechat_redirect) 176 | 177 | [通用的 Android 客户端架构设计](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486889&idx=1&sn=cdaa6d8bafb1760c00876eb2b6e15e92&chksm=97f6b31da0813a0b379ef814420b8bfccdc4ad6c1ae1c7ebd110120f7fdb1c51ae94694ea9f0&scene=21#wechat_redirect) 178 | 179 | [和编程在一起的第三年:总结Android开发用过的十大框架](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486905&idx=1&sn=814a022dc9aba668f18dc7cdf71b4d59&chksm=97f6b30da0813a1be6ef1289b5f4ca971f39fae64549f94b0f63eeab62a31861eed6d46bef35&scene=21#wechat_redirect) 180 | 181 | [基于 MVP 的原子性架构](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486897&idx=1&sn=fd3951347fe3a4910d6911cabf835c72&chksm=97f6b305a0813a137a63380c83bd765903de6aced4989a8284de55d6a1b8f459534aa6d53385&scene=21#wechat_redirect) 182 | 183 | [最简单但是又最灵活的 MVP 封装思路](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487185&idx=1&sn=3308c02d8bb33d8b38f475ef80d896fd&chksm=97f6b065a08139730f9fcfd9f79b414ad285c14ec38edcf4295a611686cbbbe1fbc859644150&scene=21#wechat_redirect) 184 | 185 | [剖析 Android 架构组件之 ViewModel](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487227&idx=1&sn=b38805ef59f9ecfeb5b72cbae2ed3df8&chksm=97f6b04fa081395970a81c480cf7c5dde3a02cc5cecb01da287189d59bd82dccd8de13418ffa&scene=21#wechat_redirect) 186 | 187 | [Android MVP 架构](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487333&idx=1&sn=c618db06fe1c39f5001c821c6bcc676e&chksm=97f6b1d1a08138c797109600513a60ef36246fb065b0eb6e17a3d168d029d300aa46fe95645a&scene=21#wechat_redirect) 188 | 189 | [搭建属于自己的Android MVP 框架](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487781&idx=1&sn=fd75a5efb19dd8a67ba1cf18b906d4a9&chksm=97f6af91a081268773365b0785e0c1d088cfb58809e1e1014d498d0047ea222a8405b1c2295c&scene=21#wechat_redirect) 190 | 191 | 192 | 193 | ### 源码解析 194 | 195 | [Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486486&idx=1&sn=7acc1c9dd8c600ad0ec2db7d32f82f1f&chksm=97f6b2a2a0813bb425cf8bf329bf0e856d3769ac8e21ed5a9a6cb7c57b1097c41f94afe4202d&scene=21#wechat_redirect) 196 | 197 | [Android 消息机制(Looper Handler MessageQueue Message)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486513&idx=1&sn=892a944854aff3edb9f0b9fb85bc01c6&chksm=97f6b285a0813b9363b814b5d974a39990e23db91440bc8958eb5cf8758afb45e37cef6759c5&scene=21#wechat_redirect) 198 | 199 | [Android 开发之漫漫长途 IX——彻底掌握 Binder](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486587&idx=1&sn=bbd08ab0168dc4947164af8274002886&chksm=97f6b2cfa0813bd9022c84de0ce2be3e128ed2a2141824c90474453dfc9ee5e2f5d3803ed391&scene=21#wechat_redirect) 200 | 201 | [Android 开发之漫漫长途 IX——彻底掌握 Binder](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486613&idx=1&sn=91cd6f7922cfde8ae08e423aab361394&chksm=97f6b221a0813b3728a4cc80d667ce995fc0bd2d64abc27b5a750b0f7a67c41418aaeafe22e1&scene=21#wechat_redirect)(第二篇) 202 | 203 | [Android 开发之漫漫长途 X——Android序列化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486647&idx=1&sn=0ec7b660d3f32e62e2881aff4a0d9c20&chksm=97f6b203a0813b15db85bedeff5dea3286c3becf0646185fafda60da520addfcfb19a6357fa6&scene=21#wechat_redirect) 204 | 205 | [Android开发之漫漫长途 XII——Fragment 详解](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486663&idx=1&sn=fc0c84a0a312d7dea06d879e263e50e3&chksm=97f6b273a0813b65fe53f62785c0c484aae34cc5a0eda6209af1c92007a36bde0070396919e4&scene=21#wechat_redirect) 206 | 207 | [Fragment 番外篇——TabLayout+ViewPager+Fragment](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486695&idx=1&sn=a350436b42fd29c1b466aa0b1ce70ca0&chksm=97f6b253a0813b453079528ef3440b2fd430c35ff06a7b65cf50b6a06583b16fad58c6b1ccd0&scene=21#wechat_redirect) 208 | 209 | [Android开发之漫漫长途 XIII——Fragment最佳实践](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486729&idx=1&sn=107fcc460b8fbee25094e089df74d60b&chksm=97f6b3bda0813aabbf5e5b9b52e264592c08af5d2715d7baa8df064ac0dd519a718d74724b2d&scene=21#wechat_redirect) 210 | 211 | [Android 开发之漫漫长途 XV——RecyclerView](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486837&idx=1&sn=d3734f8cbe114120e6b65b165b7bd93b&chksm=97f6b3c1a0813ad73880cf04f836caf13b0820f281df22532337378cfedb26651b4fa857e561&scene=21#wechat_redirect) 212 | 213 | [Android进程启动与Activity显示](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486964&idx=1&sn=2e1be34d465659bc7f7f99a01a20e77d&chksm=97f6b340a0813a56f36a6ed415732a3678f4a404e261a7bfa4b33d2bfc22566924b0607e04da&scene=21#wechat_redirect) 214 | 215 | [LiveData 源码分析之事件总线 LiveBus 实现](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487725&idx=1&sn=163df081088cfaf878816b41a78c9dfa&chksm=97f6ae59a081274fdb6fcdab98abefb7bda9ebbbc3355577c76383ee75353efc0b80d86422a7&scene=21#wechat_redirect) 216 | 217 | 218 | 219 | ### 瘦身、打包 220 | 221 | [Android 瘦身不反弹最佳实践](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486523&idx=1&sn=2129a8bdf824db0e587a04178067b578&chksm=97f6b28fa0813b990d687f21f0ea22bd3adf4920326bfe75541e2e4719bc540275b3b918b68c&scene=21#wechat_redirect) 222 | 223 | [Android性能优化之躺着就能APK瘦身](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487370&idx=1&sn=0f2a538198b9ad4701b8e54658e35ca6&chksm=97f6b13ea081382820aa6dc52ffb7d058ec25d1d34e363ec615aca3b9a5b525f13eb3301a65b&scene=21#wechat_redirect) 224 | 225 | [Walle——Android多渠道打包神器](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487651&idx=1&sn=5d2af74210b20689dc76952c306ab0e1&chksm=97f6ae17a08127016ab61e8e3d5264d29b058a36ba20419df2e2b574fed9f5ec92a46c73f6f7&scene=21#wechat_redirect) 226 | 227 | 228 | 229 | ### 技术教程 230 | 231 | [Android 一套完整的 Socket 解决方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486423&idx=1&sn=9fea0e36eeaa7cd9fde5b9ec14515644&chksm=97f6b563a0813c75e39f48dde7442fbdbf9d677c5dff845b4f9aaa8abc579aaace469c9e190f&scene=21#wechat_redirect) 232 | 233 | [简述JVM基础(八):线程安全和锁优化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486487&idx=1&sn=22c288993207a2399ec1cf13c173ff45&chksm=97f6b2a3a0813bb5c9502e06068629676a5ef3d13e8362584356983b7d6e6491958479931a66&scene=21#wechat_redirect) 234 | 235 | [Android线程篇(五):Java内存模型](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486664&idx=1&sn=49257dac463f86af2e0b3c819d333ab4&chksm=97f6b27ca0813b6a573a9c4dd1febd207b1f43cefb93da626f0e656dd57bf76288de9771e6ac&scene=21#wechat_redirect) 236 | 237 | [CompatWebView](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486491&idx=1&sn=24dcaffeabe62154a3f3e60fe44d9960&chksm=97f6b2afa0813bb91eb411119e90678f86369d78b296fad43523352a047d4cabbbaded175b27&scene=21#wechat_redirect) 238 | 239 | [使用 Charles 抓取 app 数据包](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486589&idx=1&sn=a74ead57439230c8b143366b739bd050&chksm=97f6b2c9a0813bdfbaf5bae2efca3f735773ff41f990472bc3e24e9f195042ecbe3138b6d6f2&scene=21#wechat_redirect) 240 | 241 | [Android 关于内存泄露,你必须了解的东西](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486611&idx=1&sn=93278395c7d5a7ab582ea1e10438b21d&chksm=97f6b227a0813b311876748d22a4e5896fe8d060f960d7e090d612b1d1c138a005a5bc34ff06&scene=21#wechat_redirect) 242 | 243 | [你真的懂 Java 的内存管理和引用类型吗?](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486596&idx=1&sn=fab08d97a1a12ddd973c7c9ab75f5bb9&chksm=97f6b230a0813b26b46ffb5a11b0a8a5bdfe737804c785b3c9b77576348fa2ae99f2f2cdbdbc&scene=21#wechat_redirect) 244 | 245 | [Android 用原生分享多张图片适配 7.0、8.0](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486625&idx=1&sn=b2ca0b3cfc4dd4100241735ca30e1334&chksm=97f6b215a0813b03cad1633397c31d904c77a7d437916aec46f327c613921cf1d6a5fdcf8e8e&scene=21#wechat_redirect) 246 | 247 | [打造一个通用的 RecyclerView Adapter](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486638&idx=1&sn=dd516259deee4dccc3b679b1aaf7ecf6&chksm=97f6b21aa0813b0c8f6d9183ed83a4a128347dd1ac51c17dd5d801302341438058b3d3c14bc7&scene=21#wechat_redirect) 248 | 249 | [Travis CI 邂逅 GitHub、Maven、Fir.im](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486666&idx=1&sn=2234895f2328ff8d57848829def31340&chksm=97f6b27ea0813b687cd08d890ba5ffd81609bfd5793a845968ce2ab071fe5e86960c6e67a76e&scene=21#wechat_redirect) 250 | 251 | [Android SDK开发与使用的那些事儿](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486727&idx=1&sn=3225c8b4eb215273902cbf90370a81bf&chksm=97f6b3b3a0813aa51ee906dabce8d468abd49ad7fec68d611fbac0f17860cdba4d90b3d2fab3&scene=21#wechat_redirect) 252 | 253 | [Gson 解析服务端返回的多种类型的 JSON](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486762&idx=1&sn=35f2a4d53dc36470994c8b24ca1474f6&chksm=97f6b39ea0813a88e4cf0b9b39cad5ef34ff2cdf82a879f2f57b8ec3ece0522eb524dbf32d31&scene=21#wechat_redirect) 254 | 255 | [Android O 适配 Notification Channel](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486761&idx=1&sn=6249dae99df8076d485837260a43bbff&chksm=97f6b39da0813a8bdf53043af9d792a4424449bf3ceb2b21aafecc87c1758a298ed7c27e08a0&scene=21#wechat_redirect) 256 | 257 | [Android 系统各个版本上https的抓包](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486834&idx=1&sn=91850a5d1ac13953fcb869bf1f232aab&chksm=97f6b3c6a0813ad0bd3df0b09ff0cdbcbd8c85021592febed13f5f265b97cd3a8bbb32e5ca55&scene=21#wechat_redirect) 258 | 259 | [Android-指纹解锁技术](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486833&idx=1&sn=655be3977ebb9176207cfac1c3de8d3b&chksm=97f6b3c5a0813ad331775332c30fa83d2d529a96295f265653a2013e3bf24841227c76d6dad5&scene=21#wechat_redirect) 260 | 261 | [App 版本更新接口的设计](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486874&idx=1&sn=359a9f2380ba430774a1b3805945061d&chksm=97f6b32ea0813a38e0438d7688fa74a3697c5aea2c2af3b7db6e3e9a0eeb41a59431212b3e78&scene=21#wechat_redirect) 262 | 263 | [Android Studio 查看Android内部隐藏源码](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486894&idx=1&sn=795f300c4da1e1fe00dfdc6494fa99ec&chksm=97f6b31aa0813a0ce02d6bd54d81d0b8eb80a27f8eca47a5fe19dbd5ae2eef2f0254b49bb9e3&scene=21#wechat_redirect) 264 | 265 | [Apk根据不同渠道更换SDK](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486912&idx=1&sn=1b18ce2a1aef5b1afe7b2b0c9c2ef6fd&chksm=97f6b374a0813a628a68f2daad52dfc8a29c5f6c32a9b1bd1b52e12f58c322132411d0046000&scene=21#wechat_redirect) 266 | 267 | [Android 串口通信:抱歉,学会它真的可以为所欲为](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486901&idx=1&sn=9c0b4f205041e88269eab74115596e36&chksm=97f6b301a0813a17da6399f917138c0ee98b39f51fb1ec18f2f4e3d7da44b50aa6e695eed80d&scene=21#wechat_redirect) 268 | 269 | [Android 根据配置数据动态设置应用内的icon](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486944&idx=1&sn=6908694b78c4e7f8942429ae718a7727&chksm=97f6b354a0813a42ef3cdd26dda390546c10245730def68f2fa77ccf49e0c7d65125148ebd35&scene=21#wechat_redirect) 270 | 271 | [Android APP打开另一个APP完整逻辑实现](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486943&idx=1&sn=bd3e717566de2d81c9f0690162cd002b&chksm=97f6b36ba0813a7d1fde83fb2734f4c8e8fb248c037c2118eb18a2f7a3a85715e2cb167e9aad&scene=21#wechat_redirect) 272 | 273 | [Android4.4运行过程中闪退java.lang.NoClassDefFoundError](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486913&idx=1&sn=2bc800db34c3f942aa201b052ffc3ce7&chksm=97f6b375a0813a63f372fdbca97d4fb276f15c778af5435adff67c715fa92ada7f3232c73630&scene=21#wechat_redirect) 274 | 275 | [监听WebView页面上所有的图片](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486961&idx=1&sn=c69d6323c53594a118aaf76fd043620d&chksm=97f6b345a0813a53c85931436f12291d12d9c7faf457c87a8546c625d05f484a9bc60f3d5b94&scene=21#wechat_redirect) 276 | 277 | [Room 使用之如何为字段设置非空约束](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486960&idx=1&sn=a3b7eefae88f63397fecc9c8d9870663&chksm=97f6b344a0813a52e9d4747fc1f91f236108934484ff6949ee55513d90b1492491132c7092fd&scene=21#wechat_redirect) 278 | 279 | [Android 异步生成图片](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486963&idx=1&sn=c19841319523bc4e6e73c6166c807493&chksm=97f6b347a0813a51ede853688502a86f9d5a35e80ea7122322d142b6fb31c63ba573972179e1&scene=21#wechat_redirect) 280 | 281 | [Android 从ViewPager嵌套的滑动问题引发的分析](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487016&idx=1&sn=6668a25d3c4ef67f450c93d14e6a3e5b&chksm=97f6b09ca081398ae0dccbb67bca696233795b14101496caa976b455a25a79dea5be001534cf&scene=21#wechat_redirect) 282 | 283 | [浅析Android平台图像压缩方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487015&idx=1&sn=30ddd9010f300107af103dc5cd347d2b&chksm=97f6b093a08139854f2dee273b6e3625841da323a6436b8bc9421496fd2383bb5abcfc259a00&scene=21#wechat_redirect) 284 | 285 | [那些好玩的 android 小事](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487040&idx=1&sn=f75f8ad14a1a6b4c221e1af121a890e9&chksm=97f6b0f4a08139e240dbec2ecf5621eabfabfc0f9e55f615f384bcc3359c1fc10a3a13ee0e84&scene=21#wechat_redirect) 286 | 287 | [Android Jetpack - 使用 Navigation 管理页面跳转](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487032&idx=1&sn=184d4614c4a3d5f8ccc25de536ba283a&chksm=97f6b08ca081399af48248ecf6dc81a15558e6eb8fa48de95da154c23d17ca1e28d878ac5611&scene=21#wechat_redirect) 288 | 289 | [善用 Android Studio 的异动管理功能](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487066&idx=1&sn=82c6669b33b9c1afee8c12037e96a2fe&chksm=97f6b0eea08139f866df347644c2ccceb3434f26ce86e3b95592caeb436d921f3ce13277c6c8&scene=21#wechat_redirect) 290 | 291 | [RK-Android-Usb无法读取以及原理分析](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487065&idx=1&sn=dc221f2f048ae0d92f58b5ced52cdf58&chksm=97f6b0eda08139fb20ace7298e22e33da3f48b126d82332611187d982cb490ccc59163d885eb&scene=21#wechat_redirect) 292 | 293 | [浅谈Android中的meta-data及其应用](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487099&idx=1&sn=1d13f7a8fa4d86769ee3212a2b0fcc0a&chksm=97f6b0cfa08139d9e916303c65b8129f0e019e5bd25f310bb3e36cab955d661661d67fabbec3&scene=21#wechat_redirect) 294 | 295 | [Android install apk 兼容至 Android 8](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487098&idx=1&sn=301a042eb7d552c6401a40fd43675873&chksm=97f6b0cea08139d81be613f2148ab516be444f82239100f27b9305ba5f7f8a79999a73fe79c0&scene=21#wechat_redirect) 296 | 297 | [就算开发Android APP也得懂一点API接口开发](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487097&idx=1&sn=e6f24709e5a4bd9cdc6d20626be5b4d2&chksm=97f6b0cda08139dbdad63922ab3cfb14a0f460c3636868c86b851da175aad177fc541998b470&scene=21#wechat_redirect) 298 | 299 | [Android开发需要了解的网络编程基础](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487089&idx=1&sn=b65ae055fda8929a1326c5fb5938fd92&chksm=97f6b0c5a08139d3dedbb2448defbb8803d09a52aa0ae57377df7d21997de4aba66ad6e2461a&scene=21#wechat_redirect) 300 | 301 | [Android 多进程通信之几个基本问题](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487133&idx=1&sn=ce55020d11d3952df11dd0948fdaaa2f&chksm=97f6b029a081393fbd4eab568c18ef0452b6dc143daa2126fd1fef96fc5ebcf2327a1fd892e2&scene=21#wechat_redirect) 302 | 303 | [Android:FlexboxLayout你值得拥有的流布局助力](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487124&idx=1&sn=65dd016c864035a80c0063b7f95fd4bd&chksm=97f6b020a0813936d76ee81673fd47c1aa30b5d4d23f67dcdbc1aefb40bca80b044946e1e80f&scene=21#wechat_redirect) 304 | 305 | [Android Jetpack - 使用 WorkManager 管理后台任务](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487123&idx=1&sn=6ea7c38b545c5240343c188e2f3de71c&chksm=97f6b027a081393104e4950499bbfd58fdbd20a9a9bca19974031800d286a7bf1588a00c2cc9&scene=21#wechat_redirect) 306 | 307 | [ItemDecoration 的一些使用小技巧](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487115&idx=1&sn=562083cee4cdabab4edcdee1aeeede57&chksm=97f6b03fa08139295a732661a4b8757d62f313cca39a9a44a8e038682416622b4e296d5afbe3&scene=21#wechat_redirect) 308 | 309 | [Android绘制优化内容总结避免过度绘制](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487143&idx=1&sn=f516abc67fd0d8efed93258f2ea831a0&chksm=97f6b013a0813905349f164a3f1797f36f8e206eefa99eb1759ba6614325e98e8c5e20e24043&scene=21#wechat_redirect) 310 | 311 | [实践App内存优化:如何有序地做内存分析与优化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487139&idx=1&sn=c045e08eb1d450e907b47d990da2bff1&chksm=97f6b017a081390144676541b8b68ae4e4f80804a8a42b093be324c25fdd3617eaa335a2c119&scene=21#wechat_redirect) 312 | 313 | [AndroidStudio封装SDK的那些事](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487136&idx=1&sn=f808ef33c5ee5b8001897536e3d6fb70&chksm=97f6b014a08139023f1c9804571e7e75587f1a6f2f79e25033bff1b61389f8697936123ba3fc&scene=21#wechat_redirect) 314 | 315 | [Android多屏幕适配之字体大小、行间距和字间距](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487173&idx=1&sn=bfe00aeafa1c113cc559478f79ddcac2&chksm=97f6b071a081396714852213206a8f01787612dce8e989080a5ee27e8a43395e4e9959b9e9df&scene=21#wechat_redirect) 316 | 317 | [Android 刘海屏适配总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487172&idx=1&sn=3360a6c26d2ab3790a6093a191fba97f&chksm=97f6b070a08139668d04fd238453e518e1ee89cb3b79db8bacbf54653b444fac3b0133a1b53a&scene=21#wechat_redirect) 318 | 319 | [安卓嵌套滚动NestedScroll了解一下](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487145&idx=1&sn=0193fdd9cca0d7c8057ad5697ada731b&chksm=97f6b01da081390bb5a1da5225ae57c6460c959cc83f4fde8af77c2e92c1d8aae8dcc4c0481d&scene=21#wechat_redirect) 320 | 321 | [Android三方应用实现静默安装](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487176&idx=1&sn=e606e30eac399b209593eeebc7c9047d&chksm=97f6b07ca081396a1f4659db17a88e9d4ef0605d5eb96afe42373a0cffac7b2d5c4534ca8f07&scene=21#wechat_redirect) 322 | 323 | [Andriod Studio两种签名机制V1和V2的区别](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487175&idx=1&sn=8e8836dc64235ed5ddd8ed1270e863dd&chksm=97f6b073a081396584a75ecb3b2c8a9ddf82782cd1e31cfdf106c08605dbd07cb4dbe09dba2a&scene=21#wechat_redirect) 324 | 325 | [Android自定义权限使用总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487197&idx=1&sn=1abf3bff6481d6b25511fc7043a13bc3&chksm=97f6b069a081397fd5f739b3a8ce8a5b245ee02f1b5899b556d9467720870768828f6f095082&scene=21#wechat_redirect) 326 | 327 | [优雅地管理Android应用的初始化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487213&idx=1&sn=208c535b129b65502fcbb927d197093b&chksm=97f6b059a081394fbfa709f8191a607390e799eaaf7f2ea21fc74078fd3c01897a5c57984b26&scene=21#wechat_redirect) 328 | 329 | [项目所须:加载大图片 图片压缩](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487204&idx=1&sn=93093eb7b41cb7edc0f6ce98035a0eb7&chksm=97f6b050a0813946901b6fdc51ccc3a6be62aa82bed9f24386ae04937f9cc5d3e1e012258183&scene=21#wechat_redirect) 330 | 331 | [『进阶之路』—— 线程池](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487232&idx=1&sn=cc345290dcadfb49488444380496d6ed&chksm=97f6b1b4a08138a2b96eb71bfecdbebac80f8229ac07d63082117a7493c9ae26c46dae2c3a5f&scene=21#wechat_redirect) 332 | 333 | [Android 序列化总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487281&idx=1&sn=971778e9ef4cd926f966061640079c69&chksm=97f6b185a08138933fcd30d2c10cad7825d7f51224a5f7b5f7d946ff091a1f88732d7acc7b34&scene=21#wechat_redirect) 334 | 335 | [Android 上关于设备唯一标识的调研](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487280&idx=1&sn=e145d4cde6286ea31d24f7f86941a0ea&chksm=97f6b184a0813892a0e42ec25372be38baac31649c058279fe15512c6bb342fa691efb322026&scene=21#wechat_redirect) 336 | 337 | [Android 如何从应用深入到Framework (一)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487251&idx=1&sn=0da6da823a03e15c8af4e0533a0430f3&chksm=97f6b1a7a08138b169b8a7efa1a16eaac6f8ebe5c0d200f7adbd7947a77f2dd23891dc13aede&scene=21#wechat_redirect) 338 | 339 | [Android 如何从应用深入到 Framework (二)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487284&idx=1&sn=292f7896dd84430c976f8dad4e95d415&chksm=97f6b180a081389615252e3c6ae9738d7af42f921714621a5f7536d64ab577419fc22138786e&scene=21#wechat_redirect) 340 | 341 | [Android 全面屏启动页适配的一些坑](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487248&idx=1&sn=530e0f8c437c520808e0e99f1ba5d0be&chksm=97f6b1a4a08138b2d1573a0c58f1483df0f23bb3b801055f9ba603265455b41ff03bc9a19562&scene=21#wechat_redirect) 342 | 343 | [Android 去掉系统默认提示音、移除音量调节的进度条、增加音量调节提示音](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487247&idx=1&sn=35385e9efd9d4e974150030187b94380&chksm=97f6b1bba08138ad74eeaddca9223d958675e1bc4b53b9699adf4f5ee3473c5a9dc5d5186d72&scene=21#wechat_redirect) 344 | 345 | [Android-Apng动画的播放](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487310&idx=1&sn=421d78956e19df0bbf43cb4bf348e341&chksm=97f6b1faa08138ec3fcb9fb1f371995da25e2785fdec8e819be7a28f255c69bab7d28f1daa8a&scene=21#wechat_redirect) 346 | 347 | [Android 国家化的坑 - ;小数点变成逗号](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487311&idx=1&sn=30a14e259313402ad76172e1955be5b0&chksm=97f6b1fba08138edd6aa3f1a2aa980d383abca1322e07d90da4c4b5e555aa5662a536e4b39de&scene=21#wechat_redirect) 348 | 349 | [Android :如何防止被抓包工具抓包](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487312&idx=1&sn=75aa6ed4a75bf4bae790bb783b548b18&chksm=97f6b1e4a08138f260a949aa8675d726b5af46eecc8c6989b6838a658a61aa081fa5e9719dbd&scene=21#wechat_redirect) 350 | 351 | [优雅地处理加载中(loading),重试(retry)和无数据(empty)等](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487313&idx=1&sn=2dc3e0e5ec308d9051b6566c10b0e47e&chksm=97f6b1e5a08138f32a0ff61315722ef72ae57437a05158bb20ff65274c60e55672869c434c18&scene=21#wechat_redirect) 352 | 353 | [Android通用UI封装----“我的”页面Item](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487325&idx=1&sn=6e97e2f3e68a8d1c1521f564dc587819&chksm=97f6b1e9a08138ff09a7a1b2a5ad5b487e9e7eb537ae691df4361421d58f6ea6dce72fbb46dd&scene=21#wechat_redirect) 354 | 355 | [Android 冷启动秒开实现](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487351&idx=1&sn=c767b83bd3d9b2df8af7d1e3ebf9387c&chksm=97f6b1c3a08138d58af7c0cd2739edb3ee79edfd2f6ce15e473001eae399ed3e9e55582f22c0&scene=21#wechat_redirect) 356 | 357 | [Android 学习之阴影效果](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487349&idx=1&sn=cfec94e724342f5d748c7eae986fe0d3&chksm=97f6b1c1a08138d712c3331639520db446d813f450a082da30daf1a7d1a0cc974d1b1c0e4db7&scene=21#wechat_redirect) 358 | 359 | [将 cglib 动态代理思想带入 Android 开发](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487334&idx=1&sn=3dbbdd8e89c135f76b0434ddc22c7460&chksm=97f6b1d2a08138c4b8f03ec7c30b8902851db7c3d9de400caedca1fd1ad4362f87a027a3879a&scene=21#wechat_redirect) 360 | 361 | [一键切换应用环境工具(EnvironmentSwitcher)了解一下?](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487369&idx=1&sn=63d2dc4d5c16950f5793794802e98150&chksm=97f6b13da081382b62c6fdbca8d18a0ebdc3e422dc4a7cc7b985eabffe0efec4b6f17698730e&scene=21#wechat_redirect) 362 | 363 | [Android基础 - 如何做鲁棒性更高的布局](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487368&idx=1&sn=d4ed65a190a577ae751d4ad48107d9aa&chksm=97f6b13ca081382a8deabe5f4c2616a5725db83951d5a4e9d93aafb0c0f43ebb782d0234fd2e&scene=21#wechat_redirect) 364 | 365 | [webview内存泄漏终极解决方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487367&idx=1&sn=225a45e90f4b77d1c8d6c780b076b87a&chksm=97f6b133a0813825d06e1e149615ea847813acdbbe8b362d84e5f6178465dd38f2c72a9f31e7&scene=21#wechat_redirect) 366 | 367 | [Lottie for Android 实战使用总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487352&idx=1&sn=ed2ddbe9c0c321aa2decb8b8233319e5&chksm=97f6b1cca08138dadd5571f5630cdd69f4cca21ef13312824dc6cbeafc5a04ab9af1045b8abb&scene=21#wechat_redirect) 368 | 369 | [安卓软件逆向工程基础概念](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487414&idx=1&sn=cce18c78c28a935ecb3618b54748b3a0&chksm=97f6b102a08138144fd9c02288b12faaa22595c461d357b37ca3b34960e0ed3ae1ef70ec5346&scene=21#wechat_redirect) 370 | 371 | [Android 可视化埋点方案](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487413&idx=1&sn=7eb3faaa1de81500dab6cc5b08db04b6&chksm=97f6b101a0813817e7c463b7702b5787ec8eff9d1498fbdbc3c1778fd27848e78d29046fe2d4&scene=21#wechat_redirect) 372 | 373 | [Android开发之漫漫长途 XVII—动画](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487412&idx=1&sn=866fbbeb65ab5bfc937123c6eaf4d9f7&chksm=97f6b100a0813816be7838303277d94a9cf915d8f2ceea3e4c0c69d7c86995bce45858145218&scene=21#wechat_redirect) 374 | 375 | [Android开发之漫漫长途 XVII—动画(续)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487443&idx=1&sn=c7c8934074e32fd75b4c27f7de504bfc&chksm=97f6b167a08138711abf3f6993382f9e09ed55e7af51645e6f004eddbbbc78358c914c252ec1&scene=21#wechat_redirect) 376 | 377 | [Android开发之漫漫长途 XIX—HTTP](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487486&idx=1&sn=726cf74bd1ff0f2620018de2e7788ad3&chksm=97f6b14aa081385c8cea2fba32ac655fbca2734837f1dcc2d09897edd1859020b9970c2d9f90&scene=21#wechat_redirect) 378 | 379 | [Android界面渲染优化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487445&idx=1&sn=653780979910a7c18937ac1272ef388c&chksm=97f6b161a081387722beca335d6cc5468071e3fed5a71bf80a8c049d63e11b0401262590844a&scene=21#wechat_redirect) 380 | 381 | [ANR 原理与实战技巧](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487496&idx=1&sn=81a46c2f67d4affef882058307a78112&chksm=97f6aebca08127aaa6025a4b31fa8ed450165d655b6a34bd59d34784b69d186516766c83f002&scene=21#wechat_redirect) 382 | 383 | [Android开发 - 获取系统输入法高度的正确姿势](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487501&idx=1&sn=b9c52ed913efdc6cfe3e4c8cff52e184&chksm=97f6aeb9a08127afc55446d269ef9777e6754438f25f1d45e4dcb8f0254aa02cc05e058aba36&scene=21#wechat_redirect) 384 | 385 | [通过JavaScript实现在Android WebView中点击查看图片,长按识别二维码](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487500&idx=1&sn=6472bd542bff93a65e75006fc107facf&chksm=97f6aeb8a08127ae76e01ec41963afda7ed9e6fa5e6b6b197774c9cc2e69735725cd7f59910d&scene=21#wechat_redirect) 386 | 387 | [项目埋点的演进](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487498&idx=1&sn=9d4dea133200ded018d86bb432402089&chksm=97f6aebea08127a80a7fd88bb44a6a8e9eeda3cd8563080e2c4f7ebd86f6b5d64923cf362535&scene=21#wechat_redirect) 388 | 389 | [Android 迁移到 Androidx](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487524&idx=1&sn=01295019833ee6965b90ac5019a1dac0&chksm=97f6ae90a08127867c2392294efee9bc400efde9a58d3119fc78ce0f516826f4754c53b87e4c&scene=21#wechat_redirect) 390 | 391 | [从另一个思路来学习安卓事件分发机制](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487601&idx=1&sn=b206e57f1383af4aac2891a267969471&chksm=97f6aec5a08127d37b98fddc142998e6d5a7c6fdfda8507617bb5a8a7bada75228130bfdcbf8&scene=21#wechat_redirect) 392 | 393 | [Android-图片的压缩(质量压缩和尺寸压缩)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487592&idx=1&sn=1f24406ce35ea38ad670b737362934e1&chksm=97f6aedca08127cac1706ee3bbbac95870fca650000cbdebbf0fc2427988ade9d46cd2c9cde1&scene=21#wechat_redirect) 394 | 395 | [Android开发之图像处理那点事——滤镜](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487644&idx=1&sn=5157cb6e584208b6f9e59bc7819940b3&chksm=97f6ae28a081273ed55086b52534aaa04196602f6bcd46e201afb8093e1ba240ac1dfdccefa0&scene=21#wechat_redirect) 396 | 397 | [AndroidStudio 性能优化指南(Windows 篇)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487603&idx=1&sn=94d3b55e8c12819fe401fef7fb9510ad&chksm=97f6aec7a08127d146b91f40f0b58c45f9cf19353f7df09e515023497392c01026bd4630f32e&scene=21#wechat_redirect) 398 | 399 | [如何统计Android App启动时间](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487602&idx=1&sn=d5ccc67e06acdcfb964b7e7ef443465a&chksm=97f6aec6a08127d05fe1ee37585b7477aca3dfdaae09497d63c0e03509e5ecec42ac121e98ab&scene=21#wechat_redirect) 400 | 401 | [Android CameraView 实用经验分享](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487653&idx=1&sn=214ec80233f80d477d83475b9813977e&chksm=97f6ae11a0812707695e0c800e353aad8eb5300d994a97242ae54a483b39e9312887ec062ebd&scene=21#wechat_redirect) 402 | 403 | [Android Application优化解耦](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487652&idx=1&sn=18bbe1db969b1758e4133cd531fd4393&chksm=97f6ae10a0812706bafea24800150c6451b01367ece36ddf7b5a3128be57eec5a88a97ebff28&scene=21#wechat_redirect) 404 | 405 | [Android 设备唯一标识(多种实现方案)](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487727&idx=1&sn=2ce549547f6191e77a47c4a2ca8224f9&chksm=97f6ae5ba081274d9610a53632a997a49b5ea374dff6e99db73110aa4ead2a6e35ff120c7a2a&scene=21#wechat_redirect) 406 | 407 | [使用 TraceView 找到卡顿的元凶以及 StrictMode 优化代码逻辑](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487769&idx=1&sn=06c686f194e77cdbc75f90a26f18cc0e&chksm=97f6afada08126bb60db4a42e70101ac71cbb2e4945243d1def0e2e68c3db5bf537f2a3f6cf9&scene=21#wechat_redirect) 408 | 409 | [Android:手把手教你如何优雅的实现APP启动速度优化](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487758&idx=1&sn=cea26794ac87b4d63a58dd3c8bd18353&chksm=97f6afbaa08126ac2203ab2d77e99c6f416a8eb74d9b6264bac184b6f5a5d73d8eaa57ecfe49&scene=21#wechat_redirect) 410 | 411 | [钉钉自动拍照打卡 App 的实现](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487783&idx=1&sn=f4e4d4876e0f38e2a8471d50c56bf3d3&chksm=97f6af93a0812685e9970b4dbc3d409cd58382470bb219641ab7c0af518e76fcbae9068f7cbc&scene=21#wechat_redirect) 412 | 413 | [安卓开发小总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487782&idx=1&sn=76484b0873e7aab42df203c37887097e&chksm=97f6af92a08126840b8dc4d920eb62bfa5a165627b7b6077f7506ad1282b777d7d6ff491a0ce&scene=21#wechat_redirect) 414 | 415 | [Android今日头条UI适配完善版](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487772&idx=1&sn=2eb3e43b7568a9f85e50ccbc98c7d3c3&chksm=97f6afa8a08126be50373fcadd8af9dbed939d272f2a2fc6df71d5092a1a051940f03062430d&scene=21#wechat_redirect) 416 | 417 | [Android内存管理机制](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487785&idx=1&sn=494c8227a4807cda1a7ea8af17420e98&chksm=97f6af9da081268b32e6e1a3115a80f2d742d4f81ed048709d6c5cc00985e0ae2f8d4d414b0b&scene=21#wechat_redirect) 418 | 419 | 420 | 421 | ### 其他技术 422 | 423 | [理想的程序员](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486475&idx=1&sn=ac78a62e68ad869aedbcd4ebccf506f6&chksm=97f6b2bfa0813ba96b9404009b914b83d190d4fa47028d0ab8e4a8f97298356660bcd106531a&scene=21#wechat_redirect) 424 | 425 | [记一次逆向 Android 的经历](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486789&idx=1&sn=e030cb5f9d63cbc49618608fd6b5a668&chksm=97f6b3f1a0813ae78fb42730754315b4661563daa980f2e46d162537c1fd4113c4165beb312a&scene=21#wechat_redirect) 426 | 427 | [工作了 5 年,发现很多的坚持都是错的](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486557&idx=1&sn=a1118539c17234b6659fb0ae95ac41f6&chksm=97f6b2e9a0813bff8144847edce7997fb4ae22571aeeb137cbfaa2de21465a9453ec87cbac16&scene=21#wechat_redirect) 428 | 429 | [腾讯开源:微信和移动开发的 10 大项目](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486745&idx=1&sn=30b3b1cefcfd67c0c42df1d61692f0d3&chksm=97f6b3ada0813abb38fafdd194448393a98433886361aafefcc2422168444a57825d1acb55c2&scene=21#wechat_redirect) 430 | 431 | [《自然》杂志:中国人越来越沉迷于对着一个叫“区块链”的东西胡言乱语](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486788&idx=1&sn=9c58638a2e1d340a44595b01bc153b3c&chksm=97f6b3f0a0813ae6720ba0a985133df31753baa01567340bccb667c8852a675673970c4ad593&scene=21#wechat_redirect) 432 | 433 | [祖传代码的重构体验](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486880&idx=1&sn=1ca4ef55f7f11034b57c2ee4053e8ca0&chksm=97f6b314a0813a0268a5b83f1becff05fcc9c534609bcac38aac341e01acfa7c9ba24f31394d&scene=21#wechat_redirect) 434 | 435 | [作为一名半路出家的程序员,要学的还很多](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247486986&idx=1&sn=f84f65c7cf535c97463bc45c29fb74b7&chksm=97f6b0bea08139a8f298b454f57ef1a8a3138554844e815c56ff259dfa72ea8be2f557c51d01&scene=21#wechat_redirect) 436 | 437 | [一位Android程序员的年中反思](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487177&idx=1&sn=15071471a3ce6c647598fd95c5a6beaf&chksm=97f6b07da081396be4c73e23a0aef81e2b0313835fc56111212f0e52c3d3fa58231f9012e237&scene=21#wechat_redirect) 438 | 439 | [项目模块重构分享与思考](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487245&idx=1&sn=ed1635ba138bea7d5930ea36db87dd7e&chksm=97f6b1b9a08138afb5a6ef2a8af9f5616a69de17e13c5203da76f463ef31e05faf5c89d27ed9&scene=21#wechat_redirect) 440 | 441 | [代码重构的场景总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487497&idx=1&sn=d0a6c6957ccf7b29d896fcb575acd0ed&chksm=97f6aebda08127abb8c84f31f1518352dbd5d96e2ef9dd25aba242c86999cda3e7e7731375d3&scene=21#wechat_redirect) 442 | 443 | [我的毕业一年总结](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487442&idx=1&sn=7a5c8297bcc31b2a49aab2c73dca04c5&chksm=97f6b166a0813870a47ba26a5d619415bb5a37a194eda1c89ea10661cddaba68d3058989bec8&scene=21#wechat_redirect) 444 | 445 | [30条编程名言佳句: 这不是Bug只是未知的特性](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487420&idx=1&sn=8c8e9aad327af49192866dedec401474&chksm=97f6b108a081381e2907159ef344192547600a7d0241d2e95b60bc8bdb48087f827534546974&scene=21#wechat_redirect) 446 | 447 | [如何衡量一个 Android 应用开发人员的能力?](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487699&idx=1&sn=d3869789c7cd2377d1aab2c48368bcab&chksm=97f6ae67a0812771c1a28d87fd43dd483e4ae3e4d009456c64b83a527ffaceda9fe776d934f4&scene=21#wechat_redirect) 448 | 449 | [我们始终不能只靠技术来生活](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487768&idx=1&sn=f4bfac98790ce1252cfc8cc531079bc3&chksm=97f6afaca08126ba0f83d69bf7249216f3ba44d9d27c896ee1461d2d773a313520d94ccc11ce&scene=21#wechat_redirect) 450 | 451 | [对 Kotlin 与 Java 编程语言的思考](http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ==&mid=2247487729&idx=1&sn=98c220302f1c186a48e3794296ee12cc&chksm=97f6ae45a0812753f9e2b39beec359d0238a1c9a15d705580bbcfc8a76be12a7d5e4c997e743&scene=21#wechat_redirect) 452 | 453 | 454 | 455 | > Android 开发者技术平台,欢迎将你的技术文章分享给大家,2019 我们一起进步! 456 | 457 |  458 | --------------------------------------------------------------------------------