Android中级
文章平均质量分 90
Android 编码技巧和控件结合
松仔log
初出茅庐的程序员
展开
-
Android中级——MVP
MVPMVP是什么?基于Activity、Service实现——播放器实例View层接口及实现Presenter层接口及实现View-Presenter桥梁MVP是什么?Model-View-Presenter三层分离架构基于Activity、Service实现——播放器实例View层接口及实现创建播放状态接口IPlayViewControl,P层处理完逻辑导致状态改变时用于通知UI更新public interface IPlayViewControl { void onPla原创 2021-10-27 14:24:02 · 369 阅读 · 0 评论 -
Android中级——设置默认Launcher(Android13)
ResolverActivity解析隐式Intent,其onCreate()方法如下调用ResolverActivity的5参数onCreate()方法,如下调用ResolverActivity的 configureContentView() 方法,如下调用AbstractMultiProfilePagerAdapter的 rebuildActiveTab()、rebuildTab() 方法,如下调用ResolverListAdapter的 rebuildList() 方法,如下。原创 2024-05-27 14:30:49 · 1226 阅读 · 0 评论 -
Android中级——MVVM
Model-View-ViewMode架构,可看作MVP改进版,将此前Presenter的逻辑操作交给ViewMode中的Binder去处理。在build.gradle中android节点添加如下代码(最低SDK版本为API7,Gradle版本为1.5.0-alpha1)LoginModel封装维护LoginInfo、点击事件、文本改变事件。MainActivity开启线程3秒后修改数据会显示在UI。xml文件根节点变为layout,布局分为。创建数据实体类LoginInfo。原创 2023-10-19 20:51:05 · 378 阅读 · 0 评论 -
Android中级——ListView和RecycleView解析
requestLayout()会调用onLayout()、dispatchLayout()、dispatchLayoutStep1()next()调用RecyclerView的getViewForPosition(),回调getItemViewType()调用AdapterView的obtainView(),这里会回调getItemViewType()、getView()调用requestLayout()会重新布局,调用AdapterView的onLayout()其setAdapter()方法如下。原创 2023-10-11 18:25:03 · 1036 阅读 · 0 评论 -
Android中级——Activity数据恢复过程
onSaveInstanceState()存储Window视图树、调用Fragment、ActivityLifecycleCallbacks的onSaveInstanceState()Activity并非每次退出都会调用onSaveInstanceState(),如当用户按Back键主动退出时,下面列举几种调用onSaveInstanceState()的情况。在handleStartActivity()中先调用onStart(),再调用OnRestoreInstanceState()原创 2023-10-09 11:46:06 · 264 阅读 · 0 评论 -
Android中级——getSystemService和LayoutInflater
会调用ServiceFetcher的子类的CachedServiceFetcher的getService(),若已经创建则从缓存中获取,否则调用createService()创建并加入缓存。上述代码其实就是Context中getSystemService()获取系统服务的简略实现,其是抽象方法,实现类是ContextImpl,如下。调用SystemServiceRegistry的getSystemService(),如下。将单例统一管理,隐藏实现,第一次获取时创建,下次直接从缓存中获取,避免重复创建对象。原创 2023-09-25 15:28:35 · 383 阅读 · 0 评论 -
Android中级——PackageManagerService和Intent
上面通过PackageManager的submit()并行解析,解析完后封装成ParseResult放到一个队列里,后面再利用scanDirLI()的take()获取解析结果。上面获取ActivityTaskManagerService,是IPC过程,调用其startActivity()启动,然后调到startActivityAsUser()startActivity()最终都会调用到startActivityForResult()调用scanDirTracedLI()、scanDirLI()原创 2023-09-25 15:25:16 · 439 阅读 · 0 评论 -
Android中级——性能优化
用Android Device Monitor打开生成的Log,上半部分显示方法执行时间的时间轴,每一行代表一个线程,不同颜色的方块代表下面不同的执行方法。",可获取布局测量、摆放、绘制的时间,绿黄红颜色表示绘制效率的好中差。过度绘制会浪费CPU、GPU资源,如系统会默认绘制Activity的背景,若再绘制一个重叠背景则Overdraw了。在Hierarchy View,我们可以看到三层的LinearLayout且没有分支,说明是冗余的。对View的测量、布局和绘制都是通过对View树的遍历来操作,原创 2023-04-12 19:26:47 · 1086 阅读 · 0 评论 -
Android中级——线程和线程池
启动服务调用onStartCommand()、onStart(),通过mServiceHandler发送Message,handleMessage()会在HandlerThread中执行(会到创建Handler所在的Looper中执行),回调onHandleIntent()处理耗时任务,处理完后调用stopSelf()停止服务。无核心线程,最大线程数量无限制,闲置60s会被回收,当线程池中的线程都在工作时,会创建新线程处理新任务(任何任务都会被立即执行,适合执行大量耗时少的任务),无任务时不占用系统资源。原创 2023-09-01 11:00:20 · 664 阅读 · 0 评论 -
Android中级——消息机制
其set()方法如下,内部通过所传入线程threadLocals(ThreadLocalMap.Entry)存储数据。,如在调用栈比较深时用于存储监听器,不需要全局变量即可实现监听线程的全部执行过程,且避免了监听器通过参数去传递。其get()方法如下,若存在则返回数据,不存在则创建ThreadLocalMap,存储默认值null并返回。如下为读取操作,死循环遍历链表,在规定时间后将Message返回并从链表删除。如下为插入操作enqueueMessage(),主要为链表的插入。再看下set()的实际实现。原创 2023-08-30 16:25:56 · 822 阅读 · 0 评论 -
Android中级——四大组件工作过程
若没加载,则调用ActivityManagerService的getContentProvider(),startProcessLocked()启动ContentProvider所在的进程,进程入口方法为ActivityThread的main(),在此创建ActivityThread和主线程消息队列。以query()为例,调用ContentResolver的acquireUnstableProvider()或acquireProvider()获取IContentProvider,其是抽象方法。原创 2023-08-29 18:57:03 · 1319 阅读 · 0 评论 -
Andoird中级——Window和WindowManger
WindowManager提供了removeView() / removeViewImmediate() 异步 / 同步删除,具体实现在ViewRootImpl的die(),异步删除只发送消息,并将其添加到mDyingViews列表。在show()中通过addView()将DecorView添加到Window,在dismiss()中通过removeViewImmediate()移除。ToastRecord的show()会回调到Toast中TN的handleShow(),将View添加到Window。原创 2023-08-24 16:33:48 · 265 阅读 · 0 评论 -
Android中级——RemoteView
每当调用setxxx()方法时,并不会立即更新界面,而必须要通过NotificationManager的notify()或AppWidgetManager的updateAppWidget(),其内部会调用RemoteViews的。如下模拟在MainActivity中通过广播传递RemoteViews,修改SecondActivity中的布局,manifest如下。为避免每次对RemoteViews的操作都通过Binder传输,提供了Action封装对View的操作,如下。原创 2023-08-05 17:24:48 · 1139 阅读 · 0 评论 -
Android中级——IPC
当Binder所在服务端进程异常终止时,会导致远程调用失败,通过linkToDeath()可为Binder设置一个死亡代理,当Binder死亡时回调binderDied()可再次重新发起请求。在AS菜单栏的Build,点击Clean Project,再点击Rebuild Project,会生成IBookManager.java,位置如下图。Messenger只能串行处理客户端的请求,当需要并行处理客户端请求或需要调用服务端的方法时可以使用AIDL,AIDL支持的数据类型有。原创 2023-07-05 19:32:01 · 1323 阅读 · 0 评论 -
Android中级——自定义控件
如下继承TextView@Override//绘制蓝色外层矩形//绘制黄色内层矩形//将文字平移10像素,避免遮挡在其onDraw()绘制文字之前,绘制两个不同的矩形背景,如下当子View上拉超过一定距离,松开后自动滑到下一个子View,下滑同理,布局如下原创 2023-05-18 15:30:24 · 2163 阅读 · 1 评论 -
Android中级——系统信息与安全机制
对应Apk的AndroidManifest中的标签,记录权限信息。,运行下面命令,会生成一个对应名字的文件夹,可正常查看里面的xml文件(多用于汉化)但解压后的文件无源码文件src,同时xml文件乱码,只能查看res目录下的图片资源。,如下打开上面反编译的.jar文件,查看MainAcitivity,内容一模一样。Apk本质是一个压缩文件,可通过解压缩软件获取里面的内容,如下。,将.dex放到根目录运行如下命令,生成对应名字的.jar文件。包含了许多系统配置属性值和参数。原创 2023-04-08 19:45:24 · 1097 阅读 · 0 评论 -
Android中级——动画
自定义动画需继承Animation并重写applyTransformation()第一个参数为Interpolator的时间因子,由动画当前完成的百分比和当前时间所对应的插值所计算得来,范围为0-1.0第二个参数为矩阵的封装类,用于获取矩阵如下缩小图片的纵向,模拟电视机关闭动画@Override@Override使用方法和其他动画一样。原创 2023-03-14 19:36:35 · 1431 阅读 · 0 评论 -
Android中级——屏幕和绘图
Android通过VSYNC信号刷新View进行屏幕的重绘,时间间隔为16ms,若在需要频繁刷新的界面上执行太多的操作逻辑,则容易阻塞主线程,造成画面卡顿。先将图片翻转,再添加黑色透明度递减的渐变,DST_IN是为了避免上面的图像被渐变效果遮挡。如下实现圆角图形,mOut为先画的图像,mBitmap为后画的图像,用SrcIn取交集。如下代码设置透明的画笔,实时获取坐标调用drawPath()涂抹上面的图层,实现刮刮乐。,dst是先画的图形,而src是后画的图形,共有16种模式,如图。原创 2023-03-08 16:16:37 · 690 阅读 · 0 评论 -
Android中级——色彩处理和图像处理
图像像素点的X、Y坐标可拆分为一个3行3列和3行一列矩阵相乘其中3行3列矩阵即为Matrix,可通过调整Matrix间接调整X、Y第一行 abc 决定新的 X第二行 def 决定新的 Y通常让 g=h=0, i=1,保证 gX+hy+i =1 恒成立当a=e=i=1,其他为0时得到初始矩阵。原创 2023-02-24 18:09:03 · 827 阅读 · 2 评论 -
Android中级——滑动分析
如上,后面的矩形为画布,中间的矩形则为屏幕的可视区域,若调用scrollBy(20,10),则结果为可视区域向右下方移动(而对于Button则是向左上方移动),如下图。如上实现在ACTION_UP时,将控件回归原位,利用Scroller和computeScroll(),通过不断获取当前滚动值,调用scrollTo(),实现平滑移动。基本思想是:当触摸View时记下坐标,当手指移动时记下移动后的坐标,从而获取偏移量修改View的坐标,不断重复实现滑动。可通过如下方式获取控件在视图坐标系的(x, y)坐标。原创 2023-02-02 18:52:17 · 922 阅读 · 0 评论 -
Android中级——事件拦截机制和滑动冲突
若MyViewGroupA的onInterceptTouchEvent()方法返回True,打印如下。若MyViewGroupB的onInterceptTouchEvent()方法返回True,打印如下。若MyViewGroupB的onTouchEvent()方法返回True,打印如下。布局如下,MyViewGroupA包裹MyViewGroupB再包裹MyView。若MyView的onTouchEvent()方法返回True,打印如下。点击最内层蓝色的MyView,打印如下。原创 2023-01-31 16:47:23 · 949 阅读 · 0 评论 -
Android中级——Bitmap加载和Cache
大图片处理问题示例解决办法问题示例activity_main.xml中有一个Button和ImageView<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http:原创 2022-04-08 00:12:46 · 2147 阅读 · 0 评论