![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android App
文章平均质量分 74
一个学渣的自我救赎
这个作者很懒,什么都没留下…
展开
-
Android 多线程——Handler的基本使用
我们创建了Handler类的子类MyHandler,并重写了handlerMessage方法,这个方法是当使用接收处理发送的消息的。然后我们创建了一个子线程,在子线程中我们使用MyHandler的对象调用sendEmptyMessage方法发送了一个空的Message。这个泄露是因为 Message 会持有 Handler,而又因为 Java 的特性,内部类会持有外部类,使得 Activity 会被 Handler 持有,这样最终就导致 Activity 泄露。//直接创建新的 Message 实例。原创 2024-05-02 16:33:01 · 322 阅读 · 0 评论 -
Android 多线程——线程安全/线程同步
单一程序中每次只能做一件事情,它是串行执行的;但多线程程序是可以异步并发处理同一件事情,这样就会发生两个线程抢占资源的问题,使如一个线程正在写数据,而另一个线程刚才在读数据,那么就会产生很多未知的错误情况出现,这也是多线程最危险的事情。原创 2024-05-02 16:22:09 · 130 阅读 · 0 评论 -
Android 多线程——线程和线程状态
但如果线程正在sleep()或wait()中,便无法使用类成员变量来判断,此时可以使用interrup()方法离开run()方法,同时结束线程,但程序会抛出InterruptedException异常。使用sleep()方法时,必须加入InterruptedException异常捕捉,使用sleep()方法的会使线程进入睡觉状态,也就是上面提到的阻塞状态,接收的参数是毫秒,在设定的毫秒时间内醒来后,它并不能保证能进入运行状态,只能保证它进入就绪状态。但sleep方法是纯粹使线程休眠等待,而且并不会释放锁。原创 2024-05-02 16:15:55 · 30 阅读 · 0 评论 -
Android App架构模式
MVC,(Model View Controller),是软件架构中最常见的一种框架,简单来说就是通过controller的控制去操作model层的数据,并且返回给view层展示,具体见下图当用户发触事件的时候,view层会发送指令到controller层,接着controller去通知model层更新数据,model层更新完数据以后直接显示在view层上,这就是MVC的工作原理。原创 2024-05-02 16:06:57 · 575 阅读 · 0 评论 -
Android Media——使用MediaController实现音乐播放
在客户端与服务端建立连接后,就可以调用mMediaController的播放、暂停、上下首、跳转某个时间点方法了,如:在客户端Activity的播放按键onClick回调时调用mMediaController.getTransportControls().play(),这时在服务端的MediaSession.Callback() 的onPlay()方法就会被调用,我们可以在onPlay方法中调用MediaPlay的start方法。原创 2024-05-02 15:58:50 · 167 阅读 · 0 评论 -
Android Medai——使用MediaCodec编码H264视频
配置好后,可以调用start启动编码工作,进入Executing状态。编码线程是真正的编码过程,本例子是将数据编码为h264。设置好相关配置格式后,调用configure进行配置。至此,整个编码为h264文件的过程就结束了。原创 2024-05-02 15:56:27 · 226 阅读 · 0 评论 -
Android Media——使用MediaCodec解码MP4视频并播放
视频解码线程主要内容就是进行解码的流程控制。上面表示创建了一个解码器,并指定了解码类型为avc的视频解码器。原创 2024-05-02 15:14:39 · 434 阅读 · 0 评论 -
Android Media——使用MediaPlayer播放SD卡中的音频
MediaPlayer是Android当中开发音视频应用的一个重要组件,它不仅支持本地音视频的播放,同时也能够播放网络的音视频,支持多种音视频播放格式。在onDestroy函数中stop和release mediaPlayer,在verifyStoragePermissions函数中申请权限,如果只播放SD卡目录的歌曲申请个读权限就可以了,我也把写申请了。最后在onClick中根据不同的按键调用mediaPlayer的函数进行播放、暂停(再次播放继续播放)、和停止(再次播放从头播放)。原创 2024-05-02 14:23:19 · 791 阅读 · 2 评论 -
Android Audio——使用SoundPool播放自定义音效
SoundPool 使用音效池的概念来管理多个播放流,如果超过流的最大数目, SoundPool 会基于优先级自动停止先前播放的流,另外,SoundPool 还支持自行设置声音的品质、 音量、 播放比率等参数。rate:指定播放速率:1.0的播放率可以使声音按照其原始频率,而2.0的播放速率,可以使声音按照其 原始频率的两倍播放。maxStreams 同时播放流的最大数量,当播放的流的数目大于此值,则会选择性停止优先级较低的流。加载声音资源,返回一个声音的ID,后面我们可以通过这个ID来播放指定的声音。原创 2024-05-02 14:11:44 · 582 阅读 · 0 评论 -
Android Audio——使用SoundPool播放系统的音效
在上面的代码中,我们首先创建了一个SoundPool对象,并使用load()方法加载了系统的声音资源(这里以android.R.raw.sound_effect为例)。然后,在playSound()方法中调用play()方法来播放系统声音。SoundPool可以播放系统的音效。你可以使用SoundPool的load()方法来加载系统的声音资源,然后使用play()方法来播放这些声音。原创 2024-05-02 14:08:39 · 143 阅读 · 0 评论 -
Android Audio——利用AudioManager请求和放弃音频焦点
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:效果同AUDIOFOCUS_GAIN_TRANSIENT,只是希望上一个持有焦点的App减小其播放声音(但仍可以播放),此时会混音播放。AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE: 表示申请一个短暂的音频焦点,并且会希望系统不要播放任何突然的声音(例如通知,提醒等),例如用户在录音。AUDIOFOCUS_GAIN: 此参数表示希望申请一个永久的音频焦点,并且希望上一个持有音频焦点的App停止播放;原创 2024-05-02 14:03:17 · 493 阅读 · 0 评论 -
Android Audio——使用AudioRecord录制音频
Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的 API,它可以直接把手机麦克风录入的音频数据进行编码压缩(如 AMR、MP3 等)并存成文件,而后者则更接近底层,能够更加自由灵活地控制,可以得到原始的一帧帧 PCM 音频数据。原创 2024-05-02 13:55:48 · 1101 阅读 · 1 评论 -
Android Audio——使用 AudioTrack 播放音频
Android SDK 提供了3套音频播放的API,分别是:MediaPlayer,SoundPool,AudioTrack。简单来说,MediaPlayer 更加适合在后台长时间播放本地音乐文件或者在线的流式资源;SoundPool 则适合播放比较短的音频片段,比如游戏声音、按键声、铃声片段等等,它可以同时播放多个音频;而 AudioTrack 则更接近底层,提供了非常强大的控制能力,支持低延迟播放,适合流媒体和VoIP 语音电话等场景。原创 2024-05-02 13:51:21 · 1413 阅读 · 0 评论 -
Android多屏显示——StartActivity
最后我们改成点击button再启动副屏页面,在newSecondActivity前需要判断presentation是否为空,如果不为空就dismiss掉,否则点击button1再点击button2时,presentation画面一直在前,导致SecondActivity被挡住了。注意:需要设置通过Intent设置启动的Activity为FLAG_ACTIVITY_NEW_TASK,即新的Activity与mainActivity不在一个线程,只有这样才能保住同时显示在主、副屏幕。原创 2024-05-02 10:28:01 · 406 阅读 · 1 评论 -
Android多屏显示——Presentation
要了解 API 的具体调用,推荐先查看官方的文档:Presentation文档Android 从4.2开始支持双屏显示,开发时需 minSdkVersion >= 17。Android 连接两个屏幕时,自动分配主屏和副屏,主屏显示正常的 Activity 界面,副屏通过创建 Presentation 类来实现。通过查看 Presentation 继承关系可知,Presentation 继承自 Dialog,创建的时候需要遵循 Dialog 相关要求。原创 2024-05-02 10:16:32 · 1028 阅读 · 3 评论 -
Android蓝牙——A2DP连接
扫描并连接到A2DP设备。可以使用BluetoothAdapter类的startDiscovery()方法扫描设备,使用BluetoothDevice类的connectGatt()方法连接设备。可以使用BluetoothAdapter类的getProfileProxy()方法获取A2dpProfile代理对象。可以使用A2dpProfile代理对象的connect()方法连接设备。可以使用MediaPlayer类或AudioTrack类播放音乐。确保设备支持蓝牙A2DP协议,并且已经打开蓝牙功能。原创 2024-05-02 10:04:55 · 17 阅读 · 0 评论 -
Android蓝牙——蓝牙HFP的连接、拨打电话、监听蓝牙电话状态
如果来电没有接听直接挂断就是拒接。原创 2024-05-02 09:57:11 · 45 阅读 · 0 评论 -
Android JNI基础——利用JNI实现JAVA调用C++代码
(1)定义Java Native Interface,即 Java本地接口,相当于桥梁作用,一种协议;即在 Java代码 里调用 C、C++等语言的代码 或 C、C++代码调用 Java 代码(互相调用)Android系统架构中上层(框架层+应用层)JAVA通过JNI调用底层(Linux Kernel层)C;JNI是 Java 调用 Native 语言的一种特性,是属于 Java 的,与 Android 无直接关系(2)作用。原创 2024-05-02 00:03:58 · 284 阅读 · 1 评论 -
Android AIDL基础——利用AIDL实现客户端向服务端传递基本类型
数据类型:AIDL默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,但是除了这些类型之外的数据类型,在使用之前必须导包,就算目标文件与当前正在编写的 .aidl 文件在同一个包下——在 Java 中,这种情况是不需要导包的。AIDL是用于定义服务端和客户端通信接口的一种描述语言,可以拿来生产IPC代码,从某种意义上说AIDL其实就是一个模板,因为在使用过程中,实际起作用的并不是AIDL文件,而是据此生产的一个Interface的实例代码, AIDL其实是为了避免我们重复写代码而出现的一个模板。原创 2024-05-02 00:02:32 · 676 阅读 · 5 评论 -
Android xml布局中的常用属性
View类是Android的一个非常重要的超类,它是Android里所有与用户交互的控件的父类,包括Widget类的交互UI控件(按钮、文本框等)和ViewGroup类布局控件。View的透明度,取值范围:0(完全透明)到1(完全不透明)View的背景,此值可以是PNG图引用、9-patch、XML或颜色值如”#ff000000”等View是否可单击View的描述View在不使用滚动条时是否淡出滚动条View是否获得焦点View是否可以在触摸模式下获取焦点View的前景。原创 2024-05-02 00:05:04 · 9 阅读 · 0 评论 -
Android AIDL基础——利用AIDL实现客户端向服务端传递Listener接口
首先我们先写Service端,新建立一个EmptyActivity的工程,点击项目栏右键->新建->AIDL->AIDL File,填入名字后确定,我填的名字是IAudio.aidl。运行后在editText中填写想要设置的音量,点击设置音量,就会将音量设置到Service端,再点击获取当前音量,就会从Service端取得音量,然后显示在textView 中。1、继承Service类,定义一个AudioBinder类用来继承IAudio.Stub类,实现了IAudio接口。原创 2024-05-02 00:04:42 · 322 阅读 · 2 评论 -
Android RecyclerView介绍
定义一个MyRecyclerViewAdapter继承RecyclerView.Adapter后,Android Stuido提醒需要重写3个方法,在重写3个方法前,一般会先定义一个Holder继承RecycelrView.ViewHolder,之后直接在MyRecyclerViewAdapter上,指定泛型就是RecyclerHolder。Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适的形式显示在View中给用户看。这三个方法都是由安卓系统去调用的。绑定ViewHolder。原创 2024-05-02 00:03:23 · 185 阅读 · 1 评论 -
Android View继承关系
view是Android中所有控件的基类,不管是button,还是Text View,或复杂的布局RelativeLayout和ListView,它们的基类,都是View,它是界面层控件的一个抽象。通过VIewGroup可以看出,ViewGroup中含有多个View,但它也是继承自View,所以,View可以是一个单独的控件,也可以是多个控件组成的一组控件。原创 2024-05-02 00:02:56 · 572 阅读 · 1 评论 -
Android蓝牙——BLE的开启、搜索、配对与连接
首先需要在AndroidManifest中申请如下权限。原创 2024-05-01 23:23:08 · 335 阅读 · 0 评论 -
Android蓝牙——socket的连接、读取数据
在onStartCommand()方法中,获取要连接的蓝牙设备和UUID,并调用connectToDevice()方法开始连接蓝牙设备。在connectToDevice()方法中,创建一个ConnectThread线程用于连接蓝牙设备。在connected()方法中,创建一个ConnectedThread线程用于读取数据。在ConnectedThread线程中,使用mmInStream.read(buffer)方法读取数据,并在其中处理读取到的数据。原创 2024-05-01 23:11:44 · 137 阅读 · 0 评论 -
Android图像介绍——Bitmap常用操作
本篇在《利用bitmap加载图片文件并表示》的基础上追加Bitmap常见操作的Domo。分别实现图像旋转,图像剪切,图像缩放,切圆角操作。原创 2024-05-01 19:19:24 · 45 阅读 · 0 评论 -
Android图像介绍——利用bitmap加载图片文件并表示
通过Log可以看到不同大小的imageView设置的采样率不同,加载后的RowBytes大小也不同,但同样采样率从res/drawable加载的RowBytes会大一些,这个我也不知道啥原因。我们写一个图片加载的例子,使用不同的方式加载图片文件。原创 2024-05-01 19:16:44 · 302 阅读 · 0 评论 -
Android图像介绍——Drawable
Drawable都表示一种图像的概念,但又不全是图片,通过颜色也可以构造出各式各样的图像效果。在实际开发Drawable常被用来作为View的背景使用。Drawable一般通过XML来定义,我们也可以通过代码来创建具体的Drawable对象。在Android设计中,Drawable是一个抽象类,它是所有Drawable的基类。Drawable的内部宽高这个参数很重要,可以通过getIntrinsicWidth和getIntrinsicHeight获取。原创 2024-05-01 18:59:07 · 879 阅读 · 0 评论 -
Android图像介绍——Bitmap和BitmapFactory
Bitmap也称为位图,是图片在内存中的表现形式,任何图片(JPEG, PNG, WEBP…)加载到内存后都是一个Bitmap对象。Bitmap实际是像素点的集合,假设它的宽高为width和height,那么该Bitmap就包含width*height个像素,它在内存中占用的内存就是(width*height*单个像素内存)。为了减小图片在磁盘上所占的空间,将Bitmap保存到磁盘上时会进行压缩,图片的文件格式实际代表的是不同的压缩方式与压缩率,而将磁盘上的文件加载到内存中时就要进行解压缩。原创 2024-05-01 18:38:08 · 875 阅读 · 0 评论 -
Android绘画介绍——图片描画
BitmapFactory是一个创建Bitmap的工具类,为我们提供了从文件、流、byte数组中创建数组,在创建的时候,还为我们提供了一个内部类Options作为参数来控制Bitmap的创建,比如控制Bitmap的长和宽、像素的大小,是否只获取图片的一些信息(不加载图片数据,返回图片宽和高),是否在内存中复用等。bitmap是Android系统中的图像处理的重要类之一,通过bitmap我们可以获取到图片的相关信息,bitmap文件图像效果好就需要占用越大存储空间;原创 2024-05-01 18:10:06 · 207 阅读 · 0 评论 -
Android绘图介绍——复杂图形描画
Path类封装了多个化合物(轮廓)组成的直线段,二次曲线,三次曲线的几何路径。它可以绘制与canvas.drawPath(path, paint),无论是填充或抚摸(基于涂料的样式),或它可用于削波或绘制路径上的文本。然后我们再画一个太极的图形,这次没有使用Path类,而是描画了多个半圆和圆而形成的图案。上一篇我们介绍了使用Paint描画基本图形,这一篇我们学习使用Paint描画复杂图形。简而言之:可以用他来画几何图形、画曲线、画基于路径的文本。画个矩形、四个参数对应与原点的相对距离的是个点。原创 2024-05-01 18:08:43 · 290 阅读 · 0 评论 -
Android绘图介绍——基本图形描画
android内置的颜色,比如系统资源中定义的颜色,有BLACK(黑色),BLUE(蓝色),CYAN(青色),GRAY(灰色),GREEN(绿色),RED(红色),WRITE(白色),YELLOW(黄色)等。所以,凡有跟要要画的东西的设置相关的,比如大小,粗细,画笔颜色,透明度,字体的样式等等,都是在Paint里设置;同样,凡是要画出成品的东西,比如圆形,矩形,文字等相关的都是在Canvas里生成。在自定义组件中,Paint类是一个很重要的类,主要包含颜色、文本、图形样式、位图模式、滤镜等几个方面。原创 2024-05-01 18:04:23 · 810 阅读 · 0 评论 -
Android动画介绍——总结
本篇建议学习完各个动画单独文章后再学习。在Android动画中,总共有两种类型的动画View Animation(视图动画)和Property Animator(属性动画);其中View Animation包括Tween Animation(补间动画)和Frame Animation(逐帧动画);Property Animator包括ValueAnimator和ObjectAnimation;原创 2024-05-01 17:45:02 · 674 阅读 · 0 评论 -
Android动画介绍——估值器
这里介绍另外与动画有关的概念TypeEvaluator,中文为估值器。ARGB估值器,以Argb类型的形式从初始值 - 结束值 进行过渡。什么是估值器:根据当前属性改变的百分比来计算改变后的属性值。浮点型估值器,以浮点型的形式从初始值 - 结束值 进行过渡。作用:设置 属性值 从初始值过渡到结束值 的变化具体数值。整型估值器,以整型的形式从初始值 - 结束值 进行过渡。估值器用在属性动画上,下图为估值器与插值器的关系。下面我们写一个Domo来理解估值器的使用。Android自带的估值器如下:。原创 2024-05-01 17:43:13 · 265 阅读 · 0 评论 -
Android动画介绍——插值器
此时动画时间被转换为时间索引,则动画时间轴上的每个点都可以转换成0.0到1.0之间的一个浮点数。在变换的情况下,y轴上,0.0对应于起始位置,1.0对应于结束位置,0.5对应于起始和结束之间的中间,对于一些插值器其值还可以是0~1之外的数值。通俗易懂的说,Interpolator负责控制动画变化的速率,即确定了 动画效果变化的模式,使得基本的动画效果能够以匀速、加速、减速、抛物线速率等各种速率变化。跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100。原创 2024-05-01 17:41:05 · 345 阅读 · 0 评论 -
Android动画介绍——属性动画(2)
2、利用AnimatorSet(组合动画):AnimatorSet 不仅可以同时执行多个动画效果,也可以让多个动画效果按照一定的顺序执行。PropertyValuesHolder这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。在Android动画介绍——属性动画(1)中我们介绍了单一效果的属性动画的实现,在这里我们继续介绍多种效果叠加的属性动画实现。1、利用PropertyValuesHolder:可以将多种动画效果同时执行。多种效果叠加的属性动画实现方法有两种。原创 2024-05-01 17:38:22 · 294 阅读 · 0 评论 -
Android动画介绍——属性动画(1)
如果这里的数值是floatType,那么android:valueFrom、android:valueTo的值也要对应的设置为float类型的值。ValueAnimator 类用于完成属性动画的计时、值的计算,但它不会对要添加动画的对象和属性应用这些值。取值范围为float,int和color,如果取值为float对应的值样式应该为89.0,取值为Int时,对应的值样式为:89;1、ValueAnimator:是对值做动画,先算出要变化的属性值,在通过监听值变化的函数修改对象的属性。原创 2024-05-01 17:36:33 · 796 阅读 · 1 评论 -
Android动画介绍——补间动画(2)
上一篇我们介绍了透明动画效果(AlphsAnimation)、移动动画效果(TranslateAnimation)、旋转动画效果(RotateAnimation)、缩放动画效果(ScaleAnimation);可以的,这个时候我们就用到了AnimationSet,它可以将一种或多种动画效果放在一起运行。这里有一个差值器(interpolator)的概念,我们后续再介绍。接上一篇,这里我们介绍AnimationSet,也就是组合渐变。控件动画结束时是否还原到开始动画前的状态。添加定义好的动画效果。原创 2024-05-01 17:28:37 · 419 阅读 · 0 评论 -
Android动画介绍——补间动画(1)
AlphaAnimation:透明度渐变效果,创建时许指定开始以及结束透明度,还有动画的持续 时间,透明度的变化范围(0,1),0是完全透明,1是完全不透明;fromXScale/fromYScale:沿着X轴/Y轴缩放的起始比例 toXScale/toYScale:沿着X轴/Y轴缩放的结束比例 pivotX/pivotY:缩放的中轴点X/Y坐标,即距离自身左边缘的位置,比如50%就是以图像的 中心为中轴点进行缩放。Andoird所支持的补间动画效果有如下这五种,或者说四种吧,第五种是前面几种的组合而已~原创 2024-05-01 17:26:01 · 960 阅读 · 0 评论 -
Android动画介绍——帧动画
帧动画:是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。然后在drawable文件新建from.xml文件,写入代码,这里的作用可以理解为,我们把图片 放到一个集合里面去了,要用的时候我们直接调用frame。帧动画是一种比较传统的动画,它是由一系列不同的图像创建的,按照顺序播放,就像播放电影一样。首先我们创建我们要的素材,把他们导入到drawable文件夹下。原创 2024-05-01 17:21:17 · 200 阅读 · 1 评论