自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 资源 (1)
  • 收藏
  • 关注

原创 android-aidl4

在使用service中进行AIDL交互时候,如果服务端或者客户端意外停止,会抛出异常android.os.DeadObjectException , 这时候我们就需要双向监听服务端和客户端的异常停止,并重新绑定服务。

2024-06-21 17:07:53 686

转载 android-装饰者模式-context

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

2024-06-18 15:52:40 7

转载 android-aidl3

AIDL默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,但是除了这些类型之外的数据类型,在使用之前必须导包,就算目标文件与当前正在编写的 .aidl 文件在同一个包下——在 Java 中,这种情况是不需要导包的。其实所谓的“服务端”和”客户端”在Binder通讯中是相对的,因为我们在客户端项目中拷贝了aidl文件,所以我们客户端项目其实不仅可以发送消息,充当”Client”,同时我们也可以收到服务端项目推送的消息,从而升级为”Server”,这个功能依赖于AIDL的Stub和Proxy……

2024-06-13 14:51:38 11

原创 android-线程池3

LogUtil.d("serverSocket=" + serverSocket + ",inetSocketAddress=" + inetSocketAddress+"开始等待客户端接入");Executors.defaultThreadFactory(), (r, executor) -> LogUtil.e(r.toString() + "执行了拒绝策略"));* 核心线程数:可以根据Runtime.getRuntime().availableProcessors()* 子线程委托的执行方法。

2024-06-06 14:37:15 551

原创 android-线程池1

本节我们主要对前五个参数中的corePoolSize,maximumPoolSize及workQueue是如何配合使用做出说明(keepAliveTime,unit主要对空闲线程的存活时间做的定义,见名知意,不再做出说明),以此来引出线程池的一些特性。从实验结果上可以看出,当执行任务1的线程(thread-1)执行完成之后,任务2并没有去复用thread-1而是新建线程(thread-2)去执行任务。当任务5加入时,队列达到上限,池内运行的线程数达到最大,故执行默认的拒绝策略,抛异常。

2024-06-06 14:34:47 690

转载 android-线程池2

为什么只有一个坑位呢,因为这个公厕是收费的,收费的大爷上年纪了,只能管理一个坑位,多了就管不过来了(线程同步问题)。(1)CachedThreadPool只有非核心线程,最大线程数非常大,所有线程都活动时,会为新任务创建新线程,否则利用空闲线程(60s空闲时间,过了就会被回收,所以线程池中有0个线程的可能)处理任务。(1)从配置参数来看,FixThreadPool只有核心线程,并且数量固定的,也不会被回收,所有线程都活动时,因为队列没有限制大小,新任务会等待执行。因此不需要处理线程同步的问题。

2024-06-06 13:39:25 13

原创 android-jni2

/找到对应的java文件。下面才是navite的方法,上面的是NativeAction的普通方法,上面的代码是在调用c++在调用java的方法。LOGE("开始=======================:%d", "begin");LogUtil.e("调用输出======,printAction");

2024-06-04 17:33:10 468

原创 android-JNI

可以看到MainActivity里首先加载了我们在CMakeLists里定义的动态库 ,然后声明了一个native的方法stringFromJNI(),这个方法在onCreate里被调用。不同的应用程序如果调用相同的库,那么在内存中只需要有一份该共享库的实例,避免了空间浪费问题。同时也解决了静态库对程序的更新的依赖,用户只需更新动态库即可。2.动态加载库: 当需要的时候再使用 dlopen 等通过代码或者命令的方式来加载 (在程序启动之后)①静态库对函数库的链接是在编译期完成的。(因此动态库也称为共享库)

2024-06-04 15:22:57 740

转载 Android之Application和Activity的Context区别

attachBaseContext()方法其实是由系统来调用的,它会把ContextImpl对象作为参数传递到attachBaseContext()方法当中,从而赋值给mBase对象,之后ContextWrapper中的所有方法其实都是通过这种委托的机制交由ContextImpl去具体实现的,所以说ContextImpl是上下文功能的实现类是非常准确的。Activity.this的context是属于当前Activity的,当前Activity摧毁的时候,它就摧毁。

2024-06-03 14:36:31 15

转载 AndroidManifest.xml中android:name

