自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(115)
  • 收藏
  • 关注

原创 Typora使用技巧

Typora支持1~6级标题,使用的方式有两种,分别是标记语言的方式和快捷键的方式:标记语言:# 这是1级标题## 这是2级标题### 这是3级标题#### 这是4级标题##### 这是5级标题###### 这是6级标题格式:[井号][空格][字符] //一个井号代表一个级别的标题,井号和字符之间必须有一个空格,最后回车即可快捷键:Ctrl + 1 这是1级标题Ctrl + 2 这是2级标题Ctrl + 3 这是3级标题Ctrl + 4 这是4级标题Ctrl + 5 这是5级

2021-05-10 17:11:07 496 1

原创 Retrofit基本使用

1.Retrofit基本使用首先来了解下Retrofit是什么,在官网中对于Retrofit的描述是这样的:A type-safe HTTP client for Android and Java.适用于Android和Java的类型安全的HTTP客户端。可以理解成一个封装好的网络请求库。接下来学习一下Retrofit的基本使用方法:在app根目录的build.gradle文件中加入依赖:compile 'com.squareup.retrofit2:retrofit:2.3.0'

2021-05-10 17:04:27 576

原创 mvvm模式

一、前言MVP 中我们说过随着业务逻辑的增加,UI 的改变多的情况下,会有非常多的跟 UI 相关的 case,这样就会造成 View 的接口会很庞大。而 MVVM 就解决了这个问题,通过双向绑定的机制实现数据和 UI 内容,只要想改其中一方,另一方都能够及时更新的一种设计理念,这样就省去了在 View 层中写很多 case 的情况,只需要改变数据就行。二、MVVM详解2.1、MVVM 设计图:一般情况下就这两种情况,这看起来跟 MVP 好像没啥差别,其实区别还是挺大的。在 MVP 中 Vi

2021-05-10 17:03:12 190

原创 ObservableField和MutableLiveData

ObservableField和MutableLiveDatapublic ObservableField<String> domainName = new ObservableField<>("");public MutableLiveData<Boolean> isShowDialog = new MutableLiveData();作用两个都是定义一个观察者变量,以便达到更新数据的作用。区别ObservableField一般是和布局文件x

2021-05-10 17:02:25 1491

原创 Android Retrofit详解

前言Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装使用步骤1.添加Retrofit库的依赖:implementation 'com.squareup.retrofit2:retrofit:2.0.2' implementation 'com.squareup.retrofit2:converter-gson:2.0.2' implementation 'com.google.

2021-05-06 14:02:41 134

原创 我们为什么要使用 DataBinding

本文默认读者有一定的Android开发经验,对Android Annotations和DataBinding技术也有了简单的了解。文章通过三种不同方式代码的对比,最后总结说明为什么要使用DataBinding的技术。功能三种不同方式代码需要实现的功能是在登录界面里,通过监听用户名和密码输入框的文本变化,动态控制登录按钮点击状态。第一种:普通实现采用普通方式编写代码,可以发现会有很多的多余地方,大部分都是重复的工作:实例化view:findViewById(...)添加文本监听:addTextC

2021-05-06 13:45:55 618 5

原创 RxJava系列1(简介)

前言提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨。近一年来国内的技术圈子中越来越多的开始提及Rx,经过一段时间的学习和探索之后我也深深的感受到了RxJava的魅力。它能帮助我们简化代码逻辑,提升代码可读性。这对于开发效率的提升、后期维护成本的降低帮助都是巨大的。个人预测RxJava一定是2016年的一个大趋势,所以也有打算将它引入到公司现有的项目中来,写这一系列的文章主要也是为了团队内部做技术分享。由于我本人是个Android程序猿,因此这一系列文章中的场景都是基于Android平台的。如果你

2021-05-06 10:57:57 87

原创 Java弱引用(WeakReference)的理解与使用

看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面试者中, 只有两人知道weak reference的存在, 而其中只有一人实际用到过他. 无疑, 在interviewer眼中, 对于weak reference的理解和应用在面

2021-05-06 09:22:37 133

原创 android Spinner控件详解

Spinner提供了从一个数据集合中快速选择一项值的办法。默认情况下Spinner显示的是当前选择的值,点击Spinner会弹出一个包含所有可选值的dropdown菜单,从该菜单中可以为Spinner选择一个新值。上图显示的是Spinner常见的样式。这篇文章中我将讨论1.Spinner的基本用法 2.设置Spinner的Adapter (arrayadapter 和自定义BaseAdapter)3.Spinner的菜单显示方式 4.Spinner的xml属性最简单的Spinner在布局文件中添加S

2021-04-30 17:59:11 4039 4

原创 Git如何修改提交(commit)用户名称(user.name)

