Android 基础
-
Android 系统架构
- Applications:应用程序
- Application Framework:组件和服务API
- Libraries、Runtime:即 c/c++ 函数库部分,大多数都是开放源代码的函数库,例如 webkit;android 的 runtime 负责解释和执行生成的dalvik格式的字节码
- Linux Kernal:硬件驱动程序:网络、电源、系统安全以及内存管理等功能
- 简单介绍Android四大组件
- Activity:Activity 是 Android 程序与用户交互的窗口,主要做界面展示和一些持久化的事情
- Service:后台服务,定义好需要接受的 Intent 提供同步和异步的接口,常用于处理一些常驻、耗时的操作
- Content Provider:是 Android 提供的第三方应用数据的访问方案,可以派生 Content Provider 类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型
- BroadCast Receiver:广播,接收一种或者多种 Intent 作触发事件,接受相关消息,做一些简单处理,转换成一条 Notification,统一了Android的事件广播模型
- Android中常用的五种布局
- FrameLayout:框架布局,所有东西依次都放在左上角,会重叠
- LinearLayout:线性布局,可垂直和水平布局
- AbsoluteLayout:绝对布局,绝对布局用X,Y坐标来指定元素的位置
- RelativeLayout:相对布局,按参照物布局
- TableLayout:表格布局,每一个TableLayout里面有表格行TableRow
- Activity 生命周期
Fragment 生命周期
Service 如何使用?生命周期?
- 如何使用:
* 继承。 XXService extends Service
* 配置。在 AndroidManifest 文件中的<application>节点里对 XXService 进行配置
* 启动。Context.startService() 或者 Context.bindService()
-
生命周期:
- startService():生命周期直至stopService;如果调用startService() 方法前服务已经被创建,多次调用startService() 方法并不会导致多次创建服务,但会导致多次调用 onStart() 方法
- bindService():生命周期直至unbindService();调用者退出时会自动调用unbindService();如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)
BroadCast Receiver 注册方式、不同之处
- 注册方式:XXXReceiver extends BroadcastReceiver
* 第一种:全局广播:AndroidManifest 中注册
<receive android:name=".XXXReceiver " >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>
* 第二种:局部广播:代码注册
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
XXXReceiver receiver = new XXXReceiver();
registerReceiver(receiver, filter);
-
优缺点
- 第一种:全局有效
- 第二种:局部有效
-
Activity启动模式
可以通过AndroidManifest.xml中的android:launchMode属性设置
- standard:默认模式。在这个模式下,都会默认创建一个新的实例。
singleTop:可以多个示例。如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
singleTask:只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
singleInstance:只有一个实例。并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
- 横竖屏切换时候Activity发生了什么?
- 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
- 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
- 设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
- 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
- 保存:重写onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在activity被回收之前调用
- 获取:通过重写onRestoreInstanceState()方法可以从中提取保存好的数据
- Android 的数据存储方式
使用 SharedPreferences 存储数据、文件存储数据、SQLite 数据库存储数据、使用 ContentProvider 存储数据、网络存储数据
SharedPreferences 存放目录:/data/data/Package Name/Shared_Pref。以键值对形式存储简单配置信息
文件存储目录:/data/data/Package Name/files。 I / O 读写
SQLite存储目录:/data/data/Package Name/database
CP:向其它应用共享数据,基于Uri
网络存储:post,get请求同步数据
Android 中的动画有哪几类,它们的特点和区别是什么
两种,一种是 Tween 动画、还有一种是 Frame 动画
- Tween 动画:这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化
- Frame 动画:传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影
Android 进阶
- 单线程模型中 Message、Handler、Message Queue、Looper 之间的关系
简单的说,Handler 获取当前线程中的 Looper 对象,Looper 用来从存放 Message 的 MessageQueue 中取出 Message,交由 Handler 进行 Message 的分发和处理
- Handler 获取当前线程中的 Looper 对象,调用 Looper.prepare() 方法
- Handler sendMessage() 到 MessageQueue
- Handler 调用 Looper.loop()不断遍历 Message Queue,取出Message
- Handler 回调 handleMessage() 处理这个Message
- Handler 处理完该 Message 后,Looper 则设置该 Message 为NULL,以便回
![Uploading MVC 模式_824399.png . . .]
收 - 备注:当 Handler 对象的构造函数的参数为空,则为当前所在线程的 Looper; Looper.getMainLooper() 得到的是主线程的 Looper 对象,Looper.myLooper() 得到的是当前线程的 Looper 对象
- Activity 是如何生成一个 view 的?
- Activity在attch方法的时候,会创建一个phonewindow(window的子类)
onCreate中的setContentView方法,会创建DecorView
DecorView 的 addview() 方法,会把 layout 中的布局加载进来
Android 中如何捕获未捕获的异常
- 关键是实现Thread.UncaughtExceptionHandler
- MVC、MVP、MVVM差异
- MVC(环形通信)
MVC 是 Model,View,Controller的缩写,MVC包含三个部分
- M:数据加工,耗时操作、网络操作等,eg:util
- V:用户界面,接收用户的输入,显示处理结果,eg:xml
- C:桥梁作用,接收V层数据,交由M层处理,eg:activity
![MVC 模式](http://upload-images.jianshu.io/upload_images/3688153-44f8efc13bb57971.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/800)
-
MVP(双向通信)
- View 与 Model 不发生联系,都通过 Presenter 传递
- View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里
-
MVVM
- 基本上与 MVP 模式完全一致
-
唯一的区别是,它采用双向绑定:View的变动,自动反映在 ViewModel,反之亦然
- 什么是ANR,产生原因,如何避免?
- AIDL的全称是什么?如何工作?
全称是:Android Interface Define Language
在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享.
因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则
采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦。
AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要
在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用
这些参数组装成自己需要的对象.AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL,
需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.
AIDL的创建方法:
AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。 由于远程调用的需要, 这些参数和返回值并不是任何类型.
下面是些AIDL支持的数据类型:
1.不需要import声明的简单Java编程语言类型(int,boolean等)
2.String, CharSequence不需要特殊声明
3.List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型.
- NDK 是什么
NDK是一些列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so
- 持续更新中。。