自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Flutter Android studio 新建工程一直等待 解决办法

Flutter Android studio 新建工程一直等待 解决办法最近在新电脑上的AS上搭建Flutter开发环境,搭建完毕后发现新建项目一直卡死不动。经过多方周折终于解决了。现在把具体步骤列一下:如果已经创建了项目并且卡死5min以上,先强制退出AS并彻底删除项目可能因为默认下载依赖是外网环境,所以可以改下依赖源为国内的export PUB_HOSTED_URL=https://pub.flutter-io.cnexport FLUTTER_STORAGE_BASE_URL=https

2021-03-06 15:41:08 600 1

原创 Https加密原理

我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。HTTPS简介HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。

2016-11-16 20:08:58 861

原创 Android Service Framework

Android Service Framework是一系列类的集合,它用来开发运行在Android平台上的各项服务。Android Service Framework提供了设计精良、复用度高的服务设计和实现,开发者可以使用Android Service Framework提供的各种类和接口,快速开发出可靠优良的服务。

2016-10-30 21:01:20 673

原创 Android IPC Binder

Binder原本是IPC工具,但是在Android中它的主要作用是支持RPC(Remote Procedure Call),使得当前进程调用另一个进程的函数就像调用自身的函数是一样轻松简单。Binder由Service Server(含有Android的服务)、Service Client(使用服务的客户端)、Context Manager(确定服务的位置)、以及Binder Dirver四部分组成。

2016-10-27 21:24:26 342

原创 Android服务概要

Android服务的种类Android服务主要分为两类,一类是系统服务,它们是由Framework提供的;另一类是应用程序服务提供的,它们是应用程序开发者继承并实现Service类后开发的。 服

2016-10-26 22:26:02 504

原创 Zygote

从字面上看,Zygote是“受精卵、结合子”的意思。在Android中,Zygote是Android系统中相当重要的进程。它的主要功能是执行Android应用程序。在Android系统中运行新的应用,如同卵子受精分裂一样,需要跟Zygote进程结合后才能执行。

2016-10-26 12:52:19 534

原创 init进程

前言众所周知的是,Linux中的所有进程都是由init进程创建并运行的。首先Linux内核启动,然后在用户空间启动init进程,再依次启动系统运行的其他进程。在系统启动完成后,init进程会作为守护进程监视其他进程。若是某个监视中的进程一旦终结,进入到僵死状态,它就会释放进程所占用的系统资源。其实,在Android平台中也存在init进程,除了提供以上常见的功能外,还提供几种额外的功能。与Linux

2016-10-25 20:49:37 812

原创 JNI与NDK

前言Android FrameWork由基于java语言的java层与基于C/C++语言的C/C++层组成的,每个层中的功能模块都是使用相应的语言编写的,并且每个层中的大部分模块是保持着千丝万缕的联系的。在Android FrameWork中,需要提供一种媒介或者桥梁,将java层和C/C++层有机的联系在一起,使得他们相互协调,共同完成某些任务。在这两层之间充当桥梁任务的就是java本地接口【JN

2016-10-25 20:41:25 475

原创 JVM运行时的数据区

