zm.blog

select * from learn


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 搜索

android编译implement、api和compile区别

发表于 2018-09-19 | 分类于 Android , Android Tips | | 阅读次数:

2017 年google 后,Android studio版本更新至3.0,更新中,连带着com.android.tools.build:gradle 工具也升级到了3.0.0,在3.0.0中使用了最新的Gralde 4.0 里程碑版本作为gradle的编译版本,该版本gradle编译速度有所加速,更加欣喜的是,完全支持Java8。
当然,对于Kotlin的支持,在这个版本也有所体现,Kotlin插件默认是安装的。

我们来看看新建一个项目在Moudle中的 dependencies 中的变化。

1
2
3
4
5
6
7
8
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

下面我们来看看他们之前的差异:

阅读全文 »

Android快速开发框架推荐10个框架

发表于 2018-09-17 | 分类于 Android , 框架 | | 阅读次数:

一、 Afinal

官方介绍:

Afinal是一个Android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity,我们可以通过注解的方式进行绑定ui和事件。通过finalBitmap,我们可以方便的加载bitmap图片,而无需考虑oom等问题。通过finalDB模块,我们一行代码就可以对android的sqlite数据库进行增删改查。通过FinalHttp模块,我们可以以ajax形式请求http数据。详情请通过以下网址查看。

Afinal 是一个android的sqlite orm 和 ioc 框架。同时封装了android中的http框架,使其更加简单易用;

使用finalBitmap,无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题。

Afinal的宗旨是简洁,快速。约定大于配置的方式。尽量一行代码完成所有事情。

项目地址:https://github.com/yangfuhai/afinal

阅读全文 »

Android 项目最新架构

发表于 2018-09-17 | 分类于 Android , 设计架构 | | 阅读次数:

前言

为了帮助开发着打造一款优秀的APP,Google可谓费尽心力,推出了各种诸如MVP,MVVM等等项目架构的思路,帮助开发者更加高效的开发,尽管这样,Google还是接着推出了一个新的项目架构,以便给予开发者更多的选择,至于这种架构思路和MVP等框架的优劣,各位看完文章或许自有定论。

1.生命周期

在移动操作系统上开发软件其实是十分复杂的一件事情,因为我们随时需要面对系统和用户的各种不可预料的操作,很多时候,事情并不向着我们预设的方向方向进展。因此系统向我们提供了核心组件的生命周期这种东西,告知我们的APP正处在什么样的状况中,以便于我们做出相应的处理。

阅读全文 »

Android - Glide4.x的使用

发表于 2018-09-14 | 分类于 Android , Glide | | 阅读次数:

最近从Glidev3升级到了Glide4.x,我用的是最新的Glide4.1.1哈,由于3.x到4.x的变化还是很大的,在此记录一下,也和需要的朋友分享一下。

Glide官方学习地址

使用

1、在app的build.gradle中添加如下配置

1
2
3
4
5
dependencies {
//Glide框架引入
compile 'com.github.bumptech.glide:glide:4.1.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'
}
阅读全文 »

Android - 图片处理之Glide4.0版本

发表于 2018-09-14 | 分类于 Android , Glide | | 阅读次数:

前言

一般项目我都会使用Glide作为我的图片加载框架,他和Picasso ,真的很像,郭大神早就分析过了,很详细,这里也就简单做个记录。小白白一枚,学习路上

Android图片加载框架最全解析(一),Glide的基本用法

Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

Android图片加载框架最全解析(三),深入探究Glide的缓存机制

Android图片加载框架最全解析(四),玩转Glide的回调与监听

Android图片加载框架最全解析(五),Glide强大的图片变换功能

Android图片加载框架最全解析(六),探究Glide的自定义模块功能

Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能

Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

阅读全文 »

Android:时间工具类 -- 时间戳转换成日期,日期转换成时间戳

