最后的温存

那是一座悲欢离合聚集的楼。

  • 主页
  • 存档
  • 干货
搜索 友链 关于我

最后的温存

那是一座悲欢离合聚集的楼。

  • 主页
  • 存档
  • 干货

Android 保活设置适配

2019-09-06

随着 Android 开发的越来越规范,那些“黑科技”的保活手段基本没什么用了,所以只能通过引导,让用户自己去设置相关保活的选项,就像 Rom 的白名单。只不过白名单是系统帮你设置,没有白名单就得自己去引导了。保活相关的一般包含自启动和防睡眠,当然功能在各个 Rom 的描述不尽相同,不用纠结于此。
针对各大厂商,做了一些准备工作,如下。

三星

  1. Galaxy S10+:SM-G9750,Android 9
  2. Galaxy Note8:SM-N9500,Android 8.0.0
  3. Galaxy Note9:SM-N9600,Android 8.1.0
  4. C7:Android 8,Sumsang Experience 版本
  5. S8:Android 8,Sumsang Experience 版本(没有自启动)

智能管理器->电池->未监视的应用程序->添加应用程序:添加后,应用处于后台时系统不会休眠应用
智能管理器->自动运行应用程序:打开允许后,若应用后台一段时间未使用,仍有可能自动停止

三星云测平台

小米

  1. 小米 MIX2:Android 9,MIUI 10.4.2
  2. 红米 NOTE7 Pro:Android 9

设置->授权管理->自启动管理->运行应用自启动
设置->电量和性能->应用配置->设置应用的省电策略为无限制

小米云测平台

vivo

  1. X9:Android 6.0.1,Funtouch OS_3.0
  2. Y75A:Android 7.1.1,Funtouch OS_3.2
  3. X21:Android 8.1.0,Funtouch OS_4.0
  4. iQOO:Android 9,Funtouch OS_9
  5. NEXS:Android 10,Funtouch OS_10 开发板

设置->更多设置->权限管理->权限Tab->自启动
设置->电池->后台高耗电->打开开关允许应用高耗电时继续允许

  • X6A:Android 5.0.2,Funtouch OS_2.5

i 管家->软件管理->权限管理->自启动管理
i 管家->省电管理->后台高耗电->打开开关允许应用高耗电时继续允许

vivo 云测平台

oppo

  1. A73:Android 7.1.1,ColorOS v5.2.1

手机管家->权限隐私->自启动管理
设置->电池->应用速冻->关闭速冻开关

oppo 云测平台需要开发者账号,还要银行卡、手持身份证等玩意,太麻烦,就没申请了,所以 oppo 看的比较少。

华为

  1. Mate 9:Android 9,EMUI 9.1.0
  2. P10:Android 9,EMUI 9.1.0

设置->应用->应用启动管理->关闭自动管理,允许自启动,后台活动
设置->电池->更多电池设置->?(云真机显示的没有应用,不确定是否有开关)

  • P10 Plus:Android 8.0,EMUI 8.0

手机管家->自启管理->允许自启动
设置->电池->耗电排行->选中应用进入耗电详情->关闭高耗电提醒

  • Mate 9:Android 7.0,EMUI 5.0

手机管家->自启管理->允许自启动
设置->电池->设置(右上角图标)->锁屏应用清理->关闭清理选项

华为云测平台

代码