Git修改提交用户名称 如题,请打开 Git Bash 敲命令。 不行,试试这个。 Git用户名作用 Git查看用户名 Git花式改用户名 Git修改用户名玩坏也不慌如题,请打开 Git Bash 敲命令。git config --global user.name “嘿!来修改这段话为你提交预期登记的用户名称。”git config --global user.name "嘿!来修改这段话为你提交预期登记的用户名称。" 不行,试试这个。git c

2021-04-30 16:59:11 2325 1

原创 Microsoft Store安装Ubuntu

在Microsoft Store中搜索Ubuntu(我只测试了这个系统,如果有人爱折腾也可以尝试其他系统,如SUSE,Debian),在应用页安装好Ubuntu,过程很简单,就跟安装软件一样。在左下角的Cortana中搜索Ubuntu,点击进入,看到的界面就如同我们在Ubuntu下的终端界面,在这个窗口测试一下ls命令,无误。Windows 10下Linux子系统图形界面更新sudo apt-get update安装 xorgsudo apt-get install xorg安装xfce4s

2021-03-06 00:01:00 1431

原创 简单理解java反射机制

什么是反射?1,反编译:.class–>.java2.通过反射机制访问java对象的属性,方法,构造方法等;反射应用场景:Jdbc 加载驱动-----Spring ioc框架获取类的三种方法//第一种方式: Classc1 = Class.forName("Employee"); //第二种方式: //java中每个类型都有class 属性. ...

2020-05-06 14:29:21 114

原创 为你,千千万万遍——《追风筝的人》读书分享

为你,千千万万遍!《追风筝的人》,是一部了解多年却一直没有去读的书,直到看到这句“为你,千千万万遍”,我一下子被打动了。这是一个发生在阿富汗的故事,一个持续几十年的关于忠诚、愧疚与赎罪的故事。忠诚二十世纪六十七年代的阿富汗,还没有苏联入侵,还没有塔利班,虽然国内种族歧视和阶级分化严重,但总体还算安定祥和。主人公阿米尔就出生于这个时期的一个富豪家庭,一年后他们家仆人的儿子哈桑也出生了。由于阿...

2020-04-28 14:47:21 6403

原创 【动态加载】ANDROID动态加载使用SO库时要注意的一些问题

Android项目里的SO库正好动态加载系列文章谈到了加载SO库的地方,我觉得这里可以顺便谈谈使用SO库时需要注意的一些问题。或许这些问题对于经常和SO库开发打交道的同学来说已经是老生长谈,但是既然要讨论一整个动态加载系列,我想还是有必要说说使用SO库时的一些问题。在项目里使用SO库非常简单,在 加载SD卡中的SO库 中也有谈到,只需要把需要用到的SO库拷贝进 jniLibs(或者Eclips...

2020-04-26 13:46:11 355

原创 load 与 loadLibrary

JNI 使用 Native 库时 一般用load 与 loadLibrary 两个方法,它们的区别主要如下分析。加载的路径不同:System.load(String filename) 是从作为动态库的本地文件系统中以指定的文件名加载代码文件,文件名参数必须是完整的路径名且带文件后缀;而 System.loadLibrary(String libname) 是加载由 libname 参数指定的系...

2020-04-24 10:24:17 895

原创 Android So加载的路径选择

我们在Android应用程序会常常的加载一些So文件来完成我们的目标,那么我们的APK加载So是有哪些平时我们没有注意到的事情呢?首先我们一般开发会遇见两种APK(其实一般大部分只会遇到一种),一种为系统级APK,另外一种为普通APK。那么这个两种APK跟So加载有什么关系呢?别急,让我们先聊聊我们那些操作会产生这些类型的APK。普通级AKP:pm install + 包名将会把APK安...

2020-04-23 19:26:39 593

原创 Android TTS接口分析和调用实现

这篇文章会分享下speech包源码,我们会更明白speech包接口的来龙去脉。本篇文章我们主要讲解调用的关键接口,其他的不做过多讲解,避免文章太冗长。一、speech包的源码结构speech源码路径:/frameworks/base/core/java/android/speech先来看一下speech包的源码结构:这里面,比较关键的有:TextToSpeech、TextToSpeech...

2020-04-22 15:31:41 1715

原创 百度 Asr集成

1、上篇我们讲解了如何调用android系统提供的接口实现Asr功能,本篇我们讲解如何集成Asr引擎,这里我们以集成百度Asr为例讲解。2、百度Ai官网https://ai.baidu.com/下载SDK包,解压后里面也有相关的开发文档。将libs中文件和res中的文件复制到项目工程对应的文件夹,如下图在AndroidManifest.xml文件中添加appId,权限等信息3、接...

2020-04-20 17:37:43 983

原创 Android So加载的路径选择

我们在Android应用程序会常常的加载一些So文件来完成我们的目标,那么我们的APK加载So是有哪些平时我们没有注意到的事情呢?首先我们一般开发会遇见两种APK(其实一般大部分只会遇到一种),一种为系统级APK,另外一种为普通APK。那么这个两种APK跟So加载有什么关系呢?别急,让我们先聊聊我们那些操作会产生这些类型的APK。普通级AKP:pm install + 包名将会把APK安...

2020-04-17 17:23:58 1575

原创 Android SDK之ASR源码及流程分析

ASR全称是Automatic Speech Recognition,是自动语音识别,将人说出来的化自动识别成文本。本文将从ASR的简单demo使用,对Android SDK里涉及的语音识别进行源码分析涉及的Android SDK 核心源码路径如下:android.speech.SpeechRecognizer android.speech.RecognitionListener an...

2020-04-17 15:06:08 1009

原创 Android Asr流程分析和调用实现

ASR全称是Automatic Speech Recognition,是自动语音识别,将人说出来的化自动识别成文本。本文我们将简单快速的熟悉Android asr流程和外部调用原理。在此先直接说明Android Asr流程原理,以便更容易理解后面的调用流程:Android Asr只是定义了语音识别的接口,具体的引擎需要各个厂商单独定义,也就是说Android Asr只提供外部调用的接口,至...

2020-04-17 14:26:30 954

原创 彻底明确Android中AIDL及其使用

1、为什么要有AIDL?不管学什么东西,最先得弄明确为什么要有这个东西。不要说存在即是合理。存在肯定合理,可是你还是没有明确。对于AIDL有一些人的浅显概念就是,AIDL能够跨进程訪问其它应用程序,和其它应用程序通讯,那我告诉你。非常多技术都能够訪问,如广播(应用A在AndroidManifest.xml中注冊指定Action的广播)应用B发送指定Action的广播,A就能收到信息,这样也能看...

2020-04-14 10:27:55 179

原创 Android中UI线程与后台线程交互设计的5种方法

android提供了以下几种方法,用于实现后台线程与UI线程的交互。1、handler2、Activity.runOnUIThread(Runnable)3、View.Post(Runnable)4、View.PostDelayed(Runnabe,long)5、AsyncTask方法一:handlerhandler是android中专门用来在线程之间传递信息类的工具。要讲明han...

2020-04-13 19:51:33 290

原创 Android中UI线程与后台线程交互设计的5种方法

我想关于这个话题已经有很多前辈讨论过了。今天算是一次学习总结吧。在android的设计思想中,为了确保用户顺滑的操作体验。一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务。因此我们必须要重新开启一个后台线程运行这些任务。然而,往往这些任务最终又会直接或者间接的需要访问和控制UI控件。例如访问网络获取数据,然后需要将这些数据处理显示出来。就出现了上面所说的情况。原本这是在正常不过的现...

2020-04-13 19:41:40 147

原创 Android项目目录结构res和assests目录的不同

Android项目目录结构res和assests目录的不同:是否在R.java文件中被注册;(res的注册,assests不注册)res所放的文件类型是规定好的;而assests目录下放置的文件类型不限制;访问方法不同。res中文件使用R.内部静态类.id来访问;而assest中的文件通过IO流来访问。...

2020-04-13 16:54:13 102

原创 android res目录

我们建好一个Android 的项目后,默认的res下面 有drawable、layout、values等目录1.drawable目录相关启开一个新的Android专案后在res资料夹内会有drawable-hdpidrawable-mdpidrawable-ldpidrawable-xhdpidrawable-xxhdpi三个目录,所定义的dpi皆不同一般來說,ldpi是120,...

2020-04-13 16:39:23 368

原创 AIDL详解

一、概述AIDL意思即Android Interface Definition Language,翻过来就是Android接口定义语言,是用于定义服务端和客户端通信接口的一种描述语言,可以拿来生产IPC代码,从某种意义上说AIDL其实就是一个模板,因为在使用过程中,实际起作用的并不是AIDL文件,而是据此生产的一个Interface的实例代码,AIDL其实是为了避免我们重复写代码而出现的一个模...

2020-04-13 15:23:07 9278

原创 Android中Bundle

Bundle经常使用在Activity之间或者线程间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口。Bundle提供了各种常用类型的putXxx()/getXxx()方法,用于读写基本...

2020-04-13 11:20:28 77

原创 简单快速处理网络请求超时的方法

最近在调试联网操作的时候碰到网络请求超时的问题,以下是简单快速处理网络超时的方法:使用android提供的工具类AsyncTask类,此类提供了一个AsyncTask.execute().get(timeout, unit);方法用于处理用户的请求超时的操作,可以设置请求超时的时间(timeout)以及请求时间的单位(unit)。例如:设置超时时间为2秒,单位为毫秒try {AsyncTa...

2020-04-13 09:35:12 3914

原创 检查接口是否用于主线程

如果接口需要执行网络交互或者其他耗时操作,则需要检查调用者是否将接口使用在主线程,该方法可以进行检测。private void ensureNotOnMainThread() {Looper var1 = Looper.myLooper();if (var1 == Looper.getMainLooper()) {IllegalStateException var2 = new Illeg...

2020-04-13 09:33:43 95

原创 Android退出应用程序方法总结

finish方法finish();该方法只是结束当前Activity,系统将最上面的Activity移出了栈,并没有清理占用的资源。如果栈内有很多Activity 的话,使用该方法显得有点捉襟见肘了,没办法一次移出全部Activity,并且没有立即释放内存,活动的资源也没有被清理。进程式(1)KillProcess():可以杀死当前应用活动的进程,这一操作将会把所有该进程内的资源...

2020-04-13 09:32:29 2681

原创 ADB 命令大全

前提:设备端经常需要调试,各种adb命令错综繁乱,记不住,忘记了怎么办,于是借用GitHub一位热心人整理的史上所有adb 命令在此分享如,可以点击右边大纲跳转需要的命令:命令语法adb 命令的基本语法如下:1adb [-d|-e|-s ] 如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s ] 这一部分,直接使用 adb 。为命令指定目标设备如果有多个设备/...

2020-04-11 15:54:37 869

原创 强杀进程

调用系统apiActivityManager.forceStopPackage(String packageName) ;强行杀掉进程方法,会导致被杀死的进程不走onDestory()等生命周期需要在onDestory()等生命周期中处理业务的功能模块需要注意此现象...

2020-04-11 15:47:12 109

原创 Android广播

Android中的广播主要可以分为两种类型:标准广播和有序广播。标准广播一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时间接收到这条广播,因此他们之间没有任何的先后顺序。特点:效率高;缺点:无法拦截。有序广播一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条广播,当该广播接收器执行完OnReceive()方法逻辑后,广播才会继续...

2020-04-11 15:39:38 107

原创 Android判断应用是否运行,以及是否在后台

在开发中,有时候我们会需要判断应用是否在前台运行,然后才做什么操作;当应用切换到后台时,才做什么操作。这时候我们需要判断应用在前台还是后台运行的情况/** 判断程序是否在后台运行 */public static boolean isRunBackground(Context context) { ActivityManager activityManager = (ActivityMa...

2020-04-11 15:37:08 1497 1

原创 原生计时器控件

1.Chronometer一个简单的定时器,可以通过setBase()来给它一个基准时间,并从该时间开始计数;如果不给基准时间,将使用调用start()方法时的时间。默认将显示当前"MM:SS"或 "H:MM:SS"格式的时间,当然也可以自定义字符串来格式化显示。Chronometer的一个比较重要的XML属性如下:android:format:设置时间的格式如: hh:mm:ss。Chr...

2020-04-11 15:30:58 213

原创 Android自定义权限

一、定义权限的相关知识android允许我们使用permission标签,在Manifest文件中定义属于自己的权限,但Android不允许两个不同的应用定义一个相同名字的权限(除非这两个应用拥有相同的签名),所以在命名的时候,需要注意。android:exportedandroid:exported 是Android中的四大组件 Activity,Service,Provider,...

2020-04-11 15:26:35 205

原创 Android的获取系统时间

一.使用Calendar获取系统时间Calendar获取系统时间首先要用Calendar.getInstance()函数获取一个实例,再为该实例设定时区(中国的时区为GMT+8:00),最后使用Calendar.get()函数获取时间的具体信息,如年,月,日,小时,分,秒,星期几。缺点是获得的这些时间信息都是独立的,如果要一起显示的话,还要组装起来凑成一个字符串,稍显麻烦。不过如果只需要单个时...

2020-04-11 15:08:55 173

原创 Settings.System.putInt异常报错10024

在IPC调用过程中,被调用方需要知道调用方的UID和PID,以便被调用方用于权限检测;所以需要一种方式来提供调用方的UID和PID,主要作用就是用于权限检测,虽然在application 开发中并不常见,但是在system_server中很常见,比如client调用ActivityManagerService的方法,而ActivityManagerService又调用了PackageManager...

2020-04-08 20:12:42 936

原创 android IPC通信中的UID和PID识别

IPCThreadState对象维护了2个变量pid_t mCallingPid;uid_t mCallingUid;从变量名称来看,这2个变量保存了进程的PID和UID,并且由于这两个变量由IPCThreadState对象维护,可见它们是与IPC相关的。具体它们保存的是IPC发送方的PID和UID还是当前进程的IPD和UID,视情况...

2020-04-08 20:00:17 159

空空如也

空空如也

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

TA关注的人

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