在Android中,有一个名为Application的类,我们可以在Activity中使用getApplication()这个类,方法来获得,它是代表我们的应用程序的类,使用它可以获得当前应用的主题,资源文件中的内容等,这个类更灵活的一个特性就是可以被我们继承,来添加我们自己的全局属性。android:name属性——是用来设置所有activity属于哪个application的,是用来app启动时来关联一个application的,默认关联的是android.app.Application。

2024-06-03 14:35:51 19

原创 android-handler-3

这里丢的是主线程的looper,参考handler-2的HandlerThread,把mHandlerThread的loop丢进去,就是在子线程中运行了。当然刚才提到的作用只是对应于主线程中的 sMainLooper 了,其实各种 Looper 都可以往 Handler 的构造方法这里扔,从而使得 handleMessage 运行在你想要的线程中,进而实现线程间通信。在此注意构造函数中第一个参数是 Looper 就可以了,那么也就是说,我们可以传递一个已有的 Looper 来创建 Handler。

2024-05-30 17:27:39 218

原创 android-handlerThread

多次点击按钮mBtnHandlerThread,然后点击mBtnInnerClass,mTxtShowTest显示"点击了mBtnInnerClass",10s后mTxtShowTest显示"来自于mHandlerInHandlerThread的请求更新",之后再点击mBtnInnerClass,mTxtShowTest显示"点击了mBtnInnerClass",10s后又会mTxtShowTest显示"来自于mHandlerInHandlerThread的请求更新",即可证明前面注意中说明的问题。

2024-05-30 14:18:03 851

转载 android-handler-2

next()方法开启一个死循环,首先调用nativePollOnce()方法,来判断是否需要进行阻塞操作,当没有消息需要处理、或者还没到消息的处理时间时,则进行休眠操作。Looper中的loop()方法开启死循环,会不断的从消息队列中取出消息(通过调用MessageQueue.next()方法取出消息),然后调用目标Handler(即发送该消息的Handler)的 dispatchMessage()方法分发消息,目标Handler收到消息,调用 handleMessage()方法,接收消息,处理消息。

2024-05-30 13:31:09 13

原创 android-handler

做 Android 开发肯定离不开跟 Handler 打交道,它通常被我们用来做主线程与子线程之间的通信工具,而 Handler 作为 Android 中消息机制的重要一员也确实给我们的开发带来了极大的便利。可以说只要有异步线程与主线程通信的地方就一定会有 Handler。Handler 简单易用的背后藏着工程师大量的智慧,要努力向他们学习。希望看完本文能加深你对 Handler 的理解,对接下来学习有所帮助。作者:kevenZheng。

2024-05-29 15:37:59 951 1

原创 android-mvp模式

从图中就可以看出,最明显的差别就是view层和model层不再相互可知,完全的解耦,取而代之的presenter层充当了桥梁的作用,用于操作view层发出的事件传递到presenter层中,presenter层去操作model层,并且将数据返回给view层,整个过程中view层和model层完全没有联系。可以看到model层只负责数据的获取和解析成对应的数model,这个和MVC的Model层一致,成为一个独立的单元,其他层不需要关心它是如何实现,达到解耦的目的。//获得Model层返回的列表数据。

2024-05-27 13:26:04 650

转载 android-databing

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。所以有了dataBinding我们极大的减轻了Activity所要做的操作,Activity可以更专注于对数据与逻辑的处理,而UI的获取与数据和UI的绑定都交给了布局文件。然后打印日志查看运行效果。

2024-05-27 10:09:38 12

转载 android进阶-java反射

一个类中有属性,方法,构造器等,比如说 有一个Person类,一个Order类,一个Book类,这些都是不同的类,现在需要一个类,用来描述类,这就是 Class,它应该有类名,属性,方法,构造器等。②先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。Method getDeclaredMethod(String name, Class[] params) 使用特写的参数类型,获得类声明的命名的方法。

2024-05-21 16:45:16 10

原创 android设计模式-代理模式

分为静态代理和动态代理,静态代理就是自己写相应的代理类和实现,动态代理就是用JDK自带的机制,jdk会在运行中动态的生成代理类;在例子中具体买房等方法理解成子类中介怎么去做,可以有很多的中介。而真正的代理类更像是如链家那个房子。去指派哪些人,分配哪些人去完成工作。其实用的依旧是java中最常见的继承、多态的关系。

2024-05-20 11:18:14 371

