Kotlin not configured

切换到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

Fragment全解析系列(一):那些年踩过的坑


小技巧

  • 该属性的意思就是在子View进行绘制时不要去裁切它们的显示范围

      <android.support.v4.view.ViewPager
              android:clipChildren="false">
    
  • 设置Page间间距

               mViewPager.setPageMargin(20);
    
  • 设置缓存的页面数量(最多可见就是3页)

              mViewPager.setOffscreenPageLimit(3);          
    
  • ViewPager可以通过设置PageTransformer来利用属性动画来设置特效

ViewPager切换动画:

UI性能优化:


Kotlin中IO操作

kotlin json parse

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资源下引用,不然程序会崩掉)


储备知识

iOS/Android 微信及浏览器中唤起本地APP

Android studio 3.0上进行多渠道打包遇到的问题

Android标题栏、状态栏图标文字颜色及背景动态变化


    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


PopupWindow位置动态计算:


Android持续集成:Jenkins+Github+蒲公英/Fir.im+邮件通知

Rxbus2实现详解

想让你的资源文件被混淆吗?快来试试AndResGuard吧

原来新手引导ShowCase这么简单就可以实现了

一起来做一个简单的键盘吧

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 编写以及上传插件门户网:

启动页 (闪屏) 延时三秒?试试让启动页在应用加载好了就自动跳过

写给 Android 开发者的混淆使用手册

Android 保存私密信息-强大的 keyStore

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 知识 (译)

SharedPreferences 多进程解决方案

状态栏着色原理和 API 版本兼容处理

Android 之长连接实现

Gradle 模块化配置

MultiItem用法与详解-优雅的实现多类型RecyclerView Adapter - 掘金

手把手教你用 "视频" 做闪屏页

Android 修改状态栏颜色全方位教程

代码神注释,让我们认真对待一次!

Android 7.0 多窗口模式 - 掘金

ProGuard 最全混淆规则说明

Adroid7.0下如何拯救你的多渠道打包

FREELINE - 秒级编译

android 自定义 view(自定义数字键盘)

Android 应用安全风险与防范

京东快报轮播公告的实现

如何阅读 Android framework 层源代码

Android Theme.AppCompat 中,你应该熟悉的颜色属性

Android样式(style)和主题(theme)

一道 Android OpenGL 笔试题

AS 高效使用通关小手册

读懂 Android 中的代码混淆阅读 1711

史上最牛逼的音乐播放器—仿网易云音乐(已开源)

Android启动页黑屏及最优解决方案

Android 多状态加载布局的开发 Tips

我是如何通过 Android studio 早下班的(改键姿势,代码模板详解)建议 WIFI

安卓代码动态切换 APP 启动图标

比较完整的 Android Studio 快捷小技巧

Android 项目组件化详细实施方案

Android(Java)日期和时间处理完全解析

将 Gradle 项目发布到 maven 仓库

Hook 技术之 Activity 的启动过程拦截

Android无埋点数据收集SDK关键技术

Android 进程保活招式大全

ANDROID 高仿微信拍照与视频拍摄

高仿微信表情控件 -- LQREmojiLibrary

给 RecyclerView 加上折叠的效果

Path从懵逼到精通——基本操作

Android 状态栏操作,你想知道的都在这里了

Android 相机开发那些坑 - Android - 掘金

Android 调用系统相机和相册 - 填坑篇


Tangram 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里为这样的Hashmap而专门写的类,目的是提高内存效率,其核心是折半查找函数(binarySearch)。注意内存二字很重要,因为它仅仅提高内存效率,而不是提高执行效率,所以也决定它只适用于android系统(内存对android项目有多重要,地球人都知道)。SparseArray有两个优点:1.避免了自动装箱(auto-boxing),2.数据结构不会依赖于外部对象映射。我们知道HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置,存放的都是数组元素的引用,通过每个对象的hash值来映射对象。而SparseArray则是用数组数据结构来保存映射,然后通过折半查找来找到对象。但其实一般来说,SparseArray执行效率比HashMap要慢一点,因为查找需要折半查找,而添加删除则需要在数组中执行,而HashMap都是通过外部映射。但相对来说影响不大,最主要是SparseArray不需要开辟内存空间来额外存储外部映射,从而节省内存。


RecycleView性能优化:

BaseLoadAdapter:

手把手教你Android标准App的四大自动化测试法宝


可能是数据刷新过程中View未复用,从新inflate耗时亦或是其他原因,导致闪烁。

RecyclerView 之所以能够灵活布局,是因为它将onLayout()委托给了LayoutManager

至此,notifyDataSetChanged 导致图片闪烁的真凶 是itemView 重新测量布局导致的,并非createViewHolder

上面的方案还是太重了,果然有同学有更好的方案: ((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); 加上这一句就可以了,设置为false,动画就不显示了。感谢@七方 同学。

还有另外一种方案: recyclerView.getItemAnimator().setChangeDuration(0); 通过设置动画执行时间为0来解决问题,感谢@越风 同学。


字符串格式化:


Android Webview H5 秒开方案实现

WebSettings webSettings = webView.getSettings(); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

有兴趣可以看H5 缓存机制浅析 移动端 Web 加载性能优化和Android:手把手教你构建 全面的WebView 缓存机制 & 资源加载方案。

大家可以参考移动H5首屏秒开优化方案探讨、美团大众点评 Hybrid 化建设、《移动端本地 H5 秒开方案探索与实现》这几篇文章看看。


Android不容错过的智能下拉刷新加载框架

吴晓龙


通过浏览器直接打开Android应用程序


java Calendar 日期的加减

results matching ""

    No results matching ""