Android
fast-runner
积跬步,至千里
展开
-
应用开发点滴记录
1、将依赖的jar和解码相关API调用逻辑编译成dex文件放到后台,而把R.class打成aar放到本地,在调用功能时设置资源文件dexClassLoader加载fragment的实例,给fragment设置资源文件,再显示。2、创建一个空的notification,拿到布局文件ViewGroup,遍历获取最大字体和最小字体的TextTextView,作为标题和内容的色值。ViewGroup的获取:获取Notification的remoteViews的id,inflate这个id得到根布局ViewGr原创 2021-06-23 16:11:46 · 140 阅读 · 0 评论 -
命令备忘录
1 获取调试日志:输入adb logcat -v time | tee log.txt创建log文件用来保存日志,操作完后ctrl+c停止输入gedit log.txt 打开log文件nautilus . 打开当前的目录windows获取调试日志:adb shell logcat -v threadtime > log.txt2 网络数据tcpdump:adb shell tcpdump -i wlan0 -s 0 -w /data/1.pcap 开始抓包,将抓包内容保存在/data目原创 2021-06-23 16:09:53 · 254 阅读 · 0 评论 -
通过注解结构化代码
原理是反射,获取类的所有方法,匹配调用的方法名字,调用方法。public class CommandExecutor { // 注解声明 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Command { } public class InvocationException extends Exception { priva原创 2021-06-23 15:30:02 · 134 阅读 · 0 评论 -
通过gradle管理项目的一种方式
解决一种需求,主要是解决不同目录结构编译问题:一个工程A下有1,2,3,4四个module,在A下又放了B工程,现在B要依赖module1,不改变当前的目录结构,怎么实现?https://stackoverflow.com/questions/24975745/gradle-dependencies-compile-project-by-relative-pathYou can include an outside root project module using ‘settings.gradle’原创 2021-06-23 15:27:28 · 169 阅读 · 0 评论 -
单例模式总结
双重检验锁public class Singleton { private volatile static Singleton instance; //声明成 volatile private Singleton (){}//private防止被外部类创建实例 public static Singleton getSingleton() { if (instance == null) { s原创 2021-06-23 13:43:10 · 86 阅读 · 0 评论 -
Java内存分配总结
寄存器最快的存储区,数量有限,不能直接控制。堆栈通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配那些内存;若向上移动,则释放那些内存。创建程序时,Java系统必须要知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。仅存放对象的引用,不存放Java对象。堆存放所有的Java对象,不需要知道存储的数据在堆里存活多上时间。当执行创建对象的代码时,会自动在堆里进行存储分配。用堆进行分配和清理可能比用堆栈进行存储分配需要更多的时间。常量存储常量在程序代码内部。非RAM存储原创 2021-06-23 13:33:01 · 116 阅读 · 0 评论 -
Handler使用总结
A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue. Each Handler instance is associated with a single thread and that thread’s message queue. When you create a new Handler, it is bound to the threa原创 2021-06-21 18:23:55 · 202 阅读 · 0 评论 -
根据宽高缩放加载图片
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight){ BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; //加载图片 BitmapFactor原创 2021-06-21 16:14:32 · 198 阅读 · 0 评论 -
引入第三方库引起的android.dex.DexIndexOverflowException
在Android项目中引入过多的jar会出现错误:android.dex.DexIndexOverflowException: Cannot merge new index xxxx into a non-jumbo instruction!这个错误出现的原因是 Android设定的方法数是65536个(DEX 64K problem),超过这个方法数,导致dex无法生成,就无法生成APK.限制原因:早期的Dalvik VM内部使用short类型变量来标识方法的id,就有了 最大方法数的限制65536原创 2021-06-21 16:09:46 · 127 阅读 · 0 评论 -
GreenDAO操作数据库总结
自定升级逻辑GreenDao有做一个DevOpenHelper来处理创建和升级数据库的逻辑,但在升级里的处理是删除table重新创建,导致数据库已存在的用户数据丢失。参考DevOpenHelper的实现自定义DownloadDBHelper,自定义升级逻辑。在android数据库模块,新增的列可以通过alter语句做到,但要删除一列时通过drop却不行。现在是通过整张表的复制实现的,先创建一张和当前的表一样的临时表,数据都在临时表中,将当前的表删除,创建一张新的表(当前我们期望的表),将数据从临时表原创 2021-06-21 15:10:11 · 247 阅读 · 0 评论 -
多进程WebView页面空白问题排查
背景打开网页显示空白,怀疑webview的设置有问题,webview的设置settings,webviewclient,webviewchromeclient实验1 在使用webview实例loadurl的地方,尝试设置一个新创建的webviewclient,实现空的回调,发现可正常打开网页。2 定位到自定义的webviewclient有问题3 排查回调,从onPageStart开始4 定位到onPageStart有问题。排查onPageStart的实现。5 发现跟JS注入有关 夜间模式 和原创 2021-06-21 14:52:16 · 891 阅读 · 0 评论 -
App耗电量分析总结
工具1、官方historian地址:https://developer.android.com/studio/profile/battery-historian-charts.html2、腾讯的GT地址:http://gt.tencent.com/3、腾讯的PowerStat地址:http://gt.tencent.com/4、chrome调试用法:数据线连接手机,在地址栏输入chrome:inspect5、Android Device MonitorAndroid studio的工具原创 2021-06-21 14:42:31 · 1821 阅读 · 0 评论 -
Android native使用gRPC通信的一种实现方式
原文系统:ubuntu 16.04源码下载在github下载gRPC项目,然后更新子模块:git clone https://github.com/grpc/grpc.gitgit submodule update --init安装依赖sudo apt-get install pkg-configsudo apt-get install autoconf automake libtool make g++ unzipsudo apt-get install libgflags-dev li原创 2020-05-09 10:16:46 · 763 阅读 · 0 评论 -
Android App调用NativeService的一种实现方式
Android App调用Native服务的一种实现方式背景Native层运行服务进程,通过协议与remote通信,交换数据。App使用Native服务暴露的接口,发送和接收数据。应用层服务和Native层服务的区别:新的改变...原创 2021-01-05 11:52:00 · 1150 阅读 · 0 评论 -
Http协议基础
Http的缓存机制:根据是重新向服务器发起请求分为强制缓存和对比缓存强制缓存由Expire和Cache-Control控制Expire是响应Header中的一个字段,表示到期时间。请求时间小于到期时间,直接使用缓存;否则需要向服务器重新发起请求。Http1.0中的字段,在Http1.1以后被Cache-Control字段取代。Cache-Control也是响应Header中的一个字段,根据取值具有不同的含义:valuecommentprivate客户端可以缓存pub.原创 2020-12-16 13:16:16 · 191 阅读 · 0 评论 -
ListView
索引:当前可见条目的下标位置:光标上条目的下标定义一个垂直滚动的视图集合,列表中的每个视图紧挨着前一个视图。为了更加流行和高效的展示一个列表,使用RecyclerView。要展示一个列表,可以在布局配置文件引入一个列表view:<ListView * android:id="@+id/list_view" * android:layout_width="match_parent" * android:layout_height="match_parent"原创 2020-11-27 17:34:12 · 95 阅读 · 0 评论 -
SystemUI
SystemUI包含的的component:frameworks/base/packages/SystemUI/res/values/config.xml<string-array name="config_systemUIServiceComponents" translatable="false"> <item>com.android.systemui.Dependency</item> <item>com.androi原创 2020-11-10 10:20:50 · 96 阅读 · 0 评论 -
状态机
定义了一套分层处理消息的状态机,具有按层次排列的状态。State对象必须实现processMessage方法,可以按需实现enter/exit/getName。enter/exit方法可等价于面向对象编码中的构造和销毁,会用做状态的初始化和回收。getName方法返回了状态的名称,方法的默认实现返回的是类的名称。让getName方法返回状态实例的名称可能更满足要求,特别是在一个状态类中有多个状态实例。当一个状态记被创建,addState方法用来建造这个层次,setInitialState方法识别这些状态原创 2020-11-25 14:24:23 · 404 阅读 · 0 评论 -
HashMap
实现了Map接口的Hash表。这个实现提供了所有的Map操作,并且允许null值和null键。HashMap可以粗略的视为HashTable,区别是HashMap是非同步的,并且允许null。这个类不保证Map的排序,特别的,不保证顺序一直保持固定的顺序。这个实现可以为get/put基本操作提供常量时间性能,假设哈希函数把元素在buckets中合理的分散。集合视图的迭代时间与HashMap实例的容量(buckets数量)加上它的大小(key-value数量)成正比,因此,如果迭代的性能很重要就不要初始化设原创 2020-11-26 14:25:37 · 109 阅读 · 0 评论 -
线程
线程JVM允许一个应用有多个线程同时运行线程有优先级,高优先级线程比低优先级线程优先被执行。线程可以标记成daemon。在线程里创建一个新的线程,这个新线程的初始优先级等于创建线程的优先级。当创建线程是daemon线程时,新线程就是daemon线程。JVM启动时,通常有一个非daemon线程,有些地方成为main。JVM不停的执行线程,遇到下面情况之一停止:1 Runtime的exit方法被调用了,并且安全管理允许exit操作发生。2 所有的非daemon线程已经死了,即run执行结束或者在run原创 2020-11-24 14:17:48 · 100 阅读 · 0 评论 -
以MediaServicve为例的Binder
https://www.cnblogs.com/innost/archive/2011/01/09/1931456.html原创 2020-10-23 09:55:24 · 152 阅读 · 0 评论 -
Android App启动时间
1 启动方式cold startupwarm startuphot startup2 cold startup过程system tasks:在后台加载和launch app当后台launch app结束后立刻在前台屏幕上显示出一个空白window后台创建app进程app process tasks:创建app对象launch主线程(UI线程)创建MainActivityinflate views在屏幕上布局在屏幕上绘制绘制完成后,后台使用这个MainActivity替换屏幕上原创 2020-09-10 18:59:54 · 425 阅读 · 0 评论 -
Android Binder设计与实现 - 设计篇
转载 摘要 Binder是Android系统进程间通信(IPC)方式之一。Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,...转载 2020-03-12 17:04:00 · 171 阅读 · 0 评论 -
使用Uid的2个场景案例
参考文章背景在Service组件开发中,对外暴露了aidl接口。为了知道是什么app在请求服务,即Client是谁,就想将Client的package name收集起来。UID含义android中uid用于标识一个应用程序,uid在应用安装时被分配,并且在应用存在于手机上期间,都不会改变。一个应用程序只能有一个uid,多个应用可以使用sharedUserId 方式共享同一个uid,前提是这...原创 2020-03-12 11:24:36 · 645 阅读 · 0 评论 -
Ubuntu18.04编译android9.0实践
欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体...原创 2019-09-21 21:51:20 · 6314 阅读 · 0 评论