Libery

秋流到冬尽 春流到夏

0%

开发中的一些小技巧记录

ConstraintLayout 布局文字显示宽度

当 TextView 左右都有 View 且文字显示不下时需要省略号,如下图所示

解决办法:
如果layout_width="match_parent"或者ayout_width="wrap_content",则文字显示有问题
需要设置为layout_width="0dp" layout_constraintLeft_toLeftOf 为向左对其 layout_constraintRight_toLeftOf 为向右对其图片,这样就可以正确显示内容了.
对于 ConstraintLayout 内所有内容都应该要有相对位置的设置,不然会出现意想不到的问题.
示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<TextView
android:id="@+id/pin_tuan_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/toolbar_expand_size"
android:layout_marginRight="12dp"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="1"
android:textColor="@color/main_black"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/pin_tuan_more"
tools:text="商品商品商品商品商品商品商品商品商品商品商品商品商品商品商品商品商品商品商品商品" />
阅读全文 »

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

运行时异常

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 项目.

阅读全文 »