只看了几个主流平台,其实还想看看一加的,但是一加没找到云测平台,也没有一加真机,无奈作罢。下面上代码:

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
object KeepCompactUtil {

private val AUTO_START_INTENTS = arrayOf(
// 小米
Intent().setComponent(ComponentName("com.miui.securitycenter",
"com.miui.permcenter.autostart.AutoStartManagementActivity")),
// 华为
Intent().setComponent(ComponentName
.unflattenFromString("com.huawei.systemmanager/.startupmgr.ui.StartupNormalAppListActivity")),
Intent().setComponent(ComponentName
.unflattenFromString("com.huawei.systemmanager/.appcontrol.activity.StartupAppControlActivity")),

// 魅族
Intent().setComponent(ComponentName.unflattenFromString("com.meizu.safe/.SecurityCenterActivity")),

// 三星
Intent().setComponent(ComponentName("com.samsung.android.sm_cn",
"com.samsung.android.sm.autorun.ui.AutoRunActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm_cn",
"com.samsung.android.sm.ui.ram.AutoRunActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm_cn",
"com.samsung.android.sm.ui.appmanagement.AppManagementActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm",
"com.samsung.android.sm.autorun.ui.AutoRunActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm",
"com.samsung.android.sm.ui.ram.AutoRunActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm",
"com.samsung.android.sm.ui.appmanagement.AppManagementActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm_cn",
"com.samsung.android.sm.ui.cstyleboard.SmartManagerDashBoardActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm",
"com.samsung.android.sm.ui.cstyleboard.SmartManagerDashBoardActivity")),
Intent().setComponent(ComponentName.unflattenFromString(
"com.samsung.android.sm_cn/.app.dashboard.SmartManagerDashBoardActivity")),
Intent().setComponent(ComponentName.unflattenFromString(
"com.samsung.android.sm/.app.dashboard.SmartManagerDashBoardActivity")),

// oppo
Intent().setComponent(ComponentName
.unflattenFromString("com.coloros.safecenter/.startupapp.StartupAppListActivity")),
Intent().setComponent(ComponentName
.unflattenFromString("com.coloros.safecenter/.permission.startupapp.StartupAppListActivity")),
Intent().setComponent(ComponentName("com.coloros.safecenter",
"com.coloros.privacypermissionsentry.PermissionTopActivity")),
Intent().setComponent(
ComponentName.unflattenFromString("com.oppo.safe/.permission.startup.StartupAppListActivity")),

// vivo
Intent().setComponent(ComponentName
.unflattenFromString("com.vivo.permissionmanager/.activity.BgStartUpManagerActivity")),
Intent().setComponent(ComponentName
.unflattenFromString("com.iqoo.secure/.phoneoptimize.BgStartUpManager")),
Intent().setComponent(ComponentName
.unflattenFromString("com.vivo.permissionmanager/.activity.PurviewTabActivity")),
Intent().setComponent(ComponentName
.unflattenFromString("com.iqoo.secure/.ui.phoneoptimize.SoftwareManagerActivity")),

// 一加
Intent().setComponent(ComponentName
.unflattenFromString("com.oneplus.security/.chainlaunch.view.ChainLaunchAppListActivity")),

// 乐视
Intent().setComponent(
ComponentName.unflattenFromString("com.letv.android.letvsafe/.AutobootManageActivity")),

// HTC
Intent().setComponent(
ComponentName.unflattenFromString("com.htc.pitroad/.landingpage.activity.LandingPageActivity"))
)

private val BATTERY_INTENTS = arrayOf(
// 小米
Intent().setComponent(ComponentName
.unflattenFromString("com.miui.powerkeeper/.ui.HiddenAppsContainerManagementActivity")),

// 华为
Intent().setComponent(ComponentName
.unflattenFromString("com.huawei.systemmanager/.power.ui.HwPowerManagerActivity")),

// 魅族
Intent().setComponent(ComponentName
.unflattenFromString("com.meizu.safe/.SecurityCenterActivity")),

// 三星
Intent().setComponent(ComponentName("com.samsung.android.sm_cn",
"com.samsung.android.sm.ui.battery.AppSleepListActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm_cn",
"com.samsung.android.sm.ui.battery.BatteryActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm",
"com.samsung.android.sm.ui.battery.AppSleepListActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm",
"com.samsung.android.sm.ui.battery.BatteryActivity")),
Intent().setComponent(ComponentName("com.samsung.android.lool",
"com.samsung.android.sm.battery.ui.BatteryActivity")),
Intent().setComponent(ComponentName("com.samsung.android.lool",
"com.samsung.android.sm.ui.battery.BatteryActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm",
"com.samsung.android.sm.ui.battery.BatteryActivity")),
Intent().setComponent(ComponentName("com.samsung.android.sm_cn",
"com.samsung.android.sm.ui.cstyleboard.SmartManagerDashBoardActivity")),

// oppo
Intent().setComponent(ComponentName
.unflattenFromString("com.coloros.safecenter/.appfrozen.activity.AppFrozenSettingsActivity")),
Intent().setComponent(ComponentName("com.coloros.oppoguardelf",
"com.coloros.powermanager.fuelgaue.PowerUsageModelActivity")),
Intent().setComponent(ComponentName("com.coloros.oppoguardelf",
"com.coloros.powermanager.fuelgaue.PowerSaverModeActivity")),
Intent().setComponent(ComponentName("com.coloros.oppoguardelf",
"com.coloros.powermanager.fuelgaue.PowerConsumptionActivity")),
Intent().setComponent(ComponentName
.unflattenFromString("com.oppo.safe/.SecureSafeMainActivity")),

// vivo
Intent().setComponent(ComponentName("com.vivo.abe",
"com.vivo.applicationbehaviorengine.ui.ExcessivePowerManagerActivity")),
Intent().setComponent(ComponentName.unflattenFromString("com.iqoo.powersaving/.PowerSavingManagerActivity"))
)

var brandAliveEnumList: List<BrandAliveEnum> = object : ArrayList<BrandAliveEnum>() {
init {
add(BrandAliveEnum.Huawei)
add(BrandAliveEnum.Xiaomi)
add(BrandAliveEnum.Oppo)
add(BrandAliveEnum.Vivo)
add(BrandAliveEnum.Samsung)
add(BrandAliveEnum.Meizu)
add(BrandAliveEnum.LeEco)
add(BrandAliveEnum.Smartisan)
add(BrandAliveEnum.Lenovo)
add(BrandAliveEnum.NONE)
}
}

/**
* @return 是否为三星s9 型号的手机
*/
val isSamsungS9: Boolean
get() = ("samsung".equals(Build.BRAND, ignoreCase = true) && StringUtils.isNotEmpty(Build.MODEL)
&& Build.MODEL.startsWith("SM-G9"))

val deviceEnum: BrandAliveEnum
get() {
if ("Huawei".equals(Build.BRAND, ignoreCase = true) || "HONOR".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.Huawei
}
if ("vivo".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.Vivo
}
if ("OPPO".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.Oppo
}
if ("Xiaomi".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.Xiaomi
}
if ("Meizu".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.Meizu
}
if ("samsung".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.Samsung
}
if ("smartisan".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.Smartisan
}
if ("LeEco".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.LeEco
}
if ("Lenovo".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.Lenovo
}
if ("oneplus".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.Yijia
}
if ("Sony".equals(Build.MANUFACTURER, ignoreCase = true)) {
return BrandAliveEnum.Sony
}
if ("LG".equals(Build.MANUFACTURER, ignoreCase = true)) {
return BrandAliveEnum.LG
}
if ("Coolpad".equals(Build.BRAND, ignoreCase = true)) {
return BrandAliveEnum.NONE
}
return if ("ZTE".equals(Build.BRAND, ignoreCase = true)) {
BrandAliveEnum.NONE
} else BrandAliveEnum.NONE

}

// 自启动
fun daemonSet(activity: Activity): Boolean {
for (intent in AUTO_START_INTENTS) {
if (activity.packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
try {
activity.startActivity(intent)
return true
} catch (e: Exception) {
LogUtils.e("KeepCompactUtil", e.toString())
continue
}
}
}
return false
}

// 防睡眠
fun noSleepSet(activity: Activity): Boolean {
for (intent in BATTERY_INTENTS) {
if (activity.packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
try {
activity.startActivity(intent)
return true
} catch (e: Exception) {
LogUtils.e("KeepCompactUtil", e.toString())
continue
}
}
}
return false
}
}

