- 博客(36)
- 收藏
- 关注
原创 Android_jectpack_Navigation
文章目录简介简单使用标签详解跳转事件 <action>指定参数 <argument>深度连接 <deepLink>原理浅析实战中fragment 默认replace问题修改简介Navigation组件用于管理应用内的页面跳转,它默认能支持Activity、Fragment、DialogFragment之间的跳转,但是一般被用来处理Fragment之间的跳转问题,google推出它的目的也是让单 Activity 应用成为首选架构。使用Navigation组件可以屏蔽
2021-07-12 15:41:16 712 2
原创 Android_多媒体播放器们的简单使用
文章目录简介MediaPlayer的简单使用IjkPlayer的简单使用ExoPlayer的简单使用简介Android中的媒体播放器有很多,其中主要使用的有三种,他们各自有自己的使用场景:MediaPlayer:是Android内置的媒体播放器,使用也是最简单的,不需要任何额外库导入,但是使用场景有限,一般不用于视频播放,多用于音频播放。IjkPlayer:是目前开源的最强大的播放器,基于FFmpeg,支持软硬编解码,如果是定制化需求的话需要自行编译出播放库。IjkPlayer多用于国内局点媒体类
2021-06-30 12:52:29 883
原创 Kotlin_操作符重载
文章目录简介实例简介表达式实际调用函数+aa.unaryPlus()-aa.unaryMinus()!aa.not()a++a.inc()a–a.dec()a + ba.plus(b)a - ba.minus(b)a * ba.times(b)a / ba.div(b)a % ba.rem(b)a += ba.plusAssign(b)a -= ba.minusAssign(b)a *=
2021-06-29 11:35:56 358
原创 Android_双进程_播放器在单独进程
文章目录背景播放器放在Service中实现背景项目原因,现在需要将播放器放到一个单独的进程中,主要方案有两种:使用两个Activity,播放器所在的Activity在下,上面的Activity主题使用透明主题,该方案是最简单的,使用时只需要注意上层Activity需要直接继承自Activity不能继承自AppCompatActivity,否则透明主题失效。两个Activity之间的通信用aidl,这边没有用Messenger,因为Messenger是基于消息队列的,如果上面需要获取播放器当前播放位置
2021-06-08 12:53:19 602 1
原创 kotlin_标准函数
文章目录简介repeatalsoletrunwithapplytakeiftakeUnless简介Kotlin提供了一些标准函数,旨在帮助开发人员简化代码,它是位于Standard.kt下的一些顶层函数repeat最简单的标准函数,两个参数第一个是一个int值,第二个参数是一个方法(方法参数是当前执行的index,没有返回值),功能是将该方法执行n次,每次index都会传入给方法repeat(n){ index-> println("第$index次")}实例,往一个list中插入
2021-06-01 17:10:46 364 1
原创 kotlin_单例类和静态方法
文章目录单例类静态方法单例类Kotlin中的单例类只需Object关键字修饰即可:单例类:object NetworkHelper{ fun isAvaliable(): Boolean{ return false }}在kotlin中调用:fun main(args: Array<String>) { println(NetworkHelper.isAvaliable())}在java中调用:public class TestIn
2021-06-01 15:49:56 274
原创 JVM_字节码执行引擎
文章目录简介栈帧方法调用动态类型简介Class字节码文件通过ClassLoader装在进入JVM里并且分配好内存后,字节码引擎去读取字节码进行解析并处理,最后输出执行的结果,执行的方式有两种:解释执行和编译执行,有的虚拟机这两种方式都采用,也有的只用到了其中一种。解释执行:解释器直接解释执行字节码编译执行:即时编译器产生机器码,然后执行机器码栈帧方法调用动态类型...
2021-05-25 08:07:35 169
原创 Android_AOP编程_lancet
文章目录简介简单使用注解详解原理实战简介Lancet 是一个轻量级Android AOP框架,比AspectJ更容易上手,并且工程编译出错率也低很多。编译速度快, 并且支持增量编译(当使用 Scope.LEAF、Scope.ALL 覆盖的类有变动 或者修改 Hook 类时, 本次编译就会变成全量编译)简洁的 API, 几行 Java 代码完成注入需求.没有任何多余代码插入 apk,符合程序设计的开闭原则支持用于 SDK, 可以在SDK编写注入代码来修改依赖SDK的App.简单使用注解详解
2021-05-19 14:19:14 1225
原创 JVM_类加载
文章目录简介初始化的时机加载过程加载连接(验证、准备、解析)初始化简介Class文件中描述了需要运行的类的各种信息,但是它还不能直接运行,需要经历加载、链接、初始化三步最终到达虚拟机方法区之后才能被运行和使用。这个过程都是在程序运行期间完成的,这样虽然会增加一些性能开销,但是为程序提供了极高的扩展性和灵活性,程序可以在运行期间通过预置的或者自定义的类加载器,去加载运行期间从网络或者其他地方得来的Class二进制流文件让它成为程序的一部分。对于Java来说,引用类型有四种:类、接口、数组类、泛型参数,
2021-04-08 23:24:55 307
原创 JVM——Class文件
文章目录简介文件结构实战简介C或者C++传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件,因此一个平台上的二进制可执行文件往往不能在其他平台上工作,而Java 程序是先被编译成Class文件,然后通过Classloader装载进入JVM运行时环境的方法区中,然后被字节码执行引擎执行。写完Java程序点击运行,编译器会自动将代码编译成class文件然后交给JVM去执行,但是JVM只认Class文件,毫不关心这个Class是如何生成的,只要符合JVM规范中定义
2021-04-08 00:13:34 480 1
原创 加解密和编码
简介对重要的东西进行保护,当别人在获取到你的信息或者东西后,解密所需要的代价高于解密后得到东西的价值时,你的加密就是成功的。分类对称加密用秘钥和加密算法对数据进行转换得到密文,使用同样的秘钥加上解密算法再对数据进行一次转换得到原文。主要有两种:DES和AES,目前用的多的是AES,因为破解对称加密的方式是暴力破解,也就是穷举,首先需要想办法拿到一个密文和原文,然后用不同的秘钥去解密文,如果能够得到原文就代表解密成功。随着计算机的发展,计算能力的不断提升,秘钥较短的DES很容易被破解出,所以已经被淘
2021-04-07 21:02:52 719
原创 超文本传输协议_HTTP
简介超文本传输协议,客户端将请求组装成Http Request报文,发送给服务器,服务器处理将结果组装成Http Response报文,发送给客户端,最后客户端处理服务器的结果。简单了解一个网络请求长这样请求GET /frame1593/iptv/user HTTP/1.1Host:响应请求行Request MethodsGET 获取资源,没有BodyPOST 增加或修改资源,有BodyPUT 修改资源,有BodyDELETE 删除资源,没有BodyPat
2021-04-07 07:57:12 1653
原创 JVM 简介
文章目录简单介绍JREJDKJVMHotSpot VMJVM执行Java字节码基本类型简单介绍JRE无论java代码已何种方式,在何种环境运行都离不开JRE,JRE包含了运行Java程序所必须的一些组件,其中主要是Java虚拟机和Java核心类库.JDK包含JRE,并且附带其他一系列开发或者诊断工具。JVMjava虚拟机,C语言等是将代码直接编译成CPU能理解的机器码,而Java语法非常复杂并且抽象程度很高,无法直接在硬件上运行。目前主流做法就是用一款java虚拟机,Java程序在编译时被转换
2021-01-25 20:35:37 309
原创 Android 网络监听、 网络位置和运营商获取
判断有无网络连接object NetworkUtils { fun isNetworkAvailable(): Boolean{ val connMgr = BaseApplication.application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //高版本使用Networ
2020-11-26 20:11:46 665
原创 Android 全局Application上下文
随时获取全局对象Application的方式主要有两种:自定义Application创建自己的Application继承自Applicationclass BaseApplication : Application() { companion object{ lateinit var application: BaseApplication } override fun onCreate() { super.onCreate() a
2020-11-26 19:55:15 576
原创 java泛型
简介在实际开发中会遇到一些类或者方法在处理数据时,数据具有多样性,如果针对每个数据都新建一个类或者方法来处理就显得颇为麻烦。常见的场景就是list,里面会存String,Integer等等数据。为了解决这个问题,需要将处理的数据类型告诉这些类或者方法,即参数化类型,把类型当成参数,别名叫泛型,意思是泛化类型。简单使用告诉list要处理的类型是StringList<String> strList = new ArrayList<>();strList.add("a");s
2020-11-24 15:45:44 158
原创 Android - kotlin基础
基础可以先看这里,深入可以看下官网以下只记录要点常量与变量常量是 val变量是 var全局变量需要在声明时被初始化,如果无法初始化可加上lateinit来声明这个变量可延迟初始化lateinit var a:Stringfun main(args: Array<String>) { var b = "bbbb" val c = "cccc" a = "aaaaaa" println(a)}虽然val是不可变的,但是也不完全等同java的fin
2020-11-21 15:41:14 199
原创 Android - 悬浮窗新姿势-气泡
旧姿势:使用WindowManager权限申请<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> //高版本需要动态申请SYSTEM_ALERT_WINDOW权限,在用到的地方动态申请if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ if (!Settings.canDrawOverlays(mActivity)){
2020-10-29 20:37:29 914
原创 Android - 画中画
简介Android8.0 开始可以让Activity进入画中画模式,即Activity变小并且悬浮于其他界面之上,就算是退到桌面也依然存在。简单使用在AndroidManifest中声明需要进入画中画的Activity支持画中画<activity android:name=".PlayerActivity" //声明支持画中画 android:resizeableActivity="true" android:supportsPictureInPicture="true" //避免
2020-10-29 15:16:00 827
原创 Android - 通知Notification
简介指 Android 在应用的界面之外显示的消息,旨在向用户提供提醒、来自他人的通信信息或应用中的其他实时信息。用户可以点击通知来打开应用,也可以直接在通知中执行某项操作,比如点击按钮可以切歌,甚至在通知栏上直接回复消息。显示位置状态栏和通知栏在状态栏上显示通知图标,在通知栏显示详细内容,用户点击通知栏里面的通知一般会跳转到应用相应页面。屏幕上方当未锁屏时通知可以显示在屏幕上面,可以伴随着提示音或者震动,提示一会后如果用户没有处理会自动消失锁屏显示当屏幕锁定时,通知可以显示在锁屏界面上,
2020-10-28 17:35:10 3500
原创 Android - 服务Service
简介一种可在后台执行长时间运行操作而不提供界面的应用组件。不会自己创建线程和进程(除非指定运行进程),只在启动该服务的进程中执行,通常情况下是主线程,因此降低应用正在运行的任何 Activity 的性能,所以如果需要在服务中执行耗时操作或者CPU密集型操作,就需要在服务内创建新线程来处理,从而降低发生ANR风险。分类服务类型不在于自身,主要依赖外部组件调用它的方式,其他组件通过bindService启动就是绑定服务,用startService启动就是后台服务,如果内部有常驻通知就是前台服务。绑定服
2020-10-28 14:41:30 146
原创 Android - 广播Broadcast
简介当某个特定事件发生时发送广播通知那些对该事件感兴趣的应用。可以是本应用,比如音乐软件常有的前台服务在通知栏里切歌都是用的广播;也可以跨应用,比如:系统中的锁屏,网络变更,耳机按钮点击都会有广播,但是需要注意各个版本之间系统广播的差异,因为Android越来越注重用户隐私,一些系统广播可能无法获取想要的信息。发送广播LocalBroadcastManager.sendBroadcast:用于当前应用内部发送广播,接收器也在本应用,这样更安全也更高效,因为不用跨进程。//新建意图Intent
2020-10-27 19:19:34 90
原创 Android - 应用快捷方式ShortCut
简介帮助用户快速启动应用程序中的常见或推荐功能创建方式静态快捷方式:在打包到APK或应用包中的资源文件中定义。适合在用户与应用程序互动的整个生命周期内使用一致结构链接到内容的应用程序,即固定功能,固定跳转的页面。动态快捷方式:只能在运行时由应用发布,更新和删除(静态和动态加在一起最多四个,因为大多数启动器只能显示四个)。用于上下文相关的应用程序中的操作,快捷方式将需要经常更新。固定快捷方式:如果用户授予许可,则可以在运行时将固定的快捷方式添加到受支持的启动器中(无数量限制)。该方式生成的快捷方式
2020-10-23 11:22:56 880
原创 Android Jetpack - Room
简介谷歌提供的数据库封装库,不建议直接用Sqlite简单使用配置依赖def room_version = "2.2.5"implementation "androidx.room:room-runtime:$room_version"//java使用annotationProcessor "androidx.room:room-compiler:$room_version"//kotlin使用//kapt "androidx.room:room-compiler:$room_versi
2020-10-21 10:39:13 333
原创 Android Jetpack - LiveData
简介当数据更改时通知处于活跃生命周期状态的应用组件观察者优点:确保界面符合数据状态:LiveData变化时会通知观察者,观察者可以更新界面不会发生内存泄漏:观察者生命周期销毁后LiveData会自我清理不会因Activity停止而导致崩溃:观察者处于非活跃状态时无法接收LiveData事件无需手动处理生命周期:观察者只是观察数据,开始观察后不会停止或者恢复观察,剩下的生命周期由LiveData处理数据始终是最新的:数据改变会立即通知观察者,如果当前观察者非活跃则无法获取相应事件,但是恢复到活
2020-10-21 10:04:17 128
原创 Android jetpack - ViewModel
简介以生命周期的方式存储和管理界面相关的数据,从界面控制器逻辑中分离出视图数据所有权,让代码更易行且更高效使用方式自定义ViewModel (ViewModel不需要额外引入其他配置),直接继承ViewModel,如果自定义的viewmodel需要使用context,可继承自AndroidViewModel,这里面会维护ApplicationContext,不要将Activity中context或者其他context传入ViewModel,因为ViewModel的生命周期比Activity或者Fra
2020-10-20 19:34:00 174
原创 Android Jetpack - Lifecycle
简介Lifecycle 是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。说白了以前通过各种方式在Activity和Fragment的生命周期里处理的其他类的回调,现在可以通过Lifecycle放到那个类的里面,在Activity和Fragment只要设置一下观察对象即可。举个例子:播放器需要在stop里面暂停,start或restart里面开始播放,这些原本需要在Activity中手动调用的,现在都可以封装到播放器那个类的里面让他自
2020-10-20 19:02:58 97
原创 java注解
https://blog.csdn.net/briblue/article/details/73824058注解相当于标签,标签是定义一个事物的行为类别,被注解的类或者方法说明他有该注解的行为定义:public @interface TestAnnotation{}创建注解使用:在需要的地方加上 @TestAnnotation(),如果该注解没有任何属性则可以省略(),@TestAnn...
2020-10-16 14:24:18 146
原创 Android_seekBar
1.给seekbar换颜色,setThumb会改变progress的高度//先设置一个thumb再设置ProgressmSeekBar.setThumb(ContextCompat.getDrawable(mContext, R.drawable.seek_thumb_normal));if (hasFocus){ mSeekBar.setProgressDrawable(ContextCompat.getDrawable(mContext, R.drawable.seek_progress_foc
2020-07-23 15:36:31 172
原创 文件读写_Okio
详细内容见https://blog.csdn.net/lyabc123456/article/details/88830541在OKio中,将所有的输入称为Source,将所有的输出称为Sink, Source与Sink定义了对外提供的接口。 OKio所做的,就是实现原始数据与Source与Sink间的互动。Sources类似java的Inputstream,Sinks类似java的Outputstream。ByteString:不可变的字节序列,自动编码和解码为十六进制、base64和utf-8B
2020-07-20 14:05:16 1274
原创 数据解析_Gson
简单使用//反序列化new Gson().fromJson("", Object.class);//序列化new Gson().toJson(Object);在序列化和反序列化时,是用JsonReader和JsonWriter 来实现的,这边可以自己使用它们来手写具体是在类的上面加上注解@JsonAdapter(自定义的TypeAdapter.class) ,然后直接new Gson即可。也可以通过GsonBuilder的registerTypeAdapter来设置一个TypeAdapter
2020-07-20 13:58:10 185
原创 Android 使用腾讯TBS
接入SDK接入1.jar包:https://x5.tencent.com/tbs/sdk.html2.Gradle:api ‘com.tencent.tbs.tbssdk:sdk:43903’权限配置<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_
2020-07-08 17:43:39 4609 2
原创 Android 项目中使用aar文件需要的配置
正常使用1.将文件放到 module名/lib 目录下2.android{…repositories {flatDir {dirs ‘libs’ // aar目录}}…}3.implementation (name: ‘aar的名称’, ext: ‘aar’)子module中使用如果是子module中使用了aar,子module的gradle文件按照上述配置即可主module添加的配置如下android{…repositories {flatDir {dirs ‘l
2020-06-24 11:31:31 547
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人