切换到API 27一直爆出MainActivity无法Init
原因是关掉Instanrun
在使用MVP模式的时候需要注意的地方
在使用View时,请先判断View状态;否则View异常销毁时会报NullPoiterException。
如果有线程或者Handler一定要在destroy中销毁,避免造成内存泄漏。
MVP写法参考这个链接最后的代码:
http://mp.weixin.qq.com/s/DuNbl3V4gZY-ZCETbhZGug
Rxjava线程切换总结
subscribeOn() : 影响的是被观察者所在的线程,即影响Observable的线程,当使用多个 subscribeOn() 的时候,只有第一个 subscribeOn() 起作用;
observeOn() : 影响的是(指定观察者运行的线程即Observer)。所以如果想要多次改变线程,可以多次使用 observeOn,事件序列操作的线程与调用.subscribe()的线程一致。
修改包名
https://blog.csdn.net/zhq217217/article/details/79989875
手机屏幕适配
https://mp.weixin.qq.com/s/UPT1InIOz-liHb_dLXT3hg
依据
dp适配也是一样的,只不过dp适配是根据“最小宽度(Smallest-width)限定符”来找
80%的手机的最小宽度dp值(widthPixels / density)都为360dp,这样就大大减少了dimens.xml文件
values-sw400dp文件夹下的dimens.xml文件
协调布局(CoordinatorLayout)
通过为子View指定 behavior 实现自定义的交互行为。
设置 Toolbar 的 layout_scrollFlags="scroll|enterAlways|snap" 保证 Toolbar 能随界面滑动向上隐藏。 TabLayout 与 Toolbar 同级,父节点为 AppBarLayout ,保证 TabLayout 能够能够显示在 Toolbar 外面而不随其一起隐藏。
CoordinatorLayout -> AppBarLayout -> ToolBar + TabLayout浸入式 + CollapsingToolbarLayout
浸入式布局
布局文件结构
CoordinatorLayout -> AppBarLayout -> CollapsingToolbarLayout -> Toolbar + RelativeLayout
https://blog.csdn.net/hunanqi/article/details/52597675
https://blog.csdn.net/qq_31340657/article/details/51918773
https://blog.csdn.net/BIGGGFISH/article/details/53585783
https://blog.csdn.net/qq_31340657/article/details/51918773
AppBarLayout或者ToolBar是带阴影的,想要取消阴影需要添加属性:
app:elevation="0dp"
Fragment 的使用,一些你不可不知的注意事项
https://www.jianshu.com/p/465f645adac0
小技巧
该属性的意思就是在子View进行绘制时不要去裁切它们的显示范围
<android.support.v4.view.ViewPager android:clipChildren="false">设置Page间间距
mViewPager.setPageMargin(20);设置缓存的页面数量(最多可见就是3页)
mViewPager.setOffscreenPageLimit(3);ViewPager可以通过设置PageTransformer来利用属性动画来设置特效
Kotlin中IO操作
https://www.e-learn.cn/content/wangluowenzhang/77587
TextInputLayout与TextInputEditText详解
https://blog.csdn.net/u012792686/article/details/73089227
Spinner控件详解
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0105/2264.html
<Spinner
android:prompt="@string/spinner_title"/>
android:prompt可以设置dialog的标题(注意必须在string资源下引用,不然程序会崩掉)
储备知识
Android studio 3.0上进行多渠道打包遇到的问题
Gson gson = new Gson();
String json = gson.toJson(items);//List<Item> items
public List<Item> readItems() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Reader reader = new FileReader(dataFile);
return gson.fromJson(reader, new TypeToken<List<Item>>(){}.getType());
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
}
@DrawableRes
private val drawables = IntArray(100) //用于显示对应 item 位置的图片
// 定时器数组,每个 item 都需要一个定时器
private val disposables = arrayOfNulls<Disposable>(100)
init {
for (i in drawables.indices) {//遍历数组下标
drawables[i] = R.drawable.ic_battery_charging_0
}
}
//取代if..else..
when {
disposables[position] == null -> holder?.button?.text = "start"
else -> holder?.button?.text = "stop"
}
http://tneciv.github.io/android/2015/10/22/TabLayout/
https://mp.weixin.qq.com/s/WD6wjcKD3lkEvWrWa8ozeQ
https://blog.csdn.net/ljd2038/article/details/79576091
https://www.jianshu.com/search?q=android%20webview&page=1&type=note
Android持续集成:Jenkins+Github+蒲公英/Fir.im+邮件通知
https://juejin.im/entry/58f8347961ff4b0066481689
https://link.jianshu.com/?t=https%3A%2F%2Fjuejin.im%2Fentry%2F57c2bc3c8ac247006343dcab
https://juejin.im/entry/58bd313344d904006aec03c9
https://juejin.im/entry/58be21c2570c35006c6e873f
https://juejin.im/entry/58da15720ce463005716a123
https://juejin.im/entry/58ac5b8a570c35006bc9e698
https://juejin.im/post/589d1036b123db16a3c6d6d1
https://juejin.im/post/58f827feb123db0062342b70
Android gradle plugin 编写以及上传插件门户网:
启动页 (闪屏) 延时三秒?试试让启动页在应用加载好了就自动跳过
https://juejin.im/entry/58ae460d8d6d8100584a41b5
https://juejin.im/post/58d0ead3570c350058b406f1
https://juejin.im/entry/58a41db361ff4b006c3eea64
https://juejin.im/entry/5909d52aa22b9d0065fe9e2e
https://juejin.im/post/58ff6259da2f60005dd81459
https://juejin.im/entry/5840c9b9a22b9d007a87c078
https://juejin.im/entry/5844c30561ff4b006c34b133
https://juejin.im/post/58dd9db88d6d8100613df639
https://juejin.im/entry/586c6ac961ff4b006b2a4469
https://link.jianshu.com/?t=https%3A%2F%2Fjuejin.im%2Fentry%2F57ce9e3c165abd005f05ac1f
https://juejin.im/post/584d36f161ff4b006cccdb82
https://juejin.im/entry/58d7c595ac502e0058d44fc2
https://juejin.im/post/58441c48c59e0d0056a30bc2(看到这里来了)
https://juejin.im/entry/58dcc20144d904006dfd60e2
https://juejin.im/post/58c90816a22b9d006413f624
https://juejin.im/entry/58b3edd7b123db0052d39c23
https://juejin.im/entry/58d369c9b123db3f6b5bd26d
https://juejin.im/entry/58ef236b44d904006cdf4347
https://juejin.im/entry/58f80d91da2f60005da3f8c2
https://juejin.im/entry/5786588dd342d3005795a159
作为 Android 开发者必须了解的 Gradle 知识 (译)
MultiItem用法与详解-优雅的实现多类型RecyclerView Adapter - 掘金
Android Theme.AppCompat 中,你应该熟悉的颜色属性
我是如何通过 Android studio 早下班的(改键姿势,代码模板详解)建议 WIFI
Android 相机开发那些坑 - Android - 掘金
指纹登陆
使用指纹识别功能需要一个加密对象(CryptoObject)该对象一般是由对称加密或者非对称加密获得
加密过程中密钥的创建和使用
纯本地的使用指纹识别功能,只需要对称加密即可; 后台交互则需要使用非对称加密:将私钥用于本地指纹识别,识别成功后将加密信息传给后台,后台开发人员用公钥解密,以获得用户信息。 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。
使用指纹识别的对称加密功能的主要流程如下:
1、使用 KeyGenerator 创建一个对称密钥,存放在 KeyStore 里。
2、设置 KeyGenParameterSpec.Builder.setUserAuthenticationRequired() 为true,
3、使用创建好的对称密钥初始化一个Cipher对象,并用该对象调用 FingerprintManager.authenticate() 方法启动指纹传感器并开始监听。
4、重写FingerprintManager.AuthenticationCallback 的几个回调方法,以处理指纹识别成功(onAuthenticationSucceeded())、失败(onAuthenticationFailed() 和 onAuthenticationError())等情况。
KeyGenerator 产生密钥
KeyStore 存放获取密钥
Cipher,是一个按照一定的加密规则,将数据进行加密后的一个对象
模块化要注意的问题
https://blog.csdn.net/finddreams/article/details/78354209
总结:SparseArray是Android里为
可能是数据刷新过程中View未复用,从新inflate耗时亦或是其他原因,导致闪烁。
RecyclerView 之所以能够灵活布局,是因为它将onLayout()委托给了LayoutManager
至此,notifyDataSetChanged 导致图片闪烁的真凶 是itemView 重新测量布局导致的,并非createViewHolder
上面的方案还是太重了,果然有同学有更好的方案: ((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); 加上这一句就可以了,设置为false,动画就不显示了。感谢@七方 同学。
还有另外一种方案: recyclerView.getItemAnimator().setChangeDuration(0); 通过设置动画执行时间为0来解决问题,感谢@越风 同学。
WebSettings webSettings = webView.getSettings(); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
有兴趣可以看H5 缓存机制浅析 移动端 Web 加载性能优化和Android:手把手教你构建 全面的WebView 缓存机制 & 资源加载方案。
大家可以参考移动H5首屏秒开优化方案探讨、美团大众点评 Hybrid 化建设、《移动端本地 H5 秒开方案探索与实现》这几篇文章看看。