原创 android设计模式-工厂模式

(1)一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;//---------------------之前没变的代码区域end---------------------////----------------工厂类和工厂接口换个角度设计(彻底改头换脸)----------------////---------------------之前没变的代码区域---------------------//

2024-05-16 20:33:12 574

原创 android设计模式-原型设计(深、浅拷贝)

原形模式是一种创建型模式,原形模式多用于创建复杂对象或者构造耗时的实例。它的作用主要是"克隆",用户从原形对象复制出一个内部属性一样的对象。因为类的初始化需要耗费很多的资源,原形拷贝则可以更高效。最后,原形模式其实就是对象的拷贝,这跟C++/Object-C中的clone类似,容易出问题的也就在深浅拷贝上,使用原形模式可以解决复杂对象构建资源消耗的问题。也可以用来只读保护。注意其clone时不会走构造函数。作者:Yink_Liu。

2024-05-15 17:23:42 551

原创 android设计模式-观察者模式

也就是平时的按键监控其实不仅是接口的调用和回调,也是个观察者模式//平常里的按钮事件监听例子//注册观察者//观察者实现@Override//这里可以知道要观察的对象的一举一动...});//拆分后buttonA ---->要观察的对象//要观察谁谁谁setOnClickListener() ---->观察者new OnClickListener() ---->观察者的实现//在实现里可以知道要观察的对象的一举一动。

2024-05-15 14:56:11 903

原创 android设计模式-builder模式

/返回的Builder对象,通过第一个返回的Build对象,能够去调用setX2.通过第二个返回的Builder去调用build(),build方法返回A的对象,并在启动也传入了builder对象。属性多的时候,使用set,get第二种方式,是解决了上面的问题,但是会让调用set方法的对象重复了20次或更多,同时也属于不连续的情况,该类的其他属性在被创建之后被修改,给程序带来了一些不安全性,像下面”商品.setX1("修改后的属性");商品.setX1("");商品.setX2("");

2024-05-15 10:23:35 277

原创 android设计模式-单例模式

防止编译器优化:编译器在优化代码时会尝试将变量的访问操作优化为更高效的方式,例如将变量的值缓存在寄存器中。然而,对于某些特殊的变量,如多线程环境下的共享变量、中断处理中的标志位、硬件寄存器等,这种优化可能会导致意外的行为。多用于整个程序只需要有一个实例,通常很消耗资源的类,比如线程池,缓存,网络请求,IO操作,访问数据库等。处理多线程共享变量:在多线程编程中,当一个变量被多个线程共享并且可能被一个线程修改时,需要使用 volatile 关键字来确保线程之间的可见性。确保一个类只有一个实例,并且自行实例化。

2024-05-14 15:42:21 476

原创 android进阶-回调

requestPermissions方法用于请求权限,而onRequestPermissionsResult回调方法用于接收权限请求的结果,并据此执行相应的操作。只是少了一个doWork,个人怀疑是在其他的地方,处理复杂的触摸、点击等操作,然后处理完后发生点击,回调回Onclick方法中,然后就能处理其他事情了。网络请求回调:在进行网络请求时(如使用 Retrofit、OkHttp),回调用于处理请求成功或失败后的操作。当接收到广播时,onReceive方法会被回调,允许开发者在此方法中执行相应的操作。

2024-05-13 17:24:50 926

原创 android进阶-AIDL

在实现AIDL的过程中服务端APP和客户端APP中要包含结构完全相同的AIDL接口文件,包括AIDL接口所在的包名及包路径要完全一样,否则就会报错,这是因为客户端需要反序列化服务端中所有和AIDL相关的类,如果类的完整路径不一致就无法反序列化成功。Android SDK 工具会自动生成基于该 .aidl 文件的 IBinder 接口,具体的业务对象实现这个接口,这个具体的业务对象也是 IBinder 对象,当绑定服务的时候会根据实际情况返回具体的通信对象(本地还是代理)"还书成功" : "还书失败");

2024-05-10 18:45:39 923

原创 android进阶-Binder

ServiceManager进程:ServiceManager的作用是将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用。Binder驱动:驱动负责进程之间Binder通信的建立,Binder在进程之间的传递,Binder引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。原文链接:https://blog.csdn.net/ly0724ok/article/details/117566381/

2024-05-10 14:32:50 498