直接罗列所有的 Intent,按页面相关性从大到小排列。比如,A->B->C,设置页面在 C,但是有的手机不支持打开 C 和 B,Intent 排序为 C>B>A。通过 resolveActivity 判断系统是否能处理此 Intent,跳转成功则 ok,若跳转失败则继续遍历,找到能跳转的 Intent,如果遍历完也没有找到,则返回 false 给出相应提示。

小结

oppo vivo 的手机有点恶心,每次安装 debug 包还要弹窗让输密码,然后还自己捣鼓了权限啥的,限制三方应用进行跳转。
vivo:

1
Permission Denial: starting Intent { flg=0x10000000 cmp=com.vivo.abe/com.vivo.applicationbehaviorengine.ui.ExcessivePowerManagerActivity } from ProcessRecord{306679b 16047:cn.xxx.android.xxx/u0a605} (pid=16047, uid=10605) requires com.vivo.abe.permission.action.openhpactivity

oppo:

1
java.lang.SecurityException: Permission Denial: starting Intent { flg=0x10000000 cmp=com.coloros.safecenter/.startupapp.StartupAppListActivity } from ProcessRecord{2255367 30192:cn.xxx.android.xxx/u0a697} (pid=30192, uid=10697) requires oppo.permission.OPPO_COMPONENT_SAFE

