Android基础
文章平均质量分 58
张雨zy
这个作者很懒,什么都没留下…
展开
-
Android TabLayout的简单用法
【代码】Android TabLayout的简单用法。原创 2024-07-23 11:29:08 · 454 阅读 · 0 评论 -
Android几种数据存储的对比(MMKV、DataStore、SharedPreference)
Jetpack DataStore 是一种改进的新数据存储解决方案,允许使用协议缓冲区存储键值对或类型化对象。DataStore 以异步、一致的事务方式存储数据,克服了 SharedPreferences(以下统称为SP)的一些缺点。DataStore基于Kotlin协程和Flow实现,并且可以对SP数据进行迁移,旨在取代SP。MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。原创 2022-11-16 11:36:55 · 2449 阅读 · 1 评论 -
Android自定义view绘制文字位置相关操作,基线问题
---------------Paint---------------1)Paint的基本实用方法和技巧 (1)基本的使用 1.1 负责图形绘制相关 //重置 mPaint.reset(); mPaint.setColor(Color.RED); mPaint.setAlpha(255); //设置画笔的样式// mPaint.setStyle(Paint.Style.FILL);//填充内容// mPaint.setStyle(Paint.Style.FILL_AND_STROK.原创 2018-12-15 18:10:37 · 1004 阅读 · 0 评论 -
Android内存泄漏检测工具LeakCanary
LeakCanaryhttps://github.com/square/leakcanary引入dependencies { //https://github.com/square/leakcanary debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'}2.0以上的leakcanary自带ContentProvider初始化在ContentProvider中进行初始化interna原创 2022-01-06 10:00:39 · 1915 阅读 · 0 评论 -
Android 设置drawableTop无效的问题
无效代码 //设置顶部图标 val drawable = resources.getDrawable(align.resId) setCompoundDrawables(null, drawable, null, null)有效代码AppCompatResources.getDrawable获取资源图片需要设置setBounds val drawable = AppCo原创 2021-11-14 09:10:53 · 2096 阅读 · 0 评论 -
Android MVVM+RecyclerView+SwipeRefreshLayout实现下拉刷新和上滑加载更多
引入 //ViewModel的创建 implementation 'androidx.activity:activity-ktx:1.1.0'//by viewModels implementation 'androidx.fragment:fragment-ktx:1.2.5'//by viewModels // implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"//下拉刷新.原创 2021-08-31 15:29:56 · 787 阅读 · 1 评论 -
Android 监听软键盘SoftKeyboard的高度变化
方案一,使用blankj:utilcodehttps://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md KeyboardUtil.observeKeyboard(requireActivity()) { val param = binding.flKeyboard.layoutParams param.height = it .原创 2021-06-26 17:02:58 · 695 阅读 · 0 评论 -
Android ViewModel和LiveData源码分析
获取动态数据时使用例如:获取首页的列表,首次加载和加载更多时,数据是变化的,此时使用livedata中存储每次请求的结果,在activity中统一进行观测即可。如果是第一页,则setData否则addData。在列表刷新和加载更多时,只需要一行调用ViewModel.refreshData或ViewModel.loadMoreData方法即可,不需做其他逻辑操作,都交给ViewModel处理优势:简洁逻辑清晰。对同一类型的数据集中处理。非动态数据时可以不用livedata例如获取优.原创 2021-05-26 11:25:08 · 252 阅读 · 6 评论 -
Android Gson的使用和源码分析总结
GsonJSON(JavaScript Object Notation)是一种轻量级的数据交换格式Gson是Google推出的用于在Java对象和JSON数据之间进行映射的Java类库,可以将一个JSON字符串转化为Java对象(反序列化),或者将Java对象转换为JSON字符串(序列化)https://github.com/google/gsonGson使用导入//https://github.com/google/gsonimplementation 'com.google.cod原创 2021-05-19 12:24:07 · 262 阅读 · 0 评论 -
Android 软件盘相关的问题(在BottomSheetDialogFragment中无法隐藏问题、使用AirPanel适配软键盘高度问题)
需求在BottomSheetDialogFragment关闭的时候收起软键盘 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { setStyle(STYLE_NO_TITLE, R.style.BottomDialogSheet) return object : BottomSheetDialog(requireContext(),theme) { overri原创 2021-05-14 16:24:06 · 748 阅读 · 1 评论 -
Android ThreadLocal相关源码和在Looper中的使用
java 线程的工作内存和ThreadLocalJava 并发 - ThreadLocal详解原创 2021-05-07 13:36:08 · 252 阅读 · 1 评论 -
Android 几种计时器的实现(RxJava、CountDownTimer 、线程池、Handler)
Android 几种计时器的实现原创 2021-04-29 17:54:15 · 606 阅读 · 0 评论 -
Android SparseArray和ArrayMap相关总结
SparseArray是什么?SparseArray稀疏数组,可以用来存储基本类型数据,避免数据的装箱拆箱,某些情况下性能更好。几个同类SparseArray存储Object类型,put(int key, E value)SparseIntArray存储int基本类型,put(int key, int value)SparseLongArray存储long基本类型,put(int key, long value)参考资料Android官方文档...原创 2021-04-17 19:52:09 · 291 阅读 · 0 评论 -
Android 使用Glide自定义BitmapTransformation实现加载图片顶部对齐(FitTop)
原图和效果图MainActivity Glide.with(this) .load(R.mipmap.ic_image) .transform(FitTopTransformation()) .into(ivImg)自定义BitmapTransformation从原图的顶部开始裁剪,从(0,0)裁剪到ImageView的宽高(outWith,outHeight)public cla原创 2021-04-16 13:09:11 · 2238 阅读 · 0 评论 -
Android APK打包流程
打包流程多渠道打包参考Android中apk打包流程原创 2021-04-14 15:34:56 · 1293 阅读 · 0 评论 -
Android AIDL和Binder机制相关学习总结
Binder参考资源为什么 Android 要采用 Binder 作为 IPC 机制?原创 2021-04-06 15:37:47 · 531 阅读 · 1 评论 -
Android Messenger跨进程通信相关学习总结
Messenger是什么?Messenger是对AIDL的封装,AIDL又是基于Binder机制实现的,使用Messenger能使我们更简单的实现进程间通信Messenger通常和Message、Handler一起使用Messenger用法将MyService放入单独的进程中android:process=":remote" <service android:name=".MyService" android:enabl原创 2021-04-05 17:54:46 · 416 阅读 · 0 评论 -
Android ContentProvider相关总结
ContentProvider概念特点优势缺陷数据访问工作机制访问设备数据ContentProvider是什么?四大组件之一(需要在Manifest中注册)并不能用于存储数据,只是为数据的访问提供一个统一的接口供多个应用程序共享数据(跨进程通信)自定义进程间通信和系统进程间的通信(例如通讯录,图库等)ContentProvider优缺点?其他Android 使用ContentProvider初始化你的Library、获取ApplicationContext原创 2021-04-03 16:29:11 · 300 阅读 · 0 评论 -
Java 注解(Annotation)的简单用法
注解处理器(APT,Annotation process tools)注解Java提供了一种源程序中的元素关联任何信息和任何元数据的途径和方法注解分类源码注解注解只在源码中存在,编译成.class文件就不存在了编译时注解注解在源码和.class文件中都存在运行时注解(通过反射来调用)在运行阶段还起作用,甚至会影响运行逻辑的注解自定义注解定义import java.lang.annotation.Documented;import java.lang.annotatio原创 2021-03-31 11:57:32 · 291 阅读 · 0 评论 -
Android Proguard混淆相关总结
Proguard是什么?关于如何进行反编译混淆Java代码是非常容易反编译的,为了很好的保护Java源代码,我们往往需要对编译好的class文件进行混淆处理ProguardProguard是一个混淆代码的开源项目,它的主要作用是混淆,让然它还能对字节码进行缩减体积、优化等Proguard开启开启混淆(build.gradle/app)minifyEnabled true buildTypes { release { minifyEnab原创 2021-03-23 16:01:09 · 524 阅读 · 0 评论 -
Android每日首次访问和安装后的首次访问
private fun isShow(): Boolean { //判断是否显示过了,只需要显示一次 val key = "isShowPreferGuide" if (SharePrefUtils.get(requireContext(), key, true)) { SharePrefUtils.put(requireContext(), key, false) return true ...原创 2021-03-22 14:33:37 · 490 阅读 · 0 评论 -
Android 使用DialogFragment时出现的一些问题
问题一:show方法引起的异常DialogFragment中的一段代码,使用了ft.commit() public void show(@NonNull FragmentManager manager, @Nullable String tag) { mDismissed = false; mShownByMe = true; FragmentTransaction ft = manager.beginTransaction();原创 2021-03-16 16:40:49 · 2139 阅读 · 0 评论 -
Android Service+协程的简单用法
Service+协程Android 8.0 以上不推荐使用IntentService了,Google推荐使用JobIntentService由于线程的不好控制,可以使用协程来代替启动协程job = GlobalScope.launch停止协程job?.cancel()class MyService : Service() { companion object { private const val TAG = "MyService" var s原创 2021-03-10 16:22:08 · 3727 阅读 · 0 评论 -
Android BroadcastReceiver 广播接收者跨进程通信的简单Demo
跨进程通信(a发送消息到b)权限,两个程序都需要加入该权限。自定义的一个权限 <uses-permission android:name="com.zhangyu.receivebroadcast.intent.permission.MyReceiver" /> <permission android:name="com.zhangyu.receivebroadcast.intent.permission.MyReceiver"/>b程序中的广播接收者原创 2021-03-05 17:52:52 · 650 阅读 · 0 评论 -
Android BroadcastReceiver 广播接收者监听WiFi状态
创建一个广播监听WiFi状态class WifiStateReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val action = intent.action if (WifiManager.WIFI_STATE_CHANGED_ACTION == action) { // wifi status .原创 2021-03-05 17:10:32 · 802 阅读 · 0 评论 -
Android组件化,几种路由方案的对比选型(Intent、Navigation、ARouter)
什么是路由页面间跳转关系映射,可以通过字符串、别名等方式实现跳转Intent跳转过程无法控制,一旦调用了startActivity(Intent)便交由系统执行,中间过程无法插手跳转失败无法捕获、降级,出现问题直接抛出异常显示Intent显示Intent中因为存在直接的类依赖关系,导致耦合严重隐式Intent隐式Intent中会出现规则集中式的管理,导致协作困难,都需要在Manifest中进行配置,导致扩展性比较差ARouter和Navigation对比ARouter用法原创 2021-03-04 14:55:48 · 2621 阅读 · 3 评论 -
Android Glide下载图片到本地(相册中)
/** * 下载到本地 * @param context 上下文 * @param url 网络图 */ private void saveImgToLocal(Context context, String url) { //如果是网络图片,抠图的结果,需要先保存到本地 Glide.with(context) .downloadOnly() .load(u...原创 2021-02-23 16:43:25 · 12641 阅读 · 2 评论 -
Android几种方式(style、selector)实现圆形的CheckBox
使用style方式style="@style/Widget.AppCompat.CompoundButton.RadioButton" <CheckBox style="@style/Widget.AppCompat.CompoundButton.RadioButton" android:layout_width="wrap_content" android:layout_height="wrap_content" and.原创 2021-02-23 13:52:20 · 5160 阅读 · 10 评论 -
Android Studio自带的多渠道打包方案
多渠道打包在不同的应用市场可能有不同的统计需求,需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包。在安装包中添加不同的标识,以此区分各个渠道,方便统计app在市场的各种。参考资料Android几种多渠道打包...原创 2021-02-17 12:30:57 · 1256 阅读 · 4 评论 -
Android Gradle Kotlin DSL,使用Kotlin来构建Gradle
参考资料gradle/kotlin-dsl-docsgradle官网用Kotlin写Android Gradle脚本原创 2021-02-15 11:53:58 · 1917 阅读 · 0 评论 -
Android进程优先级、进程的回收策略、进程保活方案
进程保活让应用长期存活于系统中,即使被杀死了,也可以通过一定手动拉活。例如手机定位、Push等Android进程的优先级1、Foreground process 前台进程2、Visible process 可见进程3、Service process 服务进程例如:音乐播放4、Background process 后台进程(随时会被杀死)5、Empty process 空进程(随时会被杀死)用于缓存,缩短下次启动的时间Android进程的回收策略Low memory kill原创 2021-02-13 22:43:01 · 372 阅读 · 0 评论 -
Android如何减小安装包体积?
lib下的so库减少目前主流的CPU架构是arm64-v8a,这个性能是最好的,但是兼容不强。armeabi是兼容行最强,但是性能不好。armeabi-v7a算是两种的折中体现比较平衡一点。很多大厂app也只适配了一种abi而已,所以多余的abi可以剔除。剔除多余的abi支持可以减少比较客观的apk大小清理无用的资源文件清理包中不用的资源(右键res—>Refactor—>Remove Unused Resources)矢量图本地图片资源采用svg导入后的矢量图资源xml原创 2021-02-13 17:58:52 · 716 阅读 · 2 评论 -
Android内存问题(内存溢出、内存泄漏、内存抖动)
内存溢出当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制,就会抛出OutOfMemoryErrorBitmap导致的内存溢出(主要原因)Bitmap压缩(质量压缩、尺寸压缩)现在相机拍的照片大多是3024x4032,经过压缩存储在相册中占用磁盘大小5M如果直接从相册中得到该图片,并解码保存在Bitmap中,占用多少内存?内存大小 = 图片的分辨率 x 每个像素点占用空间的大小内存大小 = 3024x4032x4 = 47M仅一张图片加载到内存中就将近50M,如原创 2021-02-13 16:05:42 · 266 阅读 · 0 评论 -
Android 多进程、进程间通信(IPC)的几种方式
在一个应用中启动多个进程例如:将自己封装的CommonWebViewActivity在一个单独的进程中启动使用android:process <activity android:name=".activity.CommonWebViewActivity" android:process=":webview" android:screenOrientation="portrait" />需要特别说原创 2021-02-13 16:04:32 · 2168 阅读 · 0 评论 -
Android 在低层模块中获取app模块下类的实例(高阶函数、接口)
例如一个转跳服务(在app模块下实现,需要在其他模块调用)在最底层Base模块中顶一个跳转服务的接口,里面定义两个方法interface IIProvider { fun startLoginActivity(from: String) fun startMainActivity(from: String) }在app模块下实现这个实例,并实现其两个页面跳转的接口class JumpProvider : IIProvider { overri原创 2021-02-11 17:56:26 · 695 阅读 · 0 评论 -
Android RecyclerView中动态设置Item的宽高
方案一(推荐)对itemView设置layoutParams属性来动态调整,需要获取屏幕的宽度,减去padding和margin,然后除以每一行item数量,得到每个item的实际宽度,然后根据比例计算出高度优点:简单快速缺点:不够优雅class PreferSubAdapter : BaseQuickAdapter<PreferItem, BaseViewHolder>(R.layout.item_recycle_prefer_sub) { override fun原创 2021-02-05 19:44:34 · 13598 阅读 · 0 评论 -
Android页面路由,Intent隐式跳转方案
应用场景由后端传入一个String path,端上接收到该path并打开指定的页面或者web页端上页面间的跳转Intent隐式跳转MainActivity中跳转到SearchActivity传入的path为test://app/search?from=main&id=123对应在Manifest的配置android:host=“app” //包名android:path="/search" //页面名android:scheme=“test” //项目名 bin原创 2021-02-05 15:19:22 · 826 阅读 · 0 评论 -
Android Kotlin WebView和Js交互(Android调用JS、JS调用Android)
Android WebView和Js交互原创 2021-02-04 19:39:30 · 1559 阅读 · 1 评论 -
http和https协议学习总结
HTTP协议简介超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。超文本传输协议是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器基于TCP/IP来建立通信URI和URL的区别URI,是uniform resource identifier,统一资源标识符,用来唯一标识一个资源。例如: file://a:1234/b/c.原创 2021-02-03 16:42:30 · 304 阅读 · 1 评论 -
Android重要知识点学习总结
Java多线程、线程池、异步任务HashMap、HashTable、ConcurrentHashMap四大引用反射接口、抽象类的区别垃圾回收机制JVM内存模型设计模式基本原则单例策略工厂、建造者适配器观察者AndroidActivity启动模式App的启动流程Handler原理事件分发机制Activity、Window、View的关系View的绘制流程断点续传类加载过程(插件化和热修复)kotlin + jetpack + mvvm进程间通信进程原创 2021-01-31 19:07:40 · 1203 阅读 · 1 评论