原创 android基础-服务

oncreate是服务第一次启动调用,onStartCommand是服务每次启动的时候调用,也就是说服务只要启动后就不会调用oncreate方法了。可以在myservice中的任何位置调用stopself方法让服务停止下来。同样使用intent来传递服务。

2024-05-08 18:41:21 364

原创 android基础-多线程

创建子线程,子线程不允许直接更新UI,试想下如果多个线程去更新UI,则会造成资源错乱,如果枷锁就会使得代码冗余复杂。doInBackground是在子线程中。另一种异步多线程方法。

2024-05-08 17:25:10 290

原创 android基础-通知

notificationcompat.builder后面可以跟很多的方法,不同方法不同效果,比如加一个音频.setSound(uri)使用PendingIntent来实现点击通知跳转到另一个活动。基于第一行android。

2024-05-08 16:51:53 87

原创 SQL手册

转:http://blog.csdn.net/web_gus/article/details/132122Select用途:从指定表中取出指定的列的数据语法:SELECT column_name(s) FROM table_name解释:从数据库中选取资料列,并允许从一或多个资料表中,选取一或多个资料列或资料行。SELECT

2024-05-08 15:56:09 1058 1

原创 android基础-ContentProvider

权限:普通权限可以直接在xml中直接申请即可(之前安卓安装过程中一列的权限需求表),如果是危险权限,主要就是和隐私相关的。则需要动态的去申请(就是android之前的那种弹框)。相比于前面的持久化存储,持久化存储只能是在自身程序去使用各类数据,从它的存储路径就能够看出/data/xxxpackages/filexxx/xxx,ContentProvider主要用于不同的应用程序之间实现数据共享的功能。

2024-04-26 17:36:45 105

原创 android基础-数据持久化

save方法是从DataSupport来,更多查询删除新增百度下,这个开源库很好用。2.SharedPreferences,使用键值对的方式存储数据。Book类是写的各种getid()name 等方法。3.sqlite数据库存储,使用的时候直接百度下。1.数据存储在文件中,使用流的方式。还可以使用LitePal开源库。基于第一行代码-安卓。

2024-04-26 17:14:28 125 1

原创 android基础-广播

基于第一行代码-安卓。

2024-04-26 14:01:08 84

原创 android基础-fragment(碎片)

2024-04-26 10:16:14 76 1

原创 android基础-UI

基于第一行代码-安卓。

2024-04-25 15:34:41 89 1

原创 android基础-activity

onPause 如弹框,前一个activity已经失去了焦点,后一个弹框获取了焦点,前一个失去了与用户的交互。

2024-04-10 14:29:36 189

原创 4.8-2 类图

2024-04-08 15:40:30 71

原创 4.8-1 java基础

重写:就是父子类集成的时候,子类使用和父类相同的函数或者成员变量,将会使用子类的各类成员变量或者函数,隐藏父类的。因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将。当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。这个时候需要进行向下的类型转换,将父类引用转换为子类的引用。用父类引用调用父类不存在的方法。

2024-04-08 15:37:29 404

原创 InputManager 简介

1.1. 模块按照进程空间,我大概把整个事件输入系统分为三个部分:kernel 收集事件上报,InputManager 读取事件并分发, InputQueue 接收事件。之间进程通信用的读写设备文件,以及共享内存等。1.2. 类关系本文主要介绍 InputManager 相关,其他模块不做过多讨论。InputManager 相关的主要类关系图:WindowManager 往上的还没有去看,先写写 c++ 层的部分。整个 InputManager 是通过 NativeI

2021-07-08 10:59:01 1140

原创 Android如何定制主题

目的:为了加强用户体验,增强品牌效应,使我们的产品有自己独特的风格,主题的定制将会是必然趋势……然而Android原生系统是不支持主题定制的,所以如何来定制主题,如何做得更好,需要大家集思广益……策略:将介绍两种定制主题的机制:1.根据Android Configuration Qualifier机制,加入我们自己的JRDTheme定制。2.用主题包的形式,根据用户选择不同的主题,而加载不同主题包中的资源。基本原理:首先介绍方式一:Android Configuration Qualifi

2021-07-06 15:03:13 485

platform-tools_adb.zip

adb 版本为1.0.4.0 linux ,直接使用,放在linux的环境变量中就可以了

2019-12-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除