- 博客(49)
- 收藏
- 关注
转载 Handler的sendMessage,post和obtainMessage的不同
我们常用Handler来进程线程间通信,但是调用方法有sendMessage,post和obtainMessage三种,这三种到底有什么区别呢?下面就来一一分析下:(一)sendMessage最基本用法public class MainActivity extends AppCompatActivity {private TextView mTextView;private String new_str = "";//实例化Handler,重写回调方法Handler mHandler = ne
2021-11-22 16:37:32
1154
原创 具有系统权限的apk的安装和系统签名
如何获得系统权限(1)源码环境下在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行使用mm编译(2)Android Studio环境下在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.
2021-11-08 10:10:35
1814
转载 简单理解Android Studio中的gradle文件
在一个Android Studio项目中有三个gradle相关文件需要注意:项目根目录下的build.gradle根目录下的settings.gradle子文件夹下的build.gradleAndroid Studio的Project其实是一个工作文件夹,而不仅仅供一个APP开发,相反可以在其中创建多个互不相关的APP, 表达上用module指代APP。其中根目录下的build.gradle是整个Project的共有属性;settings.gradle文件是描述此g
2021-11-01 17:30:47
1654
原创 广播静态注册和动态注册的区别
动态注册广播:不是常驻型广播,它跟随 Activity 的生命周期。需要在 Activity 结束前,移除广播接收器。静态注册广播:常驻型广播,当应用程序关闭后,如果有广播过来,程序也会被系统调用自动运行。有序广播:优先级高的先接收(不管静态或者动态)。同优先级的广播接收器,动态优先于静态。同优先级的同类广播接收器:静态:先扫描的优先于后扫描的;动态:先注册的优先于后注册的。...
2021-10-12 15:09:57
1027
转载 Android之startService()和bindService()区别
1. 生命周期:执行startService时,Service会经历onCreate->onStartCommand。当执行stopService时,直接调用onDestroy方法。调用者如果没有stopService,Service会一直在后台运行,下次调用者再起来仍然可以stopService。执行bindService时,Service会经历onCreate->onBind。这个时候调用者和Service绑定在一起。调用者调用unbindService方法或者调用者Context不存.
2021-10-12 15:03:25
451
1
转载 简述TCP的三次握手和四次挥手过程
①TCP是一种精致的,可靠的字节流协议。②在TCP编程中,三路握手一般由客户端(Client)调用Connent函数发起。③TCP3次握手后数据收发通道即打开(即建立了连接)。④简述三路握手过程:(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1.
2021-09-17 15:02:47
332
转载 http 与 https
http 与 https 的区别?https 是如何工作的?http 是超文本传输协议,而 https 可以简单理解为安全的 http 协议。https 通过在 http 协议下添加了一层 ssl 协议对数据进行加密从而保证了安全。https 的作用主要有两点:建立安全的信息传输通道,保证数据传输安全;确认网站的真实性。http 与 https 的区别主要如下:https 需要到 CA 申请证书,很少免费,因而需要一定的费用http 是明文传输,安全性低;而 https 在 http 的基础上通过
2021-09-17 11:55:48
203
转载 Exception 和 Error的区别
Exception 和 Error 都继承于 Throwable,在 Java 中,只有 Throwable 类型的对象才能被 throw 或者 catch,它是异常处理机制的基本组成类型.Exception 和 Error 体现了 Java 对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应的处理。Error 是指在正常情况下,不大可能出现的情况,绝大部分 Error 都会使程序处于非正常、不可恢复的状态。既然是非正常,所以不便于也不需要捕获.
2021-09-17 11:41:53
66
转载 Java中引用类型的区别,具体的使用场景
Java中引用类型分为四类:强引用、软引用、弱引用、虚引用。强引用: 强引用指的是通过 new 对象创建的引用,垃圾回收器即使是内存不足也不会回收强引用指向的对象。软引用: 软引用是通过 SoftRefrence 实现的,它的生命周期比强引用短,在内存不足,抛出 OOM 之前,垃圾回收器会回收软引用引用的对象。软引用常见的使用场景是存储一些内存敏感的缓存,当内存不足时会被回收。弱引用: 弱引用是通过 WeakRefrence 实现的,它的生命周期比软引用还短,GC 只要扫描到弱引用的对象就会回收。弱
2021-09-17 11:11:17
168
转载 final、finally、finalize区别
final 可以修饰类、变量和方法。修饰类代表这个类不可被继承。修饰变量代表此变量不可被改变。修饰方法表示此方法不可被重写 (override)。finally 是保证重点代码一定会执行的一种机制。通常是使用 try-finally 或者 try-catch-finally 来进行文件流的关闭等操作。finalize 是 Object 类中的一个方法,它的设计目的是保证对象在垃圾收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在 JDK 9已经被标记为 deprecated。.
2021-09-17 11:06:53
73
转载 HashMap底层实现原理解析
一:HashMap底层实现原理解析我们常见的有数据结构有三种结构:1、数组结构 2、链表结构 3、哈希表结构 下面我们来看看各自的数据结构的特点:1、数组结构: 存储区间连续、内存占用严重、空间复杂度大优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)缺点:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。2、链表结构:存储区间离散、占用内存宽松、空间复杂度小优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活
2021-09-16 11:34:32
151
转载 数据结构之哈希(hash)表
1.哈希表的定义这里先说一下哈希(hash)表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方,说起来可能感觉有点复杂,我想我举个例子你就会明白了,最典型的的例子就是字典,大家估计小学的时候也用过不少新华字典吧,如果我想要获取“按”字详细信息,我肯定会去根据拼音an去查找 拼音索引(当然也可以是偏旁索引),我们首先去查an在字典的位置,查了一下得到“安”,结果如下。这过程就是键码映射,在公式里面,就是通过key去查找f(key)。其中,按就是关键字(ke
2021-09-15 14:29:38
160
转载 java中常用的几个集合类
//包含Collection(集合),List,Set,Map(图),以及其Iterator,Comparator ,Cloneable,还有常用的具体实现类//List<List<String>>集合的嵌套使用//1、是否允许空//2、是否允许重复数据//3、是否有序,有序的意思是读取数据的顺序和存放数据的顺序是否一致//4、是否线程安全JAVA SE 8官方文档JAVA官方文档中集合类的关系目录概览瞎说几句对第一张图(集合类的关系)的解析具体的几个集合类(Li
2021-09-14 14:54:24
742
转载 类加载以及双亲委派模型
类加载过程Java 中类加载分为 3 个步骤:加载、链接、初始化。加载。 加载是将字节码数据从不同的数据源读取到JVM内存,并映射为 JVM 认可的数据结构,也就是 Class 对象的过程。数据源可以是Jar 文件、Class 文件等等。如果数据的格式并不是 ClassFile 的结构,则会报 ClassFormatError。链接。 链接是类加载的核心部分,这一步分为 3 个步骤:验证、准备、解析。 验证。验证是保证JVM安全的重要步骤。JVM需要校验字节信息是否符合规范,避免恶意信息和不规范
2021-09-13 15:25:02
89
转载 Android的APK包里的文件类型都是什么?
Android的程序文件为APK格式,APK文件是Android最终的运行程序,是Android Package的全称,类似于Symbian操作系统中sis文件,J2ME平台的JAR文件,APK文件其实ZIP文件格式,但后缀名被修改为APK,通过RAR解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java的字节码而是Dalvik字节码。一个APK文件结构为:res/
2021-08-21 22:59:19
1256
转载 eclipse+ADT 进行android应用签名详解
1.Eclipse工程中右键工程,弹出选项中选择 android工具-生成签名应用包:2.选择需要打包的android项目工程:3.如果已有私钥文件,选择私钥文件 输入密码,如果没有私钥文件见 第6和7步创建私钥文件:4.输入私钥别名和密码:5.选择APK存储的位置,并完成设置 开始生成:6.没有私钥文件的情况,创建私钥文件:7.输入私钥文件所需信息,并创建:...
2021-08-21 22:41:28
149
转载 android assets文件夹浅谈
assets英文单词的表面意思是资产、资源,顾名思义,这个文件夹下放的肯定是一些资源文件,而且 assets 文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像 xml, java 文件被预编译,可以存放一些图片,html,js, css 等文件。assets文件夹下的文件不会被映射到R.java中,访问的时候要用到AssetManager类。可以通过以下方式获取输入流来进行写操作:AssetManager am = null;am = getAssets(); InputStre
2021-08-21 22:34:44
1849
转载 APK编译流程-详解AAPT
aapt2aapt2(Android Asset Packageping Tool)是用来 编译和打包 app资源文件的构建工具。aapt2 解析、索引并将资源编译成适合Android 平台的二进制格式.aap2将资源文件的编译分为2个步骤:编译阶段:解析资源文件并生成扩展名为.flat的中间二进制文件链接阶段:将编译阶段生成的所有中间文件(资源表、二进制XML文件和处理过的PNG文件)合并到一个APK中,此外在此资源还可以生成其他辅助文件,如R.java文件和ProGurad规则文件。 此时生
2021-08-20 22:56:12
1069
转载 Android编译,打包、签名详细教程
1.Android程序编译、打包、签名、发布的三种方式:方式一:命令行手动编译打包方式二:使用ant自动编译打包方式三:使用eclipse+ADT编译打包2.Android编译、打包的步骤:2.1第一步 生成R.java类文件:Eclipse中会自动生成R.java,ant和命令行使用android SDK提供的aapt.ext程序生成R.java。2.2第二步 将.aidl文件生成.java类文件:Eclipse中自动生成,ant和命令行使用android SDK提供的aidl.exe生成
2021-08-18 23:06:14
793
转载 Android程序apk编译、打包、签名之Eclipse+ADT
1.Eclipse下打包unsigned apk在Eclipse,选中对应的Project,右击选择Android Tools——Export unsigned application package2. Eclipse下打包signed apk在Eclipse,选中对应的Project,右击选择Android Tools——Export signed application packageNext选择已有的签名文件keystore,注意要知道密码;如果没有keystore,在练习中可以自己
2021-08-08 22:56:45
362
转载 多线程问答
Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?答:sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第66题中的线程状态转换图)。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的not
2021-08-05 16:58:42
116
转载 Thread Join()的用法
join()的使用场景在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程将可能早于子线程结束。如果主线程需要知道子线程的执行结果时,就需要等待子线程执行结束了。主线程可以sleep(xx),但这样的xx时间不好确定,因为子线程的执行时间不确定,join()方法比较合适这个场景。join()方法:join()是Thread类的一个方法。根据jdk文档的定义:public final void join()throws InterruptedException: Waits
2021-08-04 22:45:06
310
转载 Java中Synchronized的用法(简单介绍)
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;修饰一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象。...
2021-08-02 23:08:20
195
转载 android方法调用获取上下文_多线程的上下文切换
双十一前的一个多月,所有的电商相关的系统都在进行压测,不断的优化系统,我们的电商ERP系统也进行了一个多月的压测和优化的过程,在这其中,我们发现了大量的超时报警,通过工具分析,我们发现是cs指标很高,然后分析日志,我们发现有大量wait()相关的Exception,这个时候我们怀疑是在多线程并发处理的时候,出现了大量的线程处理不及时导致的这些问题,后来我们通过减小线程池最大线程数,再进行压测发现系统的性能有了不小的提升。我们都知道,在并发编程中,并不是线程越多就效率越高,线程数太少可能导致资源不能充分利用
2021-07-26 22:54:41
369
转载 Android 线程优先级设置方法
对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题,比如很多无关紧要的线程会占用大量的CPU时间,Android线程优先级设置方法。对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题,比如很多无关紧要的线程会占用大量的CPU时间,虽然通过了 MultiThread来解决慢速I/O但是合理分配优先级对于并发编程来说十分重要.Android在线程方面主要使用的是Java本身的Thread 类,我们可以在Thread或Runnable接口中的run方法首句加入
2021-07-26 22:23:32
1251
转载 守护线程和用户线程的区别
如果JVM中所有的线程都是守护线程,那么JVM就会退出,进而守护线程也会退出。如果JVM中还存在用户线程,那么JVM就会一直存活,不会退出。由此可以得到:守护线程是依赖于用户线程,用户线程退出了,守护线程也就会退出,典型的守护线程如垃圾回收线程。用户线程是独立存在的,不会因为其他用户线程退出而退出。默认情况下启动的线程是用户线程,通过setDaemon(true)将线程设置成守护线程,这个函数务必在线程启动前进行调用,否则会报java.lang.IllegalThreadStateExceptio
2021-07-26 22:16:50
239
转载 onAttachedToWindow()在整个Activity生命周期的位置及使用
一、onAttachedToWindow在Activity生命周期中的位置根据之前分析API的套路,看onAttachedToWindow在Android文档中怎样介绍。首先看Window.Callback中关于onAttachedToWindow的介绍。public abstract void onAttachedToWindow ()Called when the window has been attached to the window manager. See View.onAttache
2021-06-11 09:39:16
732
转载 Android开发之DrawerLayout实现抽屉效果
谷歌官方推出了一种侧滑菜单的实现方式(抽屉效果),即 DrawerLayout,这个类是在Support Library里的,需要加上android-support-v4.jar这个包。使用注意点1、DrawerLayout的第一个子元素必须是默认内容,即抽屉没有打开时显示的布局(如FrameLayout),后面紧跟的子元素是抽屉内容,即抽屉布局(如ListView)。2、抽屉菜单的摆放和布局通过android:layout_gravity属性来控制,可选值为left、right或start、end。
2021-06-10 10:28:55
1443
转载 Android中关于矩阵(Matrix)前乘后乘的一些认识
在Android中,scale(缩放),rotation(旋转)和 translation(平移)都是以矩阵(Matrix)的形式定义的,实际上在图形学中,这些平面图形的变换都是以矩阵的形式存在的。先来回顾一下,下面,左中右分别scale(缩放),rotation(旋转)和 translation(平移)在Android中的矩阵表示:如果只是单纯的应用某一个变换,我们都知道直接用矩阵去乘上对应的点就可以了。但是对于缩放和旋转来说,它们的轴点是基于原点(0,0)的,如下图,我们将它缩小1倍,代码如下:
2021-06-09 16:21:45
632
1
转载 view.post原理
前言在Android里,获取View宽高的时机是个老生常谈的话题了。众所周知,在Oncreate里直接调用View.getWidth或者View.getMeasuredWidth返回都是0。所以获取宽高时机很重要,对于这个问题的解决方法概括起来有四种之多,具体可以看看任玉刚老师的《Android开发艺术探索》中的View章节或者网上也有非常丰富的资料。而本文主要讨论的是其中的一个解决方法。View.post()获取View宽高这个方法相信大家都很熟悉了,就是这样: @Override
2021-06-09 11:15:56
338
转载 apk安装流程
android系统启动之后调用PackageManagerService服务并解析系统特定目录,解析apk文件并安装的过程,这个安装过程实际上是没有图形界面的,底层调用的是我们平时比较熟悉的adb命令,那么我们平时安装apk文件的时候大部分是都过图形界面安装的,那么这种方式安装apk具体的流程是怎样的呢?本文我们就来具体看一下apk的具体安装过程,通过本文的学习希望帮助大家大概的了解到Android系统安装Apk文件的基本流程。相信大家都知道如果我们想在代码里执行apk的安装,那么一般都是这样:Int
2021-05-27 18:18:41
10325
转载 Launcher启动流程
Launcher程序就是我们平时看到的桌面程序,它其实也是一个android应用程序,只不过这个应用程序是系统默认第一个启动的应用程序,这里我们就简单的分析一下Launcher应用的启动流程。在SystemServer进程的启动过程中会调用其main静态方法,开始执行整个SystemServer的启动流程,在其中通过调用三个内部方法分别启动boot service、core service和other service。在调用startOtherService方法中就会通过调用mActivityManage
2021-05-26 18:23:17
916
转载 Looper和Handler使用
一、认识Looper和Handler对象当主线程诞生时,就会去执行一个消息循环(Message Loop),以便持续监视它的消息队列(Message Queue简称MQ)。当UI事件发生了,通常会立即丢一个Message给MQ,此时主线程就立即从MQ里边取出该消息并处理。比如,用户在UI界面上按下一个Button按钮时,UI事件发生了,就会丢一些消息到MQ里,其中包括onClick消息,于是,主线程会及时从MQ取出onClick消息,然后调用Activity的onClick()函数去处理。处理完毕后,主线
2021-05-23 21:20:50
323
转载 Android Looper和Handler分析
Android应用程序是通过消息来驱动的,每个应用程序都有一个Main looper在ActivityThread中创建。我们这一节中就主要来分析下Looper和Handler的实现机制,首先来简单介绍一下它们的关系:Thread、Looper、MessageQueue、Handler的关系Thread线程是整个Looper循环执行的场所Looper消息泵,不断的从MessageQueue中读取消息并执行,Looper就是一个无限循环,Looper中包含MessageQueueMessageQue
2021-05-22 22:40:57
181
转载 Java中static变量作用和用法详解
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不
2021-05-21 22:15:46
516
转载 taskAffinity属性简介
注意点:1、必须和FLAG_ACTIVITY_NEW_TASK结合使用,否则不起作用2、属性值是一个字符串,只要满足包名的命名就可以,eg:“abcdfs.”, “dfsfe.fasdf.dfsf”,但是直接用一个字符串不带“.”这个符号,则无法安装,会报错Installation failed with message INSTALL_FAILED_USER_RESTRICTED: Invalid apk.使用:1、intent添加FLAG_ACTIVITY_NEW_TASK标志:同一应用
2021-05-19 14:44:27
193
转载 Activity的启动模式
面试的时候,面试官经常同你随便侃侃Activity的启动模式,但Activity启动牵扯的知识点其实很多,并非能单单用四个启动模式就能概括的,默认的启动模式的表现会随着Intent Flag的设置而改变,因此侃Activity启动模式大多走流程装逼,最多结合项目遇到的问题,随便刁难一下面试者,并不太容易把控,也许最后,面试官跟面试者的答案都是错了,比如在Service中必须通过设置FLAG_ACTIVITY_NEW_TASK才能启动Activity,这个时候启动Activity会有什么样的表现呢?就这一个问
2021-05-19 10:52:05
288
转载 (Android 9.0)Activity启动流程源码分析
相关类简介Instrumentation用于实现应用程序测试代码的基类。当在打开仪器的情况下运行时,这个类将在任何应用程序代码之前为您实例化,允许您监视系统与应用程序的所有交互。可以通过AndroidManifest.xml的标签描述该类的实现。ActivityManager该类提供与Activity、Service和Process相关的信息以及交互方法, 可以被看作是ActivityManagerService的辅助类。ActivityManagerServiceAndroid中最
2021-05-17 22:07:31
212
转载 JVM 及 类加载机制
java 内存分区JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。程序计数器(Program Counter Register)一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的字节码指令,分支、跳转、循环等基础功能都要依赖它来实现。每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的。当线程在执行一个Java方法时,该计数器记录的是正在执
2021-05-14 10:13:39
62
转载 反射机制
知识点:1、反射的概念;2、反射API介绍;3、反射在Android的使用实例;Android开发中,我们也许用到的反射并不常见,或者说几乎没有用到,因为我们都是被一般的面向对象思想所困住了:你要使用一个类的方法和属性,直接new一个类的对象出来,然后利用对象去调用类中的方法和属性,这其中我们只能调用public和protect修饰的方法和属性,对于private修饰的我们并没有权限去调用。在Android的sdk中,我们进到源码去看,看到有些方法是被@hide修饰符修饰的,这些方法是Google
2021-05-13 18:46:30
109
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人