然后在 AndroidManifest 中添加相关的权限也无效的,因为只能系统应用申请,三方应用申请没用(oppo 同学内部询问大佬给出的回答)。针对 vivo,我选择跳到上一级页面,也可以跳,只不过需要用户手动再点一下。针对 oppo,我佛了,上一级页面也跳不了,只能到最初的设置页面,这跳到设置页面大多数用户都会一脸懵逼,所以干脆不跳了,直接返回 false,同时给好相应的引导。同时,申请了权限之后,好像 apk 安装会出问题(部分机型),反正没用,所以权限就不要加了。
三星也值得说一下,一会是 sm,一会是 sm_cn,我也是佛了。一会是 ui.battery,一会是 battery.ui,索性直接进行排列组合搞了一波,所以三星的 Intent 就很多了。另外三星 S9 貌似是没有自启动的,所以可以考虑进行屏蔽。其实不屏蔽影响也不大,返回 false 给出提示即可,无奈老板的手机是 S9…

经过这次云测平台的使用,发现华为还是牛逼啊,三星也还不错,还支持 adb 命令(点个赞)。oppo vivo 就差太远了,小米更不用谈了,连可用的机型都没有。腾讯的 WeTest 机型倒是都有,但是要收费,这很腾讯。送的 30 分钟完全不够用好吗,而且每用一个机型至少 15 分钟,我的免费额度剩下 10 分钟就已经用不了了,无力吐槽。

