自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 源码分析MediaStore是如何管理文件的(三)

继续回到之前MediaProvider的query方法,1305 String groupBy = null;1306 DatabaseHelper helper = getDatabaseForUri(uri);1307 if (helper == null) {1308 return null;1309 }...

2019-07-20 16:35:16 491

原创 源码分析MediaStore是如何管理文件的(二)

我们来重点分析MediaProvider,首先MediaProvider继承自ContentProvider,一定实现了query方法,我们找到这个query方法,方法很长,我们一部分一部分来看: uri = safeUncanonicalize(uri);首先这个safeUncanonicalize方法就不懂,跟踪它,1267 private Uri safeUncanonical...

2019-07-20 16:33:48 377742

原创 源码分析MediaStore是怎么管理文件的(一)

Cursor cursor = getContentResolver().query( Uri.parse("content://media/external/file"), projection, MediaStore.Files.FileColumns.DATA + " not like ? and...

2019-07-20 16:32:24 151468

原创 Handler机制

Looper.prepare主线程的Looper在ActivityThread中创建,首先从ThreadLocal中获取一个Looper,如果不存在,那么就会创建一个looper和消息队列messageQueue。ThreadLocal是java提供的用于保存不同线程之间数据的一种机制。每个线程中都会有一个ThreadLocalMap,ThreadLocalMap内部是一个WeakRefere...

2019-05-26 21:49:59 99

原创 Activity的四种启动模式

Standard标准模式,在这种模式下系统不会考虑是否存在相同实例。谁启动了Activity,那么这个实例就在谁的Task之中。SingleTop栈顶复用模式,如果栈顶和要创建的实例相同,那么直接饮用,否则创建。SingleTask栈内复用模式,当栈内内存在相同实例,那么就会复用该实例。并且移除上面所有的实例。如果是别的应用程序调用这个实例,如果不存在,那么就会建立一个新的task,...

2019-05-26 20:33:24 76

原创 Activity和Service的生命周期

Acitivty有6个生命周期,created,started,resuemed,pause,stop,destory,只有resumed,paused,stopped这三个状态能够长久存在。resumed:继续状态,又称为运行态,在这种状态下是可见的,并且能够执行代码。paused:暂停状态,在这种状态下,Acitivity处于半透明或者被其他Activity遮挡的状态,不能够执行代码。...

2019-05-26 16:00:12 281

原创 Android知识点总结

AndoridAndorid系统架构

2019-05-26 11:43:09 82

原创 Android系统架构

应用程序是用java语言开发的,开发人员一般位于这一层。应用程序框架视图包括列表,按钮,网格,文本框等内容提供器使得一个应用程序可以访问另一个应用程序的数据通知管理器使得应用程序可以在通知栏中显示自定义信息资源管理器用于访问非代码资源,如本地字符串,图形,布局文件活动管理器用来管理应用程序的生命周期和导航栏的回退功能系统运行库Bonic系统C库,专门为嵌入式li...

2019-05-26 11:42:40 111

原创 事件总线EventBus

解析EventBusEventBus是一款针对Android发布的发布——订阅事件总线。EventBus三要素:Event:事件,可以是任意类型的对象。Subscribe:事件订阅者,3.0之后订阅者可以随便取名,需要添加注解@Subscribe。Publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用Post方法即可,可以使用自己实例化的EventBus对象。Eve...

2019-05-09 09:40:50 1087

原创 一些常用设计模式

简单工厂模式简单工厂属于创建型模式,这是一个工厂对象决定创建出哪一种产品类的实例。简单工厂有如下角色:Factory工厂类,这是简单工厂模式的核心,工厂类的创建产品类的方法可以被外界直接调用,创建所需产品的对象。IProduct:抽象产品类,这是简单工厂所有产品的父类,负责描写所有产品的共有的公共接口。Product:具体产品类,这是简单工厂的创建目标。简单工厂的使用场景:优点:用...

2019-05-06 21:17:42 55

原创 源码解析Retrofit

Retrofit是针对Android网络请求的框架,底层是基于OkHttp实现的,更多使用运行时注解的方式提供功能。Retrofit基本用法首先需要配置build.gradle implementation 'com.squareup.retrofit2:retrofit:2.1.0' implementation 'com.squareup.retrofit2:convert...

2019-05-06 11:09:26 87

原创 源码解析OkHttp

请求处理我们请求网络的时候需要OkHttpClient.newCall(request)进行execute或者enqueue操作;当调用newCall方法时,会调用如下代码: @Override public Call newCall(Request request) { return new RealCall(this, request, false /* for web sock...

2019-05-04 19:03:54 143

原创 engine方式封装OkHttp的异步GET

OkHttpEngine首先,OkHttp是通过单例模式得到的。单例模式有一个私有的构造方法和一个静态的get方法。先看构造方法中做了什么。 private OkHttpEngine(Context context) { File sdcache = context.getExternalCacheDir(); int cacheSize = 10 * 1...

2019-04-29 20:27:04 347

原创 多线程

线程和进程线程是CPU调度的最小单元,进程是系统资源管理的最小单元,线程之间的切换开销更小,一个进程包括多个线程。线程的状态线程有六种状态:New:线程新创建,没有调用start方法,在线程运行前做一些基础工作。Runnable:调用了start方法,此时线程进入就绪状态,可能在运行,也可能不在运行。Blocked:线程被锁阻塞。Waiting:线程不活动,占用最小的资源,直到调度器...

2019-04-28 10:10:40 122

原创 View和动画

View是所有控件的基类,布局控件继承自ViewGroup,ViewGroup是所有View和ViewGroup的集合。ViewGroup也是继承自View。Android坐标系:以屏幕左上方为原点,触控事件getRawX(),getRawY()得到的就是Android坐标。View坐标系 :和Android坐标系共同存在,如图:根据图,获取自身高度可以通过getBottom()-getT...

2019-04-27 12:18:47 125

原创 几种Notification

普通Notification tv_normal = findViewById(R.id.tv_normal); tv_normal.setOnClickListener(this); notificationManager =(NotificationManager) getSystemService(NOTIFICATION_SERVICE);首先在onCreate...

2019-04-24 22:16:25 179

原创 单例模式

当一个对象需要消耗很多资源的时候,就要考虑使用单例模式。单例模式的关键点(1)一个私有的构造函数。(2)通过枚举或者静态方法返回实例。(3)确保对象只有一个。(4)确保反序列化的时候不会重新构建。单例模式的具体实现饿汉模式:在创建的时候就进行实例化。懒汉模式:在需要的时候才进行实例化。DCL模式:public class Singleton { private stat...

2019-04-24 16:49:20 80

原创 RecyclerView详解(一)

布局首先看布局,首先需要一个RecyclerView的View,然后需要一个子布局,子布局需要放在另一个布局文件中,原因是之后的inflate方法需要传入的参数是一个布局文件。 <android.support.v7.widget.RecyclerView android:id="@+id/id_recyclerview" android:layout...

2019-04-23 21:41:29 292

原创 Activity

七个生命周期onCreate onRestart onStart onResume onPause onResume onDestory(1)当第一次开始新的活动时,调用如下:onCreare -> onStart -> onResume(2)当用户打开新的Activity或者回到桌面时,从前台到后台,从可见到不可见,因此调用onPause -> onStop,当新活动时透...

2019-04-23 10:36:56 82

原创 Android学习笔记(十二)

全局获取Context首先需要实现自定义MyApplication继承Application,然后在AndroidManifest.xml的<Application>标签下配置MyApplication,这里需要使用全类名。MyApplication中存储了静态的Application级别的Context,使用时直接调用MyApplication.getContext即可。使用In...

2019-04-20 21:56:30 140

原创 Android读书笔记(十一)

服务是程序后台的解决方案。服务不依赖于任何用户界面,而是依赖一开始创建它的程序。多线程编程和java中一样,多线程的实现方式有两种,一种是继承Thread类,一种是实现Runnable方法。利用异步处理在子线程中进行UI操作首先在子线程中,发送一个消息Message,然后通过Handler对消息进行处理。这样就能在子线程中使用UI界面了。 private Handler handl...

2019-04-19 09:42:21 84

原创 安卓读书笔记(十)

使用WebViewWebView是一个不需要打开浏览器就能显示网页的控件。WebView.setWebViewClient能够创建一个client实例,这样在网页跳转的时候还是使用WebView而不是浏览器。要使用WebView还要声明网络功能的权限。使用HttpConnection用于发送http请求,可以设置请求方式,超时时间等。每次发送请求,我们开启一个线程,但是由于结果是不能在子线...

2019-04-18 16:38:29 271

原创 Android学习笔记(九)

通知的用法需要一个NotificationManger来进行管理,如图:NotificationManager manager = (Notification) getSystemService(context.NOTIFICATION_SERVICE)通过builder来得到Notification对象。Notificaion notification = new Notificatio...

2019-04-18 09:51:49 82

原创 Android学习笔记(八)

内容提供器主要是为了程序之间共享数据,同时还保证安全性。运行时权限权限机制:用户在安装程序时会得到程序获得的权限的提醒,同时用户能够查看任意一个程序获得的权限。运行时权限是为了用户能够在程序运行过程中为软件授权而不需要在安装时一次性授权。权限分为危险权限和普通权限,普通权限系统自动授权,危险权限需要用户手动授权。由于打电话是危险权限,需要在运行时授权。首先用ContextCompat查询当...

2019-04-17 16:09:20 129

原创 Android读书笔记(七)

将数据存储到文件中Context有方法openFileOutput将数据存储到文件中,openFileOutput指定两个参数,第一个参数是文件名,第二个参数是模式。文件默认存储在/data/data/<packagename>/files下,模式有两种,一种是MODE_PRIVATE,相同文件名会覆盖,一种是MODE_APPEND,相同文件名会追加内容。它返回的是一个人FileOu...

2019-04-17 09:43:38 120

原创 Android读书笔记(六)

广播机制每个应用都能对自己干兴趣的广播进行注册,广播可能来自系统,也可能来自其他程序。广播分为两种类型标准广播有序广播标准广播是完全异步执行的广播,其他的应用程序几乎在同一时间收到广播。有序广播是同步执行的广播,同一时间只有一个广播接收器接收信息。优先级高的广播接收器可以截断广播。注册广播广播注册有两种方式:动态注册:在程序中注册在主活动中配置IntentFilter接收关...

2019-04-15 22:15:23 295

原创 Android读书笔记(五)

使用fragment使用两个布局文件,left_fragment.xml和right_fragment.xml,然后新建两个类LeftFragment和RightFragmet,分别继承Fragmnet类,实现onCreateView方法,然后在活动布局activity_main.xml中添加这两个碎片。动态加载fragment创建要添加的碎片实例获取FragmentManager,在活...

2019-04-14 22:20:49 193

原创 Android读书笔记(四)

自定义控件首先需要自定义一个布局类,然后通过构造函数借助LayoutInflater动态加载布局文件,从而获得布局文件中的空间,然后为控件添加事件,如图:public TitleLayout(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(cont...

2019-04-14 17:17:57 119

原创 Android读书笔记(三)

IntentIntent分为两种,显式Intent和隐式Intent。显式Intent的构造函数需要两个参数,第一个参数是上下文,第二个参数是class,指定要启动的活动,创建好的Intent通过startActivity方法启动。 public void onClick(View v) { Intent intent = new Intent(FirstActivit...

2019-04-13 20:23:21 262

原创 Android读书笔记(二)

活动是什么活动是一种可以包含用户界面的组件。使用Toast来提醒根据id的方式来获取资源文件中的button对象,为该对象设置一个监听器,监听器要重写onclick方法,使用Toast的静态方法makeText,第一个参数指定上下文context, 活动就是一种context,因此直接指定当前的活动即可,第二个参数指定要显示的内容,第三参数指定要显示的时长,然后调用show()方法显示。p...

2019-04-12 22:03:36 144

原创 Android读书笔记(一)

系统架构linux内核 包括各种驱动运行库 比如SQLite提供数据库, OpenGL|ES提供3D绘图,WebKit提供web内核* 应用框架层 主要提供各种API应用层四大组件活动(Activity)服务 (Service)广播接收器 (Broadcast Receiver)内容提供器 (Content Provider)SQLiteandroid提供的...

2019-04-12 19:39:42 665

原创 TreadPoolExcutor的工作原理

主要方法ThreadPoolExecutor(int,int,long,Timeunit,BlockingQueue,TreadFactory,RejectedExecutionHandler)executor(runnable)放入线程执行,如果线程为空,那么抛出空指针异常工作原理如果当前的线程数小于corePoolSize则调用addIfUnderCorePoolSize方法添加进程,...

2019-03-23 19:36:35 189

原创 thymeleaf官方文档中文翻译(二)

2.1 为一个杂货店搭建一个网站来演示thymeleaf(泰木力副,很多人会念错)特性:uml破图要先理解一下:顾客:id,姓名,起始日期订单:id,日期,顾客的包装类,订单条目的包装类订单条目: 产品,数量,价格商品:id,名称,价格,是否在库,评论列表评论:id,文本再弄一个简单的服务层:简单说就是实现两个功能:查找所有商品和查找单个商品然后就是balabala一大堆实现co...

2018-11-14 12:03:18 941

原创 thymeleaf官方文档中文翻译(慢更)(一)

应该会从头到尾翻译一遍,挑重要的来整理一个能用的文档。由于水平有限,肯定不到位,将就着看看就行。1.1-1.2 说了一些废话,就是thymeleaf能够模板化这些东东。1.3 说了thymeleaf提供了官方方言,少数大佬们也可以玩自己的方言。然后就是可以用th:text这种可以来改版input框中的内容,这样的话静态页面中的内容就是James Carrot,经过模板渲染就是${user...

2018-11-14 11:26:20 1946

原创 (leetcode) reorderlist

public class Solution { public void reorderList(ListNode head) { if (head == null || head.next == null){ return; } ListNode chaser = head; ListNode runn...

2018-11-07 15:24:08 92

原创 (leetcode)不使用递归进行先序遍历

public class Solution { public ArrayList&lt;Integer&gt; preorderTraversal(TreeNode root) { ArrayList&lt;Integer&gt; list = new ArrayList(); Stack&lt;TreeNode&gt; stack = new Stack(...

2018-11-07 11:24:46 293

原创 (leetcode)二叉树非递归后序遍历

public class Solution { public ArrayList&lt;Integer&gt; postorderTraversal(TreeNode root) { ArrayList&lt;Integer&gt; result=new ArrayList(); Stack&lt;TreeNode&gt; stack=new Stack()...

2018-11-06 16:00:17 420

原创 (leetcode)链表的插入排序

public class Solution { public ListNode insertionSortList(ListNode head) { ListNode dummy = new ListNode(Integer.MIN_VALUE); //新建一个链表头,用来保存已经排序好的链表 //cur指针,用于指向当前需要处理的结点 ...

2018-11-04 21:09:18 83

原创 (leetcode)链表排序,时间(nlogn)空间 (1)

只有归并排序满足要求public class Solution { public ListNode findMiddle (ListNode head){ ListNode chaser = head; ListNode runner = head.next; while (runner!=null &amp;amp;amp;&amp;amp;amp; runner.ne...

2018-10-31 14:13:13 166

原创 (leetcode) max-points-on-a-line

import java.util.*;public class Solution { public int maxPoints(Point[] points) { int res=0; for (int i=0;i&lt;points.length;i++){ Point a = points[i]; int...

2018-10-29 11:15:11 73

空空如也

空空如也

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

TA关注的人

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