发表于 2018-09-13 | 分类于 Android , 代码片段 | | 阅读次数:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
  public class DateUtils {

public static String getTodayDateTime() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
Locale.getDefault());
return format.format(new Date());
}

/**
* 掉此方法输入所要转换的时间输入例如("2014年06月14日16时09分00秒")返回时间戳
*
* @param time
* @return
*/
public String data(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒",
Locale.CHINA);
Date date;
String times = null;
try {
date = sdr.parse(time);
long l = date.getTime();
String stf = String.valueOf(l);
times = stf.substring(0, 10);
} catch (Exception e) {
e.printStackTrace();
}
return times;
}

public static String getTodayDateTimes() {
SimpleDateFormat format = new SimpleDateFormat("MM月dd日",
Locale.getDefault());
return format.format(new Date());
}

/**
* 获取当前时间
*
* @return
*/
public static String getCurrentTime_Today() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
return sdf.format(new java.util.Date());
}

/**
* 调此方法输入所要转换的时间输入例如("2014-06-14-16-09-00")返回时间戳
*
* @param time
* @return
*/
public static String dataOne(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss",
Locale.CHINA);
Date date;
String times = null;
try {
date = sdr.parse(time);
long l = date.getTime();
String stf = String.valueOf(l);
times = stf.substring(0, 10);
} catch (Exception e) {
e.printStackTrace();
}
return times;
}

public static String getTimestamp(String time, String type) {
SimpleDateFormat sdr = new SimpleDateFormat(type, Locale.CHINA);
Date date;
String times = null;
try {
date = sdr.parse(time);
long l = date.getTime();
String stf = String.valueOf(l);
times = stf.substring(0, 10);
} catch (Exception e) {
e.printStackTrace();
}
return times;
}

/**
* 调用此方法输入所要转换的时间戳输入例如(1402733340)输出("2014年06月14日16时09分00秒")
*
* @param time
* @return
*/
public static String times(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;

}

/**
* 调用此方法输入所要转换的时间戳输入例如(1402733340)输出("2014-06-14 16:09:00")
*
* @param time
* @return
*/
public static String timedate(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;

}

/**
* 调用此方法输入所要转换的时间戳输入例如(1402733340)输出("2014年06月14日16:09")
*
* @param time
* @return
*/
public static String timet(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;

}

/**
* @param time斜杠分开
* @return
*/
public static String timeslash(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy/MM/dd,HH:mm");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;

}

/**
* @param time斜杠分开
* @return
*/
public static String timeslashData(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy/MM/dd");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
// int i = Integer.parseInt(time);
String times = sdr.format(new Date(lcc * 1000L));
return times;

}

/**
* @param time斜杠分开
* @return
*/
public static String timeMinute(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("HH:mm");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;

}

public static String tim(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyyMMdd HH:mm");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;
}

public static String time(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd HH:mm");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;
}

// 调用此方法输入所要转换的时间戳例如(1402733340)输出("2014年06月14日16时09分00秒")
public static String times(long timeStamp) {
SimpleDateFormat sdr = new SimpleDateFormat("MM月dd日 # HH:mm");
return sdr.format(new Date(timeStamp)).replaceAll("#",
getWeek(timeStamp));

}

private static String getWeek(long timeStamp) {
int mydate = 0;
String week = null;
Calendar cd = Calendar.getInstance();
cd.setTime(new Date(timeStamp));
mydate = cd.get(Calendar.DAY_OF_WEEK);
// 获取指定日期转换成星期几
if (mydate == 1) {
week = "周日";
} else if (mydate == 2) {
week = "周一";
} else if (mydate == 3) {
week = "周二";
} else if (mydate == 4) {
week = "周三";
} else if (mydate == 5) {
week = "周四";
} else if (mydate == 6) {
week = "周五";
} else if (mydate == 7) {
week = "周六";
}
return week;
}

// 并用分割符把时间分成时间数组
/**
* 调用此方法输入所要转换的时间戳输入例如(1402733340)输出("2014-06-14-16-09-00")
*
* @param time
* @return
*/
public String timesOne(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;

}