参考

  1. Intent跳转到[自启动]页面全网最全适配机型解决方案(持续更新)
  2. Denial permission OPPO_COMPONENT_SAFE
  3. backgroundable-android
  4. How to start Power Manager of all android manufactures to enable background and push notification?
  5. [WeTest](https://wetest.qq.com/cloud/n/remotedevicelist?test=remote)
  • 日常开发

扫一扫,分享到微信

博客图片迁移
使用 LiveData 实现消息总线
© 2024 最后的温存
Hexo Theme Yilia by Litten
  • 搜索
  • 友链
  • 关于我

tag:

  • 杂谈
  • iOS
  • 日常开发
  • blog
  • sdk
  • java
  • cat
  • 奇技淫巧
  • 直播
  • Kotlin
  • Material Design
  • 自定义View
  • 技术思路
  • 学习
  • android studio
  • gradle
  • hybrid开发
  • JetPack
  • 设计模式
  • python
  • 事件分发
  • linux

    缺失模块。
    1、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    2、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: true
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 迟来的 2023 年终总结

    2024-02-20

    #杂谈

  • Android 版本升级

    2023-11-09

    #日常开发

  • 使用 Python 分析坐标

    2023-11-08

    #日常开发

  • 女儿“过三关斩六将之旅”

    2023-11-06

    #杂谈

  • HashMap 序列化小结

    2023-09-13

    #日常开发

  • Android 结合 Unity 彻底退出应用

    2023-08-17

    #日常开发

  • 写在女儿生病后

    2023-07-05

    #杂谈

  • Android 对视频进行切割、添加转场效果

    2023-06-19

    #日常开发

  • 记一次 DialogFragment 的错误使用

    2023-05-22

    #日常开发

  • Android PAG 之初体验

    2023-04-26

    #日常开发

  • 录屏权限 clone 使用

    2023-03-07

    #日常开发

  • 关于录屏权限的问题

    2023-02-28

    #日常开发

  • 使用 Dialog 的两个问题

    2023-02-21

    #日常开发

  • Android 倍速压缩视频时长

    2023-02-21

    #日常开发

  • 不平凡的 2022

    2023-01-19

    #杂谈

  • onDestroy 没有立刻执行

    2022-08-31

    #日常开发

  • Usb 端口在文件系统中的 index 它果然变化了...

    2022-07-18

    #日常开发

  • 重温线程知识

    2022-06-24

    #日常开发

  • Dialog 新姿势

    2022-05-31

    #日常开发

  • 云基站概述

    2022-04-21

    #技术思路

  • Usb 摄像头绑定

    2022-04-12

    #日常开发

  • 关于枚举类初始化的一个“耳光”

    2022-03-07

    #日常开发

  • 记一次阿里云推流问题排查的辛酸历史

    2022-02-18

    #日常开发

  • 动画小记

    2022-02-17

    #日常开发

  • 2021 年度总结

    2022-01-28

    #杂谈

  • 使用 Ping 指令判断网络

    2021-12-31

    #日常开发

  • 写在 30 岁的第一天

    2021-11-30

    #杂谈

  • 一个人可以小心眼到什么地步

    2021-11-11

    #杂谈

  • Compose 初识

    2021-11-10

    #Kotlin

  • Flow 初识

    2021-10-27

    #Kotlin

  • Kotlin 协程小实践

    2021-10-15

    #Kotlin

  • 科二考试系统-评判

    2021-07-14

    #技术思路

  • 科二考试系统-矩阵

    2021-07-13

    #技术思路

  • 科二考试系统-续

    2021-07-09

    #技术思路

  • 科二考试系统

    2021-07-08

    #技术思路

  • 关于「引擎」设计的小结

    2021-05-14

    #技术思路

  • 一个关于“唯一 ID”的问题

    2021-04-09

    #日常开发

  • 语音机器人交互实现

    2021-03-24

    #日常开发

  • 记一次《春游》

    2021-02-27

    #杂谈

  • 2020 年度总结

    2021-02-07

    #杂谈

  • LiveBus 之思考

    2021-01-28

    #JetPack

  • Android 连接 USB 设备

    2020-11-27

    #日常开发

  • Android 打包动态修改变量

    2020-10-28

    #日常开发

  • 混淆小记

    2020-09-24

    #日常开发

  • 一次 Python 工具编写的经历《三》

    2020-09-19

    #python

  • 一次 Python 工具编写的经历《二》

    2020-09-19

    #python

  • 一次 Python 工具编写的经历《一》

    2020-09-15

    #python

  • viewBinding 使用小结

    2020-07-21

    #日常开发

  • Android 串口通信小记

    2020-07-15

    #日常开发

  • ViewPager 左右突出

    2020-05-09

    #日常开发

  • 记一次电信一键登录的“BUG”

    2020-01-22

    #日常开发

  • 2019 年终总结

    2020-01-15

    #杂谈

  • TextView 自定义“ellipsize”

    2019-12-24

    #日常开发

  • 土豆历险记

    2019-12-18

    #cat

  • 记一次动画实践-续

    2019-12-18

  • 记一次动画实践

    2019-12-12

    #日常开发

  • 问题集锦

    2019-11-29

  • 十月

    2019-10-31

    #杂谈

  • 无声视频合成音频(续)

    2019-09-19

    #日常开发

  • 博客图片迁移

    2019-09-12

    #blog

  • Android 保活设置适配

    2019-09-06

    #日常开发

  • 使用 LiveData 实现消息总线

    2019-09-02

    #JetPack

  • MotionLayout 使用介绍

    2019-08-13

    #日常开发

  • 高德地图 Marker 聚合

    2019-08-05

    #sdk

  • Android 实现大文件分片上传

    2019-07-12

    #日常开发

  • 记一次 ANR 寻根之旅

    2019-07-04

    #日常开发

  • 养猫一个星期后

    2019-06-28

    #cat

  • ConstraintLayout 真香

    2019-06-13

    #日常开发

  • RecyclerView 滑动小记

    2019-05-17

    #日常开发

  • Android H5 与原生交互那点事

    2019-05-16

    #日常开发

  • Android 获取手机媒体数据那些事

    2019-05-09

    #日常开发

  • ViewModel + LiveData 初探

    2019-04-24

    #JetPack

  • CoordinatorLayout 滑动再探

    2019-04-16

    #日常开发

  • Android 滑动吸顶效果

    2019-03-12

    #日常开发

  • 记录微信分享的一个坑

    2019-03-05

    #sdk

  • 最近的几点感悟

    2019-02-27

    #杂谈

  • Android 动画序列的实现

    2019-02-02

    #日常开发

  • Android 绘制中国地图

    2019-01-25

    #日常开发

  • Fragment 问题小结

    2019-01-10

    #日常开发

  • 极客时间推广课程

    2018-12-25

    #学习

  • Android 高德地图 SDK 使用小记

    2018-12-21

    #sdk

  • CoordinatorLayout + RecyclerView 处理滑动

    2018-12-12

  • 无声视频合成音频

    2018-11-23

    #日常开发

  • 录制仿 Keep 轨迹动画视频

    2018-10-18

    #日常开发

  • startActivityForResult 的封装使用

    2018-10-10

    #日常开发

  • Android 开发减少 shape 文件

    2018-09-27

    #日常开发

  • 「小米MIX2」全面屏适配

    2018-09-13

    #日常开发

  • 关于使用 kotlin 碰到的一个坑(三)

    2018-08-22

    #Kotlin

  • Android 保活实践

    2018-08-16

    #日常开发

  • Android 列表 Header 吸顶效果

    2018-07-23

    #日常开发

  • 关于使用 kotlin 碰到的一个坑(二)

    2018-07-19

    #Kotlin

  • 关于使用 kotlin 碰到的一个坑(一)

    2018-07-11

    #Kotlin

  • Git data stream error

    2018-06-22

    #日常开发

  • 常用代码和指令小结

    2018-05-28

    #日常开发

  • 快速画 UML 图

    2018-05-08

    #奇技淫巧

  • 关于重构的一些实践

    2018-05-07

    #技术思路

  • 使用 Charles 进行手机抓包

    2018-05-03

    #奇技淫巧

  • Java HashSet 的原理

    2018-04-12

    #java

  • 异步任务的原生实现

    2018-03-28

    #java

  • 面试资料整理

    2018-03-23

    #java

  • 好久不见

    2018-03-16

    #杂谈

  • 解锁拷贝代码的新姿势

    2018-01-22

    #奇技淫巧

  • 2017

    2018-01-20

    #杂谈

  • Kotlin 结合 RxJava 使用杂谈

    2018-01-11

    #杂谈

  • Android 获取 BuildConfig 信息

    2018-01-04

    #日常开发

  • 关于 MVP 模式的一点思考(续)

    2017-12-22

    #设计模式

  • Kotlin - 代码篇

    2017-12-21

    #Kotlin

  • Java 中的 Comparator

    2017-12-20

    #java

  • Support 库,注意你的版本号

    2017-12-15

    #日常开发

  • Kotlin - 配置篇

    2017-12-05

    #Kotlin

  • Android 约束布局的使用

    2017-11-20

    #日常开发

  • Retrofit 学习小结

    2017-11-15

    #sdk

  • 在硬件设备上运行应用

    2017-11-01

    #日常开发

  • Gradle 多版本管理(续)

    2017-10-24

    #gradle

  • Android 中的 ClassLoader

    2017-10-19

    #java

  • Android 集成讯飞语音SDK

    2017-09-26

    #sdk

  • Android 双屏异显

    2017-09-13

    #日常开发

  • Android 日常开发的一些小知识

    2017-08-29

    #日常开发

  • 管理 Github 上的 star

    2017-08-04

    #杂谈

  • 尝试使用 Android SVG

    2017-07-26

    #日常开发

  • 关于 ConcurrentModificationException 异常

    2017-07-11

    #java

  • 关于 ViewPager 的2点特性

    2017-06-30

    #日常开发

  • 初识 zsh

    2017-06-09

    #linux

  • 关于 Git 的使用小记

    2017-06-07

    #日常开发

  • 关于混淆的一个小纰漏

    2017-05-09

    #日常开发

  • 针对ListView多Type的优化

    2017-05-09

    #日常开发

  • 关于 MVP 模式的一点思考

    2017-04-25

    #设计模式

  • 博客免密提交、部署到Github

    2017-04-19

    #blog

  • 使用ListView多Type的错误姿势

    2017-04-18

    #日常开发

  • CoordinatorLayout之Behavior认识

    2017-03-31

    #Material Design

  • Gradle 多版本管理

    2017-03-16

    #gradle

  • 博客主题更新

    2017-02-16

    #blog

  • Android任意View边沿渐变透明

    2017-02-16

    #自定义View

  • 我的2016

    2017-01-09

    #杂谈

  • iOS 学习之旅

    2016-12-16

    #iOS

  • Xcode的基本使用

    2016-12-07

    #iOS

  • Objective-C 基本语法

    2016-12-07

    #iOS

  • Hexo多台电脑同步博客

    2016-11-29

    #blog

  • 熟悉OS X系统

    2016-11-28

    #iOS

  • Android 转 iOS

    2016-11-21

    #杂谈

  • Android直播利用Socket传输实时数据

    2016-11-16

    #java#直播

  • Android-iOS 跨平台传输方案调研

    2016-10-28

    #直播

  • 【Android音视频开发】- 实时采集音频并编码

    2016-10-22

    #直播

  • 【Android音视频开发】- 实时采集视频并编码

    2016-10-20

    #直播

  • 【Android音视频开发】- 实时采集视频

    2016-10-20

    #直播

  • 【Android音视频开发】- 直播

    2016-10-19

    #直播

  • Android状态栏、虚拟按键小记

    2016-09-20

    #日常开发

  • Android Studio发布项目到JCenter

    2016-09-12

    #android studio

  • Android感悟之造轮子

    2016-09-12

    #自定义View

  • Android AlarmManager使用小记

    2016-08-18

    #日常开发

  • Android开发事件分发小记

    2016-08-05

    #事件分发

  • Android状态栏小记

    2016-08-04

    #日常开发

  • TextView使用小记

    2016-07-26

    #日常开发

  • Android高斯模糊

    2016-07-21

    #日常开发

  • Andoird开发中适配小记

    2016-07-21

    #日常开发

  • Android屏幕横竖屏切换小记

    2016-07-01

    #日常开发

  • 从谷歌官方TODO-MVP看MVP模式

    2016-06-27

    #设计模式

  • Retrofit初识

    2016-06-23

    #sdk

  • android PopupWindow在控件上方显示

    2016-06-02

    #日常开发

  • Android实现任务队列:一个入口一个出口、一个入口两个出口

    2016-05-27

    #java

  • Android接入支付宝移动支付

    2016-05-18

    #sdk

  • Android自定义View实现仪表盘效果

    2016-05-16

    #自定义View

  • Android自定义属性

    2016-05-10

    #日常开发

  • Android自定义View实现弧形SeekBar(续)

    2016-04-28

    #自定义View

  • Android自定义View实现弧形SeekBar

    2016-04-27

    #自定义View

  • 一个关于Android滑动“因缺斯厅”的想法

    2016-04-22

    #日常开发

  • Android仿美团下拉刷新

    2016-04-18

    #自定义View

  • 博客添加域名映射

    2016-04-07

    #blog

  • Android接入JPush(极光推送)

    2016-04-05

    #sdk

  • Android使用VideoView进行视频播放

    2016-04-01

    #日常开发

  • 博客搬家

    2016-03-25

    #blog

  • android接入微信支付SDK

    2016-03-18

    #sdk

  • Hexo-Tools

    2016-03-17

    #blog

  • Hexo-Tips

    2016-03-17

    #blog

  • Windows使用Hexo + Github Pages搭建自己的博客

    2016-03-17

    #blog

  • Android Studio 使用 Gradle 进行多渠道打包

    2016-03-09

    #gradle

  • Android实现渐变title栏

    2016-03-02

    #日常开发

  • Android实现简易轻量下载器:单线程任务队列

    2016-02-23

    #日常开发#java

  • Android实现照片墙背景

    2016-02-17

    #自定义View

  • 使用Android新特性:Material Design

    2016-02-17

    #Material Design

  • React Native For Android初探-问题小结

    2016-01-19

    #hybrid开发

  • React Native For Android初探

    2016-01-15

    #hybrid开发

  • Android Hybrid开发实战之图片的交互

    2016-01-14

    #hybrid开发

  • Android Notification使用小记

    2016-01-11

    #日常开发

  • Android Hybrid开发入门:原生Android与JS的交互

    2015-12-25

    #hybrid开发

  • Android仿QQ空间浏览图片

    2015-12-08

    #日常开发

  • Android Studio中使用.9(Nine Patch)图

    2015-11-23

    #日常开发#android studio

  • Android仿QQ实现ListView滑动删除

    2015-11-14

    #自定义View

  • Android事件分发机制学习小记

    2015-11-14

    #事件分发

  • Android Studio使用Genymotion小记

    2015-11-05

    #android studio

  • Java反射实现接口

    2015-10-28

    #java

  • 百度定位SDK无法定位

    2015-10-24

    #sdk

  • Android DDMS无法输出logcat

    2015-10-24

    #日常开发

  • Jake Wharton
  • 郭神
  • 王垠
  • GcsSloop
  • 胡凯
  • stormzhang
  • 技术小黑屋
  • Hongyang
小小程序猿一枚

good good study
day day up!