Git
Git
1、Git工作流程
工作区域
工作区(Workspace):进行开发改动的地方,是你当前看到的,也是最新的。平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。
暂存区(Index/Stage):保存了下次将要提交的文件列表信息。在.git目录下的index文件,暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp),可以使用git status查看暂存区的状态。暂存区标记了当前工作区中,哪些内容是被git管理的。当完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。
本地仓库(Repository):保存了对象被提交过的各个版本。相比工作区和暂存区的内容要旧,git commit后同步index的目录树到本地仓库。
远程仓库(Remote):远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,它的内容是最旧的。如Github、Gitee或局域网的一台电脑。
文件状态
已修改(modified):表示修改 ...
PMS亮灭屏流程
PMS亮灭屏流程
1、亮屏流程
PMS模块提供了亮屏接口供应用或组件点亮屏幕。
wakeup()方法
123456789101112/** * @param time 亮屏时间 * @param reason 亮屏原因 * @param details 细节描述 */public void wakeUp(long time, @WakeReason int reason, String details) { try { mService.wakeUp(time, reason, details, mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); }}
调用PowerManager的wakeup()方法后,将直接调用PMS.BinderService中的wakeup()方法。
**Binder:**在Android系统中,Binder用来实 ...
WakeLock锁机制
WakeLock 锁机制
1、WakeLock锁简介
WakeLock是Android系统中一种锁的机制,当进程持有这个锁,系统则不会进入休眠状态。在申请WakeLock锁时,需要在AndroidManifest.xml文件中配置android.Manifest.permission.WAKE_LOCK 权限。
WakeLock锁分类:
根据作用时间,WakeLock可以分为永久锁和超时锁。
永久锁:在获取了WakeLock锁后必须显式的释放,否则系统会一直持有该锁。
超时锁:在到达给定时间后会自动释放WakeLock锁。
根据释放原则,WakeLock可以分为计数锁和非计数锁,默认为计数锁。
计数锁:一次申请必须对应一次释放。
非计数锁:不管申请多少次,一次就可以释放该WakeLock。
2、WakeLock的等级
WakeLock具有以下七种等级:
123456789101112131415161718192021//如果持有该类型的 wakelock 锁,则按 Power 键灭屏后,即使允许屏幕、按键灯灭,也不会释放该锁,CPU 不会进入休眠状态public s ...
PMS
PMS
PowerManagerService是负责管理、协调设备电源管理的系统服务之一,它在Framework层建立起一个策略控制方案,向下决策HAL层以及kernel层来控制设备待机状态、控制显示屏、背光灯、距离或光线传感器等硬件设备的状态。向上提供给应用程序相应的操作接口,如听音乐保持系统唤醒、应用通知唤醒屏幕等场景。
该类继承自SystemService,具有生命周期方法,由SystemServer启动并注册到系统服务中,通过Binder和其他组件进行交互。
生命周期方法:(1)Constructor:通过反射调用,获取实例;(2)onStart()方法:开启对应的SystemService;(3)onBootPhase()方法:在SystemService服务启动过程中指定服务的启动阶段,每个阶段的工作。
1、PMS的启动
PMS和SystemService的其他子类一样由SystemServer通过反射的方式启动。首先,在SystemServer的main()方法中调用自身的run()方法,并在run()方法中启动三类服务:引导服务、核心服务和其他服务,引导服务就包括了 ...
Android第一行代码阅读笔记
Android第一行代码阅读笔记
1、Android系统简介
1.1、Android系统架构
Linux内核层:Android 系统基于Linux内核,这一层为Android 设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、相机驱动、蓝牙驱动、WiFi驱动、电源管理。
系统运行库层:这一层通过一些C/C++库来为Android系统提供主要的特性支持,如SQLite提供数据库的支持,OpenGL|ES库提供3D绘图的支持,Webkit库提供浏览器内核的支持。以及一些核心库允许开发者构建Android应用。
应用框架层:这一层提供了构建应用程序可能用到的各种API。
应用层:所有安装在手机上的应用程序都是属于这一层的。
1.2、Android系统四大组件
活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)
2、活动
活动是一种包含用户界面的组件,用于和用户交互。
2.1、创建一个Activity
1、新建一个empty activity
1234567891011121314 ...
Java基础知识回顾
Java基础知识回顾
1、泛型
1、Java中的泛型是什么?使用泛型的好处。
泛型用以在集合中存储对象并在使用时进行类型转换。它提供了编译期的类型安全。
2、Java的泛型是如何工作的?什么是类型擦除。
泛型通过类型擦除来实现,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。
3、泛型中的限定通配符和非限定通配符。
限定通配符对类型进行了限制,有两种限定通配符,一种是<? extends T>,它通过确保类型必须是T的子类来设定类型的上界,另一种是<? super T>,它通过确保类型必须是T的父类来设定类型的下界。
2、注解
Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅取到辅助性的作用。
作用:1、生成文档。2、跟踪代码依赖性,实现代替配置文件功能。3、在编译时进行格式检查。
原理:注解本质是一个继承了Annotation 的特殊接口,其具体实现类是Java 运行时生成的动态代理类。而我们通过反射获取注解时,返回的是Java 运 ...
Hexo博客创建与迁移
Hexo博客创建与迁移
创建篇
1、git环境配置
1.1、git下载链接:git-scm.com/downloads
由于博客基于Github pages/gitee搭建,因此需要git环境推送博客文章。
打开git bash,运行如下命令配置GitHub。
12$ git config --global user.name "Your Name"$ git config --global user.email "email@example.com"
1.2、链接到远程环境
在git bash运行如下命令生成密钥。
1$ ssh-keygen -t rsa -C "your_email@example.com"
回车三次,即生成密钥,分别是秘钥和公钥,这里我们需要用到公钥,它被保存在了C/Users/xxx/.ssh/id_rsa.pub (windows)或者~/.ssh/id_rsa.pub(linux)中,找到并打开id_rsa.pub文件。
登录github,在网页的右上角,点击三角形,进入Setting页面, ...
验证回文字符串Ⅱ
验证回文字符串Ⅱ
问题陈述
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
算法实现
123456789101112131415161718192021class Solution{ public boolean validPalindrome(String s){ for(int i=0,j=s.length()-1;i<j;i++,j--){ if(s.charAt(i)!=s.charAt(j)){//不回文,右删除或右删除一位继续判断是否回文。 return isPalindrome(s,i+1,j)||isPalindrome(s,i,j-1); } } return true;//回文 } public boolean isPalindrome(String s,int i,int j){ while(i<j) ...
非递减数列
非递减数列
问题陈述
给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中所有的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。
1234567输入: nums = [4,2,3]输出: true解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。输入: nums = [4,2,1]输出: false解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
算法实现
12345678910111213141516public boolean checkPossi(int[] nums){ int cnt=0; for(int i=1;i<nums.length&&cnt<2;i++){ if(nums[i]>=nums[i-1]){ continue; } // ...
除自身以外数组的乘积
除自身以外数组的乘积
问题陈述
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
输入: [1,2,3,4]
输出: [24,12,8,6]
思路分析
对于给定索引 i,我们将使用它左边所有数字的乘积乘以右边所有数字的乘积得到除自身以外数组的乘积。
初始化两个空数组 L 和 R。对于给定索引 i,L[i] 代表的是 i 左侧所有数字的乘积,R[i] 代表的是 i 右侧所有数字的乘积。
我们需要用两个循环来填充 L 和 R 数组的值。对于数组 L,L[0] 应该是 1,因为第一个元素的左边没有元素。对于其他元素:L[i] = L[i-1] * nums[i-1]。
同理,对于数组 R,R[length-1] 应为 1。length 指的是输入数组的大小。其他元素:R[i] = R[i+1] * nums[i+1]。
当 R 和 L 数组填充完成,我们只需要在输入数组上迭代,且索引 i 处的值为:L[i] * R[i]。
代码实现
123456789 ...