Android基础
文章平均质量分 68
Android必须掌握的通用基础
淡淡的宁静
非宁静无以致远,非淡泊无以明志
展开
-
framework中的binder调用哪些是阻塞调用哪些是立即返回的
调用AMS的方法,基本上都是阻塞调用,即ActivityManagerProxy中的方法mRemote.transact()使用的是的flag为0。调用ApplicationThread的方法,基本上都是非阻塞式调用,即立即返回。ApplicationThreadProxy中的方法mRemote.transact()使用的是IBinder.FLAG_ONEWAY(值为1)。就是sysytem_...原创 2018-12-24 16:22:11 · 1670 阅读 · 0 评论 -
binder通信中传递对象--利用AIDL实现传递自定义的类型
Android Service:利用Binder通信中,传递自定义类型AIDL中支持的数据类型AIDL中支持的数据类型有:支持类型 需要import 备注 Java基本类型 不需要import String, CharSequence, List, Map 不需要import List,Map内的元素必须是AIDL支持...原创 2019-06-12 13:59:06 · 1656 阅读 · 0 评论 -
内存泄露分析----native 层
概念概念在wikipedia这样解读内存泄漏的:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。详情请看wikipedia内存泄漏。内存不是无穷无尽的,是有限的,如果申请了,使用了,用完没有释放,那么这块内存...原创 2019-06-12 13:59:21 · 5845 阅读 · 0 评论 -
Android sqlite数据库操作
1.查询操作:简单的直接使用SQLiteDatabase#query(table_name,columns,selections,selectionArgs,groupby,having,orderby,limits)需要根据各种情况动态构建sql语句的,可以使用SQLiteQueryBuilder。用法如下:DatabaseHelper database = getDatabase...原创 2019-01-21 16:21:28 · 3243 阅读 · 0 评论 -
Dialog窗口和Activity窗口不一样的原因
如果创建Dialog时不传入一个Theme,则默认会使用R.style.Theme.Dialog。为什么Dialog和Activity的窗口都是使用Phone Window,都是DecorView,却显得不一样,主要因素是Theme不一样,导致其窗口属性和View的属性都不一样了。...原创 2019-02-21 11:23:16 · 1090 阅读 · 0 评论 -
为什么Dialog不能用Application的Context
为什么Dialog不能用Application的Context有网友在我的一篇和Context相关的面试题文章提到这个问题。我觉得一两句话,不好说清楚(我需要一些图表),所以用这篇文章来回答一下。先试一下用Application的上下文来创建Dialog,在调用它的show方法时程序会Crash,LogCat的异常信息如下:Caused by: android.view.Window...转载 2019-02-21 11:41:38 · 449 阅读 · 0 评论 -
控件树的触摸事件派发小结
当一个触摸事件产生后,它的传递过程遵循如下顺序:Activity→Window→View。所以Activity的rootView收到一个触摸事件后,就会按照控件树的触摸事件派发流程,而事件的派发流程由ViewGroup(View)的dispatchTouchEvent(MotionEvent ev),其实dispatchTouchEvent方法在执行事件派发前,还控制确定派发目标的逻辑,在这里原创 2016-11-22 21:34:04 · 351 阅读 · 0 评论 -
Context小结
这个Context主要的继承关系。这是使用了典型的装饰者模式。context是个抽象类,ContextImpl是实际的实现者,而ContextWrapper是装饰者。Context中有很多重要的方法,如startActivity(...)、startService(...)、sendBroadcast(....)、getResources()、registerService(...)、ge原创 2016-11-29 22:34:38 · 252 阅读 · 0 评论 -
从源码看Dialog到底是属于应用Window还是属于子Window
文章目录 前言 Dialog Window WindowManager.LayoutParams 总结前言《Android开发艺术探索》第八章介绍WindowManger.LayoutParams的type参数的时候,有这样一句话:子Window不能单独存在,它需要附属在特定的父Window中,比如常见的一些Dialog就是一个子Window。看到...转载 2019-02-21 11:45:46 · 688 阅读 · 0 评论 -
Android GLSurfaceView用法解析
转自:https://blog.csdn.net/hjj378315764/article/details/79701040OpenGL和OpenGLES简介 这里先简单介绍下OpenGL和OpenGLES。OpenGL(Open Graphics Library)意为开放图形库,是一个跨平台的图形API,用于指定3D图形处理硬件中的软硬件编程接口。OpenGL一般用于图形工作站...转载 2019-06-06 22:23:01 · 11028 阅读 · 0 评论 -
View的硬件加速绘制及绘图缓存机制
硬件加速绘制:与软件绘制的drawSoftware()对应的是HardwareRenderer.draw(boolean)。在创建HardwareRenderer时,已经创建了一个HardwareCanvas,这个Canvas的绘制目标是EGLSurface。然后调用根View的getDisplayList()获得一个DisplayList对象,最后将这个DisplayList通过Hardwa...原创 2019-02-28 23:45:41 · 1001 阅读 · 0 评论 -
Android多媒体数据库及MediaProvider
image, video, audio的contentUri是一样的.他们的getContentUri()方法都是如下:比如audio的实在MediaStore.Audio.Media.getContentUri(),层层的内部类结构.public static Uri getContentUri(String volumeName) { return ...原创 2017-03-02 21:38:01 · 4462 阅读 · 0 评论 -
Service小结
Service生命周期:单纯startService:onCreate onstart ondestroy。每次调用startService就调用一次onstart。调用stopService或stopSelf会回调ondestroy,service将被撤销。单纯调用bindService:onCreate onBind onUnbind onDestroy。所有绑定者都调原创 2016-11-30 18:32:13 · 306 阅读 · 0 评论 -
AMS-启动AMS(AMS在SystemServer中的调用轨迹)
SystemServer#run()private void run() { // If a device's clock is before 1970 (before 0), a lot of // APIs crash dealing with negative numbers, notably // java.io.File#setLast原创 2017-07-28 18:37:40 · 1364 阅读 · 0 评论 -
Object类型作为binder调用的参数--如何实现这种自定义类型
分析ActivityManagerService和应用进程的IApplicationThread的通信说明:1.ActivityManagerService调用IApplicationThread客户端的bindApplication()方法,其中IApplicationThread的定义如下: void bindApplication(String packageName, Appli...原创 2018-08-08 19:58:19 · 482 阅读 · 0 评论 -
控件动画和属性动画(及Evaluator估值器、Interpolator插值器的使用)
控件动画和属性动画的区别和相同点:1.控件动画(View Animation)的父类是Animation;属性动画的父类是Animator;Animation其下包含了四个直接的子类AlphaAnimation: 透明度动画TranslateAnimation:平移动画ScaleAnimation:缩放动画RotateAnimation:旋转动画AnimationSet:动原创 2016-12-03 18:58:37 · 501 阅读 · 0 评论 -
Binder通信与AIDL
系统服务依赖的是Binder构架。Binder和BinderProxy直接继承IBinder。通信:服务Proxy(如:ActivityManagerService)通过BinderProxy,再通过BpBinder,再将请求传到Binder驱动。Binder驱动通过ServiceManager得到注册的IBinder对应的JavaBBinder,再层层上到jav...原创 2017-02-04 18:36:36 · 376 阅读 · 0 评论 -
深入理解ContentProvider共享数据更新通知机制
深入理解ContentProvider共享数据更新通知机制原创 2018-10-17 13:45:04 · 522 阅读 · 0 评论 -
SQLite--SQLiteDatabase、SQLiteOpenHelper、sqlite3.c--(jni、头文件)--源码分析基于Android M
open database:*使用ContextImpl#openOrCreateDatabase(),返回一个SQLiteDatabase对象。*可以去继承SQLiteOpenHelper,然后调用getWritableDatabase()可以获取SQLiteDatabase,使用SQLiteOpenHelper去获取,那么就要复写onCreate和onUpgrade方法。分析SQL...原创 2018-05-10 15:01:34 · 1341 阅读 · 0 评论 -
Service启动悬浮窗口
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activi...原创 2019-02-16 15:36:56 · 1024 阅读 · 1 评论 -
图解Activity启动模式、flag及其他启动属性-参考官方文档
launchMode:1.standard如果启动该Activity的context是Activity,则新建一个Activity实例,该target Activity在source Activity的Task中。如果启动改Activity的context不是Activity,则新建一个Activity实例,并创建一个新的TaskRecord。2.singleTop如果启动该Act...原创 2018-09-14 10:33:26 · 926 阅读 · 0 评论 -
Android性能优化学习笔记
1.UI性能优化过度渲染(overdraw)一个视图中,视图层级越多,过度渲染就越严重。就是说一个像素点上,如果存在10个view层级,如果每个层级在onDraw中都会绘制,那么这个像素点将会被渲染十次。在Android4.4及以上版本中,如果某个View完全被其他视图遮挡住了,那么就不会渲染这个view,这种技术叫Overdraw Avoidance。检测视图渲染可以使用开发者选...原创 2018-02-07 15:10:07 · 603 阅读 · 0 评论 -
Handler、Looper、MessageQueue
1.每个线程都可以拥有一个消息队列,一个Looper,可以拥有多个handler2.主线程:在系统创建该线程时就为该线程创建了MessageQueue和Looper。3.如果子线程需要MessageQueue和Looper(默认子线程没有ssageQueue和Looper),那么需要执行如下代码: class WorkThread extends Thread { pub原创 2016-12-12 09:57:09 · 481 阅读 · 0 评论 -
Android 自定义控件属性
前言自定义控件经常需要一些特殊的配置,添加一些自定义属性。1. 自定义属性 attrs.xml文件 所有自定义属性需要在文件中添加declare-styleable节点来声明,例如定义属性background_color设置背景色。 <declare-styleable name="AttrDeclareView"> <...转载 2019-02-21 00:04:37 · 525 阅读 · 0 评论 -
Activity各个生命周期如何处理窗口
1.在ActivityThread#handleLaunchActivity():activity.attach(appContext, this, getInstrumentation(), r.token, r.ident, app, r.intent, r.activityInfo, title, r.parent, ...原创 2019-03-01 23:51:15 · 319 阅读 · 0 评论 -
触摸事件从ViewRootImpl到DecorView的派发过程
ViewRootImpl & ViewGroup & View 触摸事件派发机制源码分析Android 6.0 & API Level 23 Github: Nvsleep 邮箱: lizhenqiao@126.com简述Activity顶层窗口接受屏幕触摸事件的准备以及对输入事件到来时候的预处理; ViewGroup的事件派发机制dispatchTou...转载 2019-03-01 21:38:28 · 581 阅读 · 0 评论 -
View的布局控件树阶段
1.performLayout():执行控件树布局2.mView.gatherTransparentRegion():在控件树布局完成后,如果控件树中存在SurfaceView,则需要计算窗口的透明区域布局控件树:调用performLayout(),这个方法内容比较简单,主要是一句://host为RootViewImpl的根Viewhost.layout(0, 0, host....原创 2019-02-25 23:17:43 · 674 阅读 · 0 评论 -
View的measure阶段
measure的三个部分:预测量、布局窗口、最终测量预测量预测量时ViewRootImpl给mView的specSize:1.第一次预测量时,给应用可用的最大尺寸。2.窗口为悬浮窗的时候,给应用可用的最大尺寸。3.其他情况,在mView的LayouParams.width/height为MATCH_PARENT或WRAP_CONTENT时,使用窗口最新尺寸,为精确值时,使用这个...原创 2019-02-25 14:37:36 · 356 阅读 · 0 评论 -
自定义View的onMeasure()实现的基本原则
1.处理padding属性和margin属性:自身属性padding和子控件的margin属于自身尺寸的一部分,所以计算尺寸时要算上这两部分,给子控件准备MeasureSpec时也要注意减去子控件的margin2.为每个子控件单独准备一个MeasureSpec:子控件的width/height为WRAP_CONTENT时,则specMode为ATMOST,为精确值时,则为Exactly。而sp...原创 2019-02-24 16:36:51 · 206 阅读 · 0 评论 -
Android绘制阶段
对上图中部分纠错:dispatchDraw()中的裁剪,只是对padding的裁剪。从ViewRootImpl启动控件树绘制:调用performDraw(),从Surface中获取Canvas,在有其他窗口遮时(例如输入法窗口)根据visableInset保证关键控件可见,则需要滚动mView中的内容,所以需要对Canvas做滚动,即是操作mScrollX,mScrollY,canva...原创 2019-02-27 17:09:20 · 265 阅读 · 0 评论 -
Android Window理解(3.1)---子窗口创建过程:Dialog、PopupWindow
该博文转自:https://blog.csdn.net/leif_/article/details/53219078创建子窗口父子窗口关系标识: View.AttachInfo.mPanelParentWindowToken变量、在ViewRootImpl.setView中设置。 Window.mHasChild和Window.mContainer变量、代表Activi...转载 2019-02-17 11:07:12 · 875 阅读 · 0 评论 -
Android系统的启动流程
Android系统启动-Init篇Android系统开篇Android系统启动-SystemServer上篇如何自学Android原创 2018-10-16 18:24:55 · 171 阅读 · 0 评论 -
JNI异常处理
注意文中指的可check的exception是运行在vm中的代码抛出的exception,如jni中调用java层的方法,或者通过执行JNIEnv中的方法都属于运行在jvm中代码。就是说非运行在jvm中代码发生了异常,使用env->ExceptionCheck()是没用的。如在一个jni方法中有如下代码:JNIEnv* mEnv;mEnv->ExceptionCheck();...转载 2018-10-13 17:23:21 · 4287 阅读 · 0 评论 -
Binder通信流程图
Java层Binder框架BpBinder和JavaBBinder是一对的 ,是通信架构的一部分,应该算是身份证的持有者。通信时,是通过IPCThreadState和binder驱动交互。例如在客户端发送请求时,是BpBinder把要通信的BBinder的handle告诉binder线程的IPCThreadState,然后IPCThreadState就把handle告诉...原创 2018-12-20 22:12:56 · 1168 阅读 · 0 评论 -
ServiceManager,SystemServer,SystemServiceManager,SystemService—简述这个几个类的关系
SystemServer这是一个重要的进程,是zygote fork的第一个进程。其中WindowManagerService,ActivityManagerService等重要的可以binder通信的服务都运行在这个SystemServer进程。而像WindowManagerService,ActivityManagerService这样重要,繁忙的服务,是运行在单独线程中,而有些没有繁重的...原创 2018-03-02 14:54:05 · 7159 阅读 · 0 评论 -
Android系统启动-Init篇
基于Android 6.0的源码剖析, 分析Android启动过程进程号为1的init进程的工作内容/system/core/init/ - init.cpp - init_parser.cpp - signal_handler.cpp一、概述init是Linux系统中用户空间的第一个进程,进程号为1。Kernel启动后,在用户空间,启动init进程,并调用init...转载 2018-12-07 16:34:58 · 2575 阅读 · 1 评论 -
四大组件之ActivityRecord
一. 引言BroadcastRecord,ServiceRecord都继承于Binder对象,而ActivityRecord并没有继承于Binder。 但ActivityRecord的成员变量appToken的数据类型为Token,Token继承于IApplicationToken.Stub。appToken:system_server进程通过调用scheduleLaunchActivit...转载 2018-11-29 18:20:41 · 7068 阅读 · 0 评论 -
理解Android Context
一. 概述接触过Android的小伙伴, 一定不会对Context感到陌生, 有大量的场景使用都离不开Context, 下面列举部分常见场景:启动Activity (startActivity) 启动服务 (startService) 发送广播 (sendBroadcast), 注册广播接收者 (registerReceiver) 获取ContentResolver (getCont...转载 2018-11-19 15:28:46 · 1984 阅读 · 0 评论 -
JNI使用小结
以下内容主要参考深入理解Android卷1.JNI函数动态注册:使用这个数据结构存储一个JNI函数的注册信息:typedef struct { //Java中native函数的名字,不用携带包的路径。例如“native_init“。constchar* name; //Java函数的签名信息,用字符串表示,是参数类型和返回值类型的组合。 const c...原创 2019-06-12 13:49:12 · 1423 阅读 · 0 评论 -
Binder机制和共享内存 native
匿名Binder:即没有向ServiceManager注册的Binder。Binder通信并不绝对依赖ServiceManager,它只是一个域名解析器。可有可无,有更方便。所以可以看到ContextImpl$ApplicationThread,ContentProvider$Transport都是没有向ServiceManager addService,只要client进程能获...原创 2018-04-19 19:09:22 · 4260 阅读 · 0 评论