public static String timesTwo(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;

}

/**
* 并用分割符把时间分成时间数组
*
* @param time
* @return
*/
public static String[] timestamp(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
String[] fenge = times.split("[年月日时分秒]");
return fenge;
}

/**
* 根据传递的类型格式化时间
*
* @param str
* @param type
* 例如:yy-MM-dd
* @return
*/
public static String getDateTimeByMillisecond(String str, String type) {

Date date = new Date(Long.valueOf(str));

SimpleDateFormat format = new SimpleDateFormat(type);

String time = format.format(date);

return time;
}

/**
* 分割符把时间分成时间数组
*
* @param time
* @return
*/
public String[] division(String time) {

String[] fenge = time.split("[年月日时分秒]");

return fenge;

}

/**
* 输入时间戳变星期
*
* @param time
* @return
*/
public static String changeweek(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
Date date = null;
int mydate = 0;
String week = null;
try {
date = sdr.parse(times);
Calendar cd = Calendar.getInstance();
cd.setTime(date);
mydate = cd.get(Calendar.DAY_OF_WEEK);
// 获取指定日期转换成星期几
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (mydate == 1) {
week = "星期日";
} else if (mydate == 2) {
week = "星期一";
} else if (mydate == 3) {
week = "星期二";
} else if (mydate == 4) {
week = "星期三";
} else if (mydate == 5) {
week = "星期四";
} else if (mydate == 6) {
week = "星期五";
} else if (mydate == 7) {
week = "星期六";
}
return week;

}

/**
* 获取日期和星期 例如:2014-11-13 11:00 星期一
*
* @param time
* @param type
* @return
*/
public static String getDateAndWeek(String time, String type) {
return getDateTimeByMillisecond(time + "000", type) + " "
+ changeweekOne(time);
}

/**
* 输入时间戳变星期
*
* @param time
* @return
*/
public static String changeweekOne(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
Date date = null;
int mydate = 0;
String week = null;
try {
date = sdr.parse(times);
Calendar cd = Calendar.getInstance();
cd.setTime(date);
mydate = cd.get(Calendar.DAY_OF_WEEK);
// 获取指定日期转换成星期几
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (mydate == 1) {
week = "星期日";
} else if (mydate == 2) {
week = "星期一";
} else if (mydate == 3) {
week = "星期二";
} else if (mydate == 4) {
week = "星期三";
} else if (mydate == 5) {
week = "星期四";
} else if (mydate == 6) {
week = "星期五";
} else if (mydate == 7) {
week = "星期六";
}
return week;

}

/**
* 获取当前时间
*
* @return
*/
public static String getCurrentTime() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
return sdf.format(new java.util.Date());
}

/**
* 输入日期如(2014年06月14日16时09分00秒)返回(星期数)
*
* @param time
* @return
*/
public String week(String time) {
Date date = null;
SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
int mydate = 0;
String week = null;
try {
date = sdr.parse(time);
Calendar cd = Calendar.getInstance();
cd.setTime(date);
mydate = cd.get(Calendar.DAY_OF_WEEK);
// 获取指定日期转换成星期几
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (mydate == 1) {
week = "星期日";
} else if (mydate == 2) {
week = "星期一";
} else if (mydate == 3) {
week = "星期二";
} else if (mydate == 4) {
week = "星期三";
} else if (mydate == 5) {
week = "星期四";
} else if (mydate == 6) {
week = "星期五";
} else if (mydate == 7) {
week = "星期六";
}
return week;
}

/**
* 输入日期如(2014-06-14-16-09-00)返回(星期数)
*
* @param time
* @return
*/
public String weekOne(String time) {
Date date = null;
SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
int mydate = 0;
String week = null;
try {
date = sdr.parse(time);
Calendar cd = Calendar.getInstance();
cd.setTime(date);
mydate = cd.get(Calendar.DAY_OF_WEEK);
// 获取指定日期转换成星期几
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (mydate == 1) {
week = "星期日";
} else if (mydate == 2) {
week = "星期一";
} else if (mydate == 3) {
week = "星期二";
} else if (mydate == 4) {
week = "星期三";
} else if (mydate == 5) {
week = "星期四";
} else if (mydate == 6) {
week = "星期五";
} else if (mydate == 7) {
week = "星期六";
}
return week;
}
}
阅读全文 »

android 音频amr文件时长

发表于 2018-09-13 | 分类于 Android , 代码片段 | | 阅读次数:

一、文件时长获取

1
2
3
4
5
6
7
8
9
10
11
public int getDurations(){
String curAudioFile = “XXX.amr”;

MediaPlayer mediaPlayer = new MediaPlayer();

mediaPlayer.setDataSource(curAudioFile);

mediaPlayer.prepare();

return mediaPlayer.getDuration();// 单位毫秒
}
阅读全文 »

Android中实现延时执行操作的几种方法

发表于 2018-09-12 | 分类于 Android , 代码片段 | | 阅读次数:

在Android开发中我们可能会有延时执行某个操作的需求,例如我们启动应用的时候,一开始呈现的是一个引导页面,过了两三秒后,会自动跳转到主界面。这就是一个延时操作。
下面是实现延时执行操作的几种方法:

使用线程的休眠实现延时操作

1
2
3
4
5
6
7
8
9
10
new Thread() {
@Override
public void run() {
super.run();
Thread.sleep(3000);//休眠3秒
/**
* 要执行的操作
*/
}
}.start();
阅读全文 »

android判断文件是否存在,新建、删除

发表于 2018-09-11 | 分类于 Android , 代码片段 | | 阅读次数:
1
2
3
4
5
6
public static boolean fileIsExists(String fileName) {
File folder = new File(fileName);
if (!folder.exists()) {
folder.mkdir();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//判断文件是否存在  
public boolean fileIsExists(String strFile) {
try {
File f = new File(strFile);
if (!f.exists()) {
return false;
}

} catch (Exception e) {
return false;
}

return true;
}
阅读全文 »

Android知识点归纳总结提纲

发表于 2018-09-11 | 分类于 Android , 面试 | | 阅读次数:

Android部分
一、Android四大组件
二、Fragment相关
三、动画相关
四、布局相关
五、数据存储
六、线程、进程
七、网络
八、WebView
九、图片
十、Camera相关
十一、音视频相关
十二、ViewPager相关
十三、RecyclerView相关
十四、Canvas相关
十五、传感器相关
十六、性能优化
十七、UI适配
十八、Android中的Context
十九、序列化与反序列化
二十、JSON解析
二十一、二维码
二十二、Permission权限
二十三、Activity工作原理
二十四、View事件分发机制
二十五、View的绘制流程
二十六、自定义view基本流程
二十七、Apk的打包/安装过程
二十八、App混淆
二十九、App冷启动优化
三十、子线程不能更新UI
三十一、Android Studio Gradle
三十二、adb相关
三十三、逆向安全
三十四、NDK开发
三十五、设计模式
三十六、架构模式
RxJava
Kotlin
Dagger 2
Flutter
Weex
Hybrid 混合开发
OpenGL
测试工具
其他冷门知识
其他补充:
Java部分
一、Java基础
二、Java数据结构和算法

阅读全文 »
1…313233…38
ZhangMiao

ZhangMiao

Android/Flutter Developer

379 日志
58 分类
143 标签
RSS
E-Mail QQ Github StackOverflow
友情链接
  • Kaisir
  • Liujianhui
  • Leo
  • Hongyang
  • Liuwangshu
  • Jspang
  • Blankj
  • WuXiaoLong
  • Molunerfinn
  • Ofind
  • Gcssloop
© 2024 ZhangMiao
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
本站访客数 人次 本站总访问量 次