Libery

秋流到冬尽 春流到夏

0%

在开发过程中遇到各种不太常见的问题,在此记录.

运行时异常

Android 8.1 apk 安装权限问题 android.permission.ACCESS_ALL_DOWNLOADS

targetVersion 28 应用内更新安装 apk 如果没有添加flag将会引起以下错误,在华为 8.1.0(27) 系统遇到此问题,但是三星 8.0(26) 系统则没有,估计是内部处理逻辑不同吧.

1
2
3
4
5
6
7
Writing exception to parceljava.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadProvider uri content://downloads/all_downloads/7 from pid=3633, uid=10037 requires android.permission.ACCESS_ALL_DOWNLOADS, or grantUriPermission()
at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:631)
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:501)
at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:492)
at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:420)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:302)
at android.os.Binder.execTransact(Binder.java:698)

解决办法: 添加intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
完整安装代码

1
2
3
4
5
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
mContext.startActivity(intent);

阅读全文 »

问题

Android 系统不断的更新, targetVersion 一直定在 25 ,感觉差的有点多,如果还不升级更新,以后再改估计坑会更多,所以在新的迭代里,将 targetVersion 升级到 28 . 果然和预想的一样,有适配的问题出现了.
在 8.0 和 8.1 的手机上通知不能播放自定义铃声,5.0.2 的手机又是可以正常播放.自定义播放铃声使用channel.setSound(notificationUri, Notification.AUDIO_ATTRIBUTES_DEFAULT);,然后看到网上说调整channel.setImportance()发现还是无效,但是设置这个值会影响通知的显示和是否震动、显示指示灯、静音等情况.抱着试一试的心态使用 NotificationCompat.Builder 的 setSound() 方法,果然还是不行.

阅读全文 »

进入全面屏时代,iPhone 的交互是业界标杆,所以Android阵营都向其靠拢.小米全面屏手势是我挺喜欢的交互.所以模仿下小米的返回操作.其返回逻辑远不如微信返回动画复杂,几乎没有机型适配问题的存在.

阅读全文 »

Web 独立进程

一般应用中会大量使用网页,我们项目由于有家装 VR 页面,如果都放在主进程则会造成大量的内存占用,因此将 WebView 拆分为独立进程运行,从而减轻主进程内存压力很有必要,当内存紧张时,系统则会自动杀死 web 进程.拆分为多进程后,主要问题在于进程间通讯与主进程保活.

拆分 Web 进程

独立进程分为两种模式,私有独立进程全局独立进程 两种模式,开始方式也很简单.

1
2
3
4
5
6
7
8
 <!-- 私有独立进程:与主进程同ShareUID,共享data目录、组件信息、共享内存数据  -->
<activity
android:name=".WebActivity"
android:process=":web"/>
<!-- 全局独立进程:与主进程不同ShareUID -->
<activity
android:name=".WebActivity"
android:process=".web"/>

本项目使用的是第一种方法,因为只与本应用通信,所以不需要为全局独立进程.

阅读全文 »

上一篇从图片加载和布局方面分析怎样优化内存,这样可以解决大部分的 OOM 问题了,但是为了尽可能小的占用内存,我们还需要从其他方面入手,不光是从编程角度,还需要在业务方面配合.

ViewPager 页面使用懒加载

在首页、搜索等页面中需要使用 ViewPager 承载不同 Fragment,并且有的需要 ViewPager 嵌套 ViewPager,如果进入 Activity 就加载 Fragment 会消耗大量资源,如网络请求、内存、布局绘制耗时耗内存,对用户而言需要等待造成不好的体验.所以需要使用懒加载方式以减少网络请求、布局绘制等不必要的消耗.
懒加载的思路就是首次Fragment加载进Activity不可见的时候不初始化布局和请求网络,让Fragment切换为可见时,再加载布局、请求网络,这样就避免首次打开Activity卡顿和消耗不必要内存.在 Fragment 重写setUserVisibleHint(boolean isVisibleToUser)方法便可以获取到,Fragment 是否用户可见.

阅读全文 »

一直在写代码,感觉总结反思比较少,自己的表达能力很欠缺,所以想把自己的一些经验记录下来,顺便理清思路.
公司项目经历了一两年多的迭代,业务越来越复杂,由于是电商项目,有大量的图片需要加载,页面布局多样化,对 WebView 使用也很多,所以在内存方面开始出现较大的压力.在历经几个迭代处理相关问题后,现在首页 Tab 全部加载后内存比优化前内存使用减少40%,当打开十多个页面后,内存减少有30%以上,从 bugly 的日志来看已经没有 OOM 相关日志了,改进效果还是比较明显.

阅读全文 »

Flutter 只是一个 UI 框架,对于一些系统调用或者各自平台的的特有实现需要开发者自行编写 package,通过在 package 内实现不同平台的调用方式,以这样的方式进行适配.今天记录下怎样在不同平台编写 package.由于自己不会 iOS,所以只是实现一个简单的 Android Toast.iOS 端使用定时的UIAlertView去模拟.

阅读全文 »

最早的博客使用 Jekyll 模版,但是感觉审美疲劳,样式太丑,所以迁移到了 Hexo 模版,目前对这个主题很满意.今年 GihHub 开始支持 https 加密访问博客了,所以抽空折腾了下自己的域名解析.

阅读全文 »

Flutter

Flutter 是 Google 开发的一套全新的跨平台、开源UI框架,支持 iOS、Android 系统开发,并且是未来新操作系统 Fuchsia 的默认开发套件。物联网是未来趋势,所以还是很看好 Flutter 项目,看到跨平台就感觉很熟悉了,有 Cordova、ReactNative、Weex 等前辈,但是Flutter的思路与上述的框架有本质却别.Flutter 使用全新的 Dart 语言开发,分别在 iOS、Android 实现了各自的 UI 控件、渲染逻辑,所以相比其他框架其性能更接近原生,美团的实际对比也确实说明了这个问题.记得前两年 Google 推出过基于 Dart 语言的 Sky 项目,当时写过 Demo 体验了下,然而确实昙花一现再也没有人讨论了,不过现在我估计是 Sky 项目孵化出了 Flutter 项目.

阅读全文 »

上一篇写了关于下单优惠的计算,项目迭代了几期,产品又提出要在下单后支付前还要有新的优惠措施,以一种不同面值的代币形式.买家可以选择不同面值的组合减免支付金额.

问题描述

当用户下单后进入支付页面,系统优先计算出最划算的组合,供给用户选择.故实际付款金额=下单金额-代币组合值,代币不限数量,所以组合会有很多组合.例如有10,10,45,50,100的面值的代币,下单金额为75,最优组合为10,10,50.

阅读全文 »