理解JVM运行时的数据区是Java编程中的进阶部分。我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机制,那么前面的问题就会迎刃而解。在这片文章中,我们将简单了解JVM中有哪些运行时数据区以及这些数据区的工作机制。程序计数器 (Program Counter (PC) Register) JVM栈 (

2016-10-07 17:00:52 207

原创 说说PendingIntent的内部机制

1 概述 在Android中,我们常常使用PendingIntent来表达一种“留待日后处理”的意思。从这个角度来说,PendingIntent可以被理解为一种特殊的异步处理机制。不过,单就命名而言,PendingIntent其实具有一定误导性,因为它既不继承于Intent,也不包含Intent,它的核心可以粗略地汇总成四个字——“异步激发”。 很明显,这种异步激发常常是要跨进程执行的。

2016-09-06 14:43:54 774

原创 绑定服务

绑定服务是客户端-服务器接口中的服务器。绑定服务可让组件(例如 Activity)绑定到服务、发送请求、接收响应,甚至执行进程间通信 (IPC)。 绑定服务通常只在为其他应用组件服务时处于活动状态,不会无限期在后台运行。本文向您介绍如何创建绑定服务,包括如何绑定到来自其他应用组件的服务。 不过,您还应参阅服务文档,了解有关一般服务的更多信息,例如:如何利用服务传送通知、如何将服务设置为在前台运行等等

2016-07-22 15:19:03 389

转载 Android退出应用的方式

一、容器式建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Activityimport java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;public class BaseActivity extends Activity

2016-05-19 22:18:55 267

原创 Android Context完全解析

Context相信所有的Android开发人员基本上每天都在接触,因为它太常见了。我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析,Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的Android工程环境,在这个环境下

2016-05-19 21:31:39 213

原创 说说Android中的ANR

有过Android开发经历的人都不会对ANR陌生,它和崩溃一样是程序设计的问题。本文将以较为深入的视角来介绍什么是ANR,出现场景,如何避免以及如何定位分析ANR,希望可以帮助大家在编写程序时有所帮助。什么是ANRANR全称Application Not Responding,意思就是程序未响应。如果一个应用无法响应用户的输入,系统就会弹出一个ANR对话框,如下图所示,用户可以自行选择继续等待亦或者

2016-05-18 20:35:56 250

原创 杂记

字符串拼接java中的字符串在做拼接的时候是不会产生中间对象的。因为当Java编译器遇到字符串拼接的时候,会创建一个StringBuilder对象,后面的拼接,实际上是调用StringBuilder对象的append方法。内部类可以访问外部类中的私有变量的原因在内部类构造的时候,会将外部类的引用传递进来,并且作为内部类的一个属性,所以内部类会持有一个其外部类的引用。非静态内部类导致的内存泄露在Act

2016-05-18 20:28:02 269 1

原创 比较 GET 与 POST

很简单,就是一张图。很能说明问题,简单直接。

2016-05-15 21:13:12 269

转载 浅谈 磁盘调度算法

磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列,常用的磁盘调度算法有以下四种: 先来先服务算法(FCFS), 最短寻道时间优先算法(SSTF), 扫描算法(SCAN), 循环扫描算法(CSCAN)例:假定某磁盘共有200个柱面,编号为0-199,如

2016-05-15 10:54:38 307

转载 几种常见页面置换算法分析

评价一个算法的优劣,可通过在一个特定的存储访问序列(页面走向)上运行它,并计算缺页数量来实现。1 先入先出法(FIFO)最简单的页面置换算法是先入先出(FIFO)法。这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。理由是:最早调入内存的页,其不再被使用的可能性比刚调入内存的可能性大。建立一个FIFO队列,收容所有在内存中的页。被置换页面总是在队列头上

2016-05-15 10:52:34 3995

转载 Java锁机制

一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁); 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻塞在锁池等待队列中)。 取到锁后,他就开始执行同步代码(被synchronized修饰的代码);线程执行完同步代码后马上就把锁还给同步对象,其他在锁池中等待的某个线程就可以拿到锁执

2016-05-12 21:48:14 274

原创 Interface与abstract类的区别

1、 抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。 2、 在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据(不过一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。 3、抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。抽象类和接口是

2016-05-09 20:11:55 274

原创 Fragment和Activity

(一)Fragment和Activity的交互一个Fragment的实例总是和包含它的Activity直接相关。 Fragment可以通过getActivity() 方法来获得Activity的实例,然后就可以调用一些例如findViewById()之类的方法。   如: View listView = getActivity().findViewById(R.id.list);  但是注意调用

2016-05-08 17:10:10 1112

原创 HashMap的实现原理

1. HashMap的数据结构数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。数组和链表的区别主要体现在以下几个方面: 1)逻辑结构:数组必须事先定义固定的长度(元素个数),不能适应数据动态地递增的情况,即在使用数组之前,就必须对数组的大小进行确定。当数据增加时,可能超出原来定义的元素个数;当数据减少时,造成内存浪费。数组中插入、删除数据项时,需要移动其他数据项。而链表采用动

2016-05-08 10:15:37 594

原创 第10章 Android的消息机制

本章主要讲的内容是Android的消息机制。 Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。MessageQueue就是我们常说的消息队列,它的内部存储了一组消息,虽然叫做消息队列,但是它的内部却是采用单链表的数据结构才存储消息列表的。Looper为消息循环,由于MessageQueue只是一个消息的存储单元,

2016-05-06 22:47:25 1346

原创 第11章 Android的线程和线程池

线程在Android中是一个很重要的概念,从用途上来说,线程分为主线程和子线程,主线程主要处理的是和界面相关的事情,而子线程则往往用于耗时的操作。由于Android的特性,如果在主线程中执行耗时操作就容易导致程序无法及时响应。除了Thread本身外,Android中可以扮演线程角色的还有很多很多,比如: AsyncTask,IntentService和HandlerThread。不同形式的线程虽然

2016-05-05 21:42:25 1786

原创 第1章 Activtiy的生命周期和启动模式

1.1 Activtiy的生命周期全解 Activity的生命周期分为两部分内容,一部分是典型情形下的生命周期,另一个就是异常情形下的生命周期。所谓的典型情形下的生命周期是指在用户参与的情况下,Activity所经历的生命周期的改变;而异常情况下的生命周期是指Activity被系统回收或者由于当前设备的Configuration发生变化而导致的Activity被销毁重建。 1.1.1 典型情况下

2016-05-05 09:34:28 2120

原创 Android IPC之Messager用法示例

