手动获取权限(两种方法)
最新版方法12345678910111213141516171819202122232425262728//定义权限请求启动器private val requestPermissionLauncher=registerForActivityResult( ActivityResultContracts.RequestPermission() ){ isGranted-> if(isGranted){ init() }else{ Toast.makeText(requireContext(), "需要录音权限才能进行对话", Toast.LENGTH_SHORT).show() } }//检查并触发 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.o...
Android的消息机制
概述 Handler不是专门用于更新UI的,它只是常被开发者用于更新UI Android消息机制主要是指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程,这三个是一个整体 Handler作用是将一个任务切换到某个指定的线程中去执行 MessageQueue虽说叫消息队列但其内部存储结构并非队列,而是采用单链表的数据结构来存储消息列表 Looper可以理解为消息循环,会以无限循环的形式去查找是否有新消息,如果有就处理消息如果没有就等待 线程默认没有Looper,如果需要使用Handler就必须为线程创建Looper 为什么要提供在某个具体的线程中执行任务这种功能呢: Android规定访问UI只可以在主线程中进行 Android又建议不要在主线程中进行耗时操作不然会导致ANR 为什么不允许在子线程中访问UI Android的UI控件不是线程安全的 如果在多线程中并发访问可能导致UI控件处于不可预期的状态 为什么不对UI控件的访问加上锁机制呢? 加上锁机制会让UI访问的逻辑变得复杂 会降低UI访问效率,因为锁...
四大组件的工作过程
四大组件的运行状态 **概述 ** 四大组件除了BroadcastReceiver之外其他三种都必须在AndroidManifect中注册,BroadcastReceiver可以在AndroidManifect中注册也可以代码注册。调用方式上,Activity,service,BroadcastReceiver需要借助Intent,而ContentProvider无需借助Intent Activity 是一种展示型组件,是最重要的一种组件,对于用户来说Activity就是Android应用的全部,因为其他三种组件都是不可感知的。Activity主要作用是展示一个界面并和用户交互,它扮演的是一种前台界面的角色。只有一种运行模式即启动状态 Service 是一种计算型组件,用于在后台执行一系列计算任务。该组件工作在后台,用户无法感知其存在。该组件有两种状态,启动状态和绑定状态。当其处于启动状态在service内部可以做一些后台计算并且无需和外界有直接的交互;当其处于绑定状态,这个时候内部依然可以进行后台计算,但这种状态下外界可以很方便的与其进...
Window和WindowManager
Window和WindowManager 在Android系统中,Window有三种类型,分别是应用 window、子window、系统window。WindowManager与WindowManagerService的交互是一个IPC过程。 WindowManager常用的只有三个方法,即添加View、更新View和删除View,这三个方法定义在ViewManager中,而WindowManager继承了ViewManager 。 1234567891011WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.Layo...
Android动画深入分析
View动画View动画的种类 View动画的四种变化:平移动画,缩放动画,旋转动画和透明度动画。这四种变化对应着Animation的四个子类分别是TranslateAnimation,ScaleAnimation,RotateAnimation和AlphaAnimation。对于View动画来说,建议采用XML来定义,可读性更好 要使用View动画,首先要创建动画的XML文件,这个文件的路径为:res/anim/filename.xml。View动画是有固定语法的: 123456789101112131415161718192021222324252627282930<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_de...
将apiKey藏在项目中
由于如果将API直接写到项目中去上传到github上容易被发现所有需要将其藏起来,主要是以下几步: 先在根目录创建api_keys.properties用来存放apiKey 在根目录的build.gradle.kts中添加插件 1id ("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false 在app级的build.gradle.kts中加入插件 1id ("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") 在android{}闭包后面添加一串代码表示读取位置 123456secrets { propertiesFileName = "api_keys.properties" //忽略sdk.dir等系统属性只生成你需要的key ignoreList....
Android的Drawable
BitmapDrawable BitmapDrawable以**`**作为根节点: 12345678910bitmap |- src="@drawable/res_id" |- antialias="[true | false]" |- dither="[true | false]" |- filter="[true | false]" |- tileMode="[disabled | clamp | repeat | mirror]" |- gravity="[top | bottom | left | right | center_vertical | | fill_vertical | center_horizontal | fill_horizontal | | center | fill | clip_vertical | clip_horizontal]&quo...
RemoteViews
RemoteViews的应用RemoteViews在通知栏上的应用 先创建自定义布局 利用RemoteViews将布局应用到notification中 1234567891011121314151617181920212223242526272829303132333435363738394041 // 获取通知管理器 val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager //创建通道 val channelId = "default" if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( channelId, "默认通知", // 用户在设置里看到的...
View的工作原理
ViewRoot和DecorView ViewRoot对应于ViewRootImpl类,是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联。 View的绘制流程从ViewRoot的performTraversals开始,经过measure、layout和draw三个过程才可以把一个View绘制出来,其中measure用来测量View的宽高,layout用来确定View在父容器中的放置位置,而draw则负责将View绘制到屏幕上。 performTraversals会依次调用performMeasure、performLayout和performDraw三个方法,这三个方法分别完成顶级View的measure、layout和draw这三大流程。其中performMeasure中会调用measure方法,在m...
算法专题
双指针 定义:双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。最常见的双指针算法有两种:一种是,在一个序列里边,用两个指针维护一段区间;另一种是,在两个序列里边,一个指针指向其中一个序列,另外一个指针指向另外一个序列,来维护某种次序。 模版: 1234567891011for (int i = 0, j = 0; i < n; i ++ ) // j从某一位置开始,不一定是0{ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}//常见问题分类:// (1) 对于一个序列,用两个指针维护一段区间,比如快排的划分过程// (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作 **核心思想:*优化,将时间复杂度为O(nn)优化为O(n) **思路:**在利用双指针算法解题时,考虑原问题如何用暴力算法解出,观察是否可构成单调性,若可以,就...









