1.为什么子线程不能访问更新Ui
在onCreate方法中创建了子线程并访问UI,没有崩溃,因为ViewRootImpl还没有创建的,无法检测当前线程是否是UI线程。正常情况子线程会在很短的延时操作后ViewRootImpl已经创建了,可以执行checkThread方法检查当前线程。如果是非UI线程则会抛出异常
2.View的绘制原理
3.Android 强引用,弱引用,软引用,虚引用
1. 强引用
以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
2.软引用(SoftReference)
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
3.弱引用(WeakReference)
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
4. 虚引用
用的比较少,就不管它了
5.AIDL
AIDL:Android Interface Definition Language,即Android接口定义语言。 Android 使用AIDL提供公开服务接口,使得不同进程间可以相互通信。 建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下: (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。 (2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。 (3)建立一个服务类(Service的子类)。 (4)实现由aidl文件生成的Java接口。 (5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
6,进程
前台进程(foreground process):需要用户当前正在进行的操作。一般满足以下条件:
屏幕顶层运行Activity(处于onResume()状态),用户正与之交互
有BroadcastReceiver正在执行代码
有Service在其回调方法(onCreate()、onStart()、onDestroy())中正在执行代码
这种进程较少,一般来作为最后的手段来回收内存
可视进程(visible process):做用户当前意识到的工作。一般满足以下条件:
屏幕上显示Activity,但不可操作(处于onPause()状态)
有service通过调用Service.startForeground(),作为一个前台服务运行
含有用户意识到的特定的服务,如动态壁纸、输入法等
这些进程很重要,一般不会杀死,除非这样做可以使得所有前台进程存活。
服务进程(service process):含有以startService()方法启动的service。虽然该进程用户不直接可见,但是它们一般做一些用户关注的事情(如数据的上传与下载)。
这些进程一般不会杀死,除非系统内存不足以保持前台进程和可视进程的运行。
对于长时间运行的service(如30分钟以上),系统会考虑将之降级为缓存进程,避免长时间运行导致内存泄漏或其他问题,占用过多RAM以至于系统无法分配充足资源给缓存进程。
缓存/后台进程(cached/background process):一般来说包含以下条件:
包含多个Activity实例,但是都不可见(处于onStop()且已返回)。
系统如有内存需要,可随意杀死。
7.注册广播
一种是在Activity代码块中使用registerRceiver注册
一种是在Mainifest中注册
8.Toast
在Android源码中的NotificationManagerService.java这个类中定义了两个静态变量,分别对应Toast.LENGTH_LONG(3.5秒)和Toast.LENGTH_SHORT(2秒)的值
9.Intent可以传递哪些类型的数据
1. 8种基本数据类型及其数组byte boolean char short int long double float
2. String(String实现了Serializable)/CharSequence实例类型的数据及其数组
3. 实现了Parcelable的对象及其数组
4. 实现了Serializable的对象及其数组
10.数据库管理
getReadableDatabase()和getWriteableDatabase()都可以得到一个可既可以读又可以写的数据库对象,不同的是,当磁盘空间满了之后,getReadableDatabase()得到的是一个只读的对象,而getWriteableDatabase()则会抛出异常。(getReadableDatabase()方法中会调用getWritableDatabase()方法)
11.NDK
NDK是一系列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so。
NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
12.SimpleAdapter
使用SimpleAdapter作为适配器是,会按照如下顺序判断View:
1、该view是否实现checkable接口
2、该view是否是TextView
3、该view是否是ImageView
如果以上三种类型都不是,就会抛出IllegalStateExeception
13.GLSurfaceView
GLSurfaceView是SurfaceView的一个实现。它用一个专门的surface去显示OpenGL渲染的图像。
1>管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
3> 用户自定义渲染器(render)。
4> 让渲染器在独立的线程里运作,和UI线程分离。
5> 支持按需渲染(on-demand)和连续渲染(continuous)。
6> 一些可选工具,如调试。
14.