Messager可以翻译为信使,顾名思义,通过它可以在不同进程中传递Message对象,在Message中放入我们需要传递的数据,就可以轻松地实现数据的进程间穿传递了。Messager是一种轻量级的IPC方式,它的底层实现是AIDL。这个大家可以下去看一下Messager的构造方法就知道了。 Messager的使用方法很简单,它对AIDL做了封装,使得我们可以更简便的进行进程间通信。同时,由于它

2016-04-24 20:18:36 613

原创 深入了解Handler消息机制(二)

上一篇主要说了: (1)Message,MessageQueue,Looper,Handler的工作原理就像是工厂的生产线。待加工的产品就是Message,“传送带”就是MessageQueue,电动机就是Looper,工人们就对应于处理事件的Handler。 (2)Android系统用链表来实现Message的缓存消息池。我们知道Android的应用程序的入口是ActivityThread.m

2016-04-14 00:05:38 394

原创 深入了解Handler消息机制(一)

在Android开发了一段时间之后,很多读者应该知道了一个知识点:UI不能在子线程中更新。这本来是一个伪命题,因为并不是UI不可以在子线程中更新,俄日好似UI不可以在不是它创建的线程中更新。只是绝大多数情况下UI都是从UI线程中创建的,因此在其他线程更新时会抛出异常。在这种情况下,当我们在子线程中完成了耗时操作之后,通常会通过一个Handler将结果传递给UI线程,然后在UI线程中更新相关的视图。

2016-04-13 21:50:04 371

原创 Android中的Binder跨进程通信机制

在code的世界里,两个对象能直接通信的前提是这两个对象都存在于相同的内存地址空间中,如果两个对象分别存在于两个不同的进程中,那么这不同进程的两个对象是不能直接相互调用的,这时我们就需要用到一种跨进程通信技术,使存在于两个不同进程的对象能够相互访问。 传统的跨进程通信方式有很多,比如Socket、信号量、管道、消息队列和共享内存等,这些传统的跨进程通信方式都在Linux系统中存在。大家都知道And

2016-04-11 22:34:07 733

原创 深入理解Java:类加载机制与反射

一、Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java

2016-04-09 11:35:36 559

原创 Java并发编程中实现原子操作

引言 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。 术语定义 处理器如何实现原子操作 32位IA-32处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。 3

2016-04-09 09:55:36 390

原创 快速排序

int Division(int a[],int left,int right){ int base = a[left]; while(left<right){ while((left<right) && (a[right]>base)) right--; a[left] = a[right]; while((l

2016-04-07 23:58:49 224

原创 三大简单排序

冒泡排序:void BallocSort(int a[],int n){ int i,j,tmp; int flag = 1; for(i = 0;i<n-1;i++){ flag = 0; for(j = 0;j<n-i;j++){ if(a[j+1]<a[j]){ tmp = a[j+1]

2016-04-07 23:36:22 327

原创 java中volatile关键字的含义

在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程

2016-04-07 11:28:58 264

原创 C语言中Static和Const关键字

C语言中Static和Const关键字的的作用 static作用:“改变生命周期” 或者 “改变作用域”  程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。1.作用于变量:   用static声明局部变量——-局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域),其缺省的存储方式是自动变量或说是动态存储的,即指令执行到变量定义处时才给变量分

2016-04-07 09:48:26 469

原创 Java的反射机制

以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出一,WHAT?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。二,HOW?首先,你要获得类对象(注意一下类对象和类的对象的区别,不知道的嘛,

2015-11-03 22:46:14 299

原创 scheduleAtFixedRate 与 scheduleWithFixedDelay 区别

scheduleAtFixedRate 与 scheduleWithFixedDelay 区别 关于上述话题,仅以代码说明package day1013_Timer;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.Executors

2015-10-14 19:36:21 1421

原创 构造器、基类和构造器

基类的构造器总是在导出类的构造过程被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。这样做是有意义的,是因为构造器具有一项特殊任务:检查对象是否被正确的构造。导出类只能访问他自己的成员,不能访问基类中的成员(基类成员通常是private类型)。只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化。因此,必须令所有的构造器都能得到调用,否则就不可能正确构造完整对象

2015-09-09 21:50:48 451

原创 初始化基类

导出类就像是一个与基类具有相同接口的新类,或许还会有有一些额外的方法和域。但继承并不只是复制基类的接口。当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。二者区别在于,后者来自于外部,而基类子对象被包装在导出类对象的内部。当然,对基类子对象的正确初始化也是至关重要的,而且也仅有一种方法来保证这一点:在构造器中调用基类构造器来执行初始化,而基类

2015-09-09 18:05:51 943

原创 初始化引用

如果想初始化这些引用,可以在代码中的这些位置中进行:1,在定义对象的地方,这意味着他们总是能够在构造器被调用之前被初始化;2,在类的构造器中;3,就在正要使用的这些对象之前,这种方式被成为惰性初始化。在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担;4,使用实例初始化。

2015-09-09 17:47:11 986

空空如也

空空如也

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

TA关注的人

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