Android的系统架构和其它操作系统一样,采用了分层的架构。android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
在Android中,开发者可以使用Java作为编程语言来开发应用程序,也可以通过NDK使用C/C++作为编程语言来开发应用程序。其他好多语言也支持。
在Android系统底层方面,Android使用C/C++作为开发语言。
编程语言: C/C++(底层) Java等(应用层)
源码模式: 混合(自由免费,开放源码)
支持平台: ARM、MIPS、x86
内核类: 整块性核心(Linux)
android组件:Activity、Service、Broadcast Receiver、Content Provider。
基带版本就是手机的调制解调器使用的驱动版本号,调制解调器主要目的负责着手机的通信功能(打电话,发短信,数据交换等)。
内核版本就是手机的硬件(如主板,GPS,摄像头,WiFi,蓝牙等)驱动集合体的版本号!
Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik 基于寄存器,而 JVM 基于栈。
build.prop 是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似于/etc中的文件。
hsdpa全称High Speed Downlink Packet Access中文意思:高速下行分组接入,设置的数越大传输越快。
AMR WideBand,语音带宽范围,全称为“Adaptive Multi-rate - Wideband”,即“自适应多速率宽带编码”。
finish是Activity类的方法,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理;当调用System.exit(0)时,杀死了整个进程,这时候活动所占的资源也会被释放。
Actvity启动:onCreate--- onStart--->onResume activity部分遮住:onPause onResume activity全部遮住:onStop onReStart。 当更高优先级的apps需要内存,而此时系统内存不够了会杀死onStop、onPause的Activity。
Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。
Intent分为显示intent和隐士intent。 Intent过滤器。 显式Intent更多用于在应用程序内部传递消息。 隐身intent的三个因素Action \Data\ Category。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 JSONObject,包装一个map。JSONArray,包装一个ArrayList。JSONTokener,包装一个Reader,用来存储、读取、操作一个表示JSON数据的字符串。
软件开发模型:快速开发模型、瀑布开发模型、迭代开发模型(整个开发工作被组织为一系列的短小的、固定长度(如3周)的小项目,被称为一系列的迭代。)。
GMT,格林尼治标准时间,(Greenwich Mean Time,GMT),本初子午线被定义在通过那里的经线。 UTC,Universal TimeCoordinated,协调世界时,又称世界统一时间,世界标准时间,国际协调时间。
zygote进程是所有APK应用进程的父进程。zygote本身是一个应用层的程序,和驱动,内核模块之类的没点关系。
folk是Linux系统的一个系统调用,其作用是复制当前进程,产生一个新的进程。新进程将拥有和原始进程完全相同的进程信息,除了进程id不同。进程信息包括该进程所打开的文件描述符列表、所分配的内存等。当新进程被创建后,两个进程将共享已经分配的内存空间,直到其中一个需要向内存中写入数据时,操作系统才负责复制一份目标地址空间,并将要写的数据写入到新的地址中,这就是所谓的copy-on-write机制,即“仅当写的时候才复制”,这种机制可以最大限度地在多个进程中共享物理内存。
操作系统内部,启动新的进程过程:内核创建一个进程数据结构,用于表示将要启动的进程。 内核调用程序装载器函数,从指定的程序文件读取程序代码,并将这些程序代码装载到预先设定的内存地址。 装载完毕后,内核将程序指针指向到目标程序地址的入口处开始执行指定的进程。
Socket编程:阻塞式读操作,非阻塞读操作。
为什么内存少的时候运行大型程序会慢呢?其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。
android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。所以为什么有的程序切出去重进会到主界面。但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务。服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到,标签是service。
android启动线程执行任务和启动服务执行任务区别:生命周期。
非多工环境的 Iphone、Featured Phone 和多工环境的 Windows Mobile(WM)、Symbian、Android 最大的分别。 Iphone 永远有足够的 RAM 去给系统运作,所以永保系统运作的顺畅度。而 WM、Symbian、Android 这类多工系统,在执行一定数量的程序后,系统便会变钝。
管理器去关闭一个task,用到的方法是android.app.ActivityManager.restartPackage。但是这里有一个不完善的地方就是,launcher和contacts都具有 android:sharedUserId="android.uid.shared” 属性。restartPackage 方法它会关掉与这个ap关联(同ID)的所有ap。
int pid = android.os.Process.myPid();android.os.Process.killProcess(pid); 或者 System.exit(0)。
查看手机IMEI号: *#06# 。International Mobile Equipment Identity国际移动设备身份码。 SN:Serial Number 序列号
MediaRecorder、MediaPlayer与AudioRecord、AudioTrack区别:MediaRecorder经过压缩编码的声音数据,方便的生成音频文件;AudioRecord直接获得无压缩的pcm数据,方便的得到音频流。AudioRecord和AudioTrack类在获取和播放音频数据流时无需通过文件保存和文件读取,可以动态地直接获取和播放音频流,在实时处理音频数据流时非常有用。
SPL, Second Program Loader,可以理解为“第二次装系统”,包含很多负责装载os操作系统到RAM中的命令!一般提供的功能有:检测手机硬件,寻找系统启动分区,启动操作系统为系统的基本维护提供操作界面!
S-OFF,S代表 Security Lock安全锁。其实是关闭CID校验,同理S-ON就是打开CID校验。CID, 英文全称就是Customer I Dentity,简单来说就是一个手机的平台版本,擦除破解后的CID称为“SUPRECID”,刷机过程中SPL需要根据CID校验ROM是否可用,并决定是否刷入,一般情况下要求一定要对应CID的ROM才可以用,CID不同的ROM是刷不上去的。
Activity管理的核心是ActivityManagerService,是一个独立的进程。 ActivityThread是每一应用程序所在进程的主线程,循环的消息处理。 ActivityThread与ActivityManagerService的通信属于进程间通讯,使用binder机制。
Activity启动过程(6步):使用代理模式启动到ActivityManagerService中执行; 创建ActivityRecord到mHistory记录中; 通过soket通信道Zygote相关类创建process; 通过ApplicationThread与ActivityManagerService建立通信; ActivityManagerService通知ActivityThread启动Activity的创建; ActivityThread创建Activity加入到mActivities中并开始调度Activity执行。
不是所有的Activity创建都是6步,一个应用程序中所有Activity只有一个ActivityThread属于一个Process;ActivityStack并不是每次都需要创建一个Stack来管理Activities
Application:由多个相互松散的与用户进行交互Activity组成,通常被打包成apk后缀文件中; Activities:应用程序的主要部分,是应用程序的核心; ActivityStack:将应用中打开的Activity保存在历史栈中,按照先进后出的原则。StartActivity入栈,返回时出栈; Task:将一系列相关的Activity组合,完成某个应用程序完整操作,不管activity属于哪一个Application的。 例如:写信息--调用--文件管理,都属于一个Task,但属于两个Application。
ABI:应用程序二进制接口(application binary interface)描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口 。 API,Application programming interface.
ABI掩盖了各种细节,例如:调用约定控制着函数的参数如何传送以及如何接受返回值;系统调用的编码和一个应用如何向操作系统进行系统调用;以及在一个完整的操作系统ABI中,对象文件的二进制格式、程序库等等。
ADT(Android Development Tools): SDK(Software Development Kit):
Web Services,就是系统对外的接口。是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。(比如查询天气预报、查询号码归属地等模块)
Bundle类,实现了Parcelable, Cloneable接口,所以能够通过intent或者IPC传递。Bundle内部实际就是一个map,实现了Parcelable接口的方法。
Intent类,实现了Parcelable接口,put数据,内部是通过Bundle类来存储的。
Activity继承关系:Activity --> ContextThemeWrapper --> ContextWrapper --> Context。
Android工程中,接口可以放在gen包下。
.classptah文件的作用:src是源文件输出目的的,output是类文件输出目的的,con是eclipse运行时所需的核心包,var是通过环境变量的形式增加的一些JAR包,lib是直接加入的JAR包
Java类加载器(系统提供的;java应用开发人员编写),系统默认的加载器有 引导类加载器(bootstrap class loader),扩展类加载器(extentions class loader),系统类加载器(system class loader)。
http协议属应用层,tcp协议属传输层,ip协议属网络层。 http协议是基于tcp连接的。 tcp/ip是传输层协议,主要解决如何在网络中传输;而http是应用层协议,主要解决如何包装数据。 Socket是对tcp/ip协议的封装,socket本身并不是协议,而是一个调用接口。
用到递归算法的:汉诺塔问题;快速排序;求最大公约数;
boolean b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60; 结果false。考察运算符优先级,8与 9或 10非 11:&& 12:|| 13:条件运算符 14:赋值运算符
Android常用5大布局方式:线性布局(LinearLayout):按照垂直或者水平方向布局的组件。 帧布局(FrameLayout):组件从屏幕左上方布局组件。 表格布局(TableLayout):按照行列方式布局组件。 相对布局(RelativeLayout):相对其它组件的布局方式。 绝对布局(AbsoluteLayout):按照绝对坐标来布局组件。
服务:先到先得。先onCreate,只执行一遍;后onStart,可以多次。startService对应stopService(内部调onDestroy);bindService对应onUnbindService(内部调用onUnbind()-->onDestroy()方法.结束服务)。
后台Activity由于某原因被系统回收了,状态保存:onSavedInstanceState(Bundle obj),即onCreate的参数 Bundle savedInstanceState。 activity子类只需要覆盖onSavedInstanceState方法即可, 该方法与生命周期没有任何关系。 调用时刻为activity被杀死之前。
SQLite是关系型数据库,它包含在一个相对小的C库中。 不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
刀片机中的刀片服务器是指在标准高度的机架式机箱内可插装多个卡式的服务器单元,实现高可用和高密度。每一块"刀片"实际上就是一块系统主板。
匿名线程的缺陷:第一,线程的开销较大,如果每个任务都要创建一个线程,那么应用 程序的效率要低很多;第二,线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。 第三,更新UI还必须要引入handler。
Android从1.5开始引入了AsyncTask这个类,可以帮助我们解决线程和界面刷新问题,主要是对Thread+Handler这样的封装,但在设计模式和代码维护方面都有不错的表现。
android手机启动过程:①系统引导bootloader(bootable/bootloader/*) ②内核kernel(kernel/*) ③init进程启动(system/core/init) ④ServiceManager ⑤Zygote ⑥System Server ⑦Home启动
O2O即Online To Offline,也即将线下商务的机会与互联网结合在了一起,让互联网成为线下交易的前台。这样线下服务就可以用线上来揽客,消费者可以用线上来筛选服务,还有成交可以在线结算,很快达到规模。该模式最重要的特点是:推广效果可查,每笔交易可跟踪。
目前采用O2O模式经营的网站已经有很多,而完全采用O2O模式经营的目前除了街库网还有更出色的大众点评网,而大众点评网目前估值达到10亿美元。而如爱街库、百先网、中团网、篱笆网、齐家网、美团网、58团购、窝窝团、拉手网等则主要是以大众商品团购为主,消费者不一定需要到线下进行消费,另外还有一种为消费者提供信息和服务的网站,如赶集网、爱邦客等,最后就是最近兴起的房地产网,如搜房网、房道网、百度安居等。
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
intent的flag标志,FLAG_ACTIVITY_REORDER_TO_FRONT调整栈的顺序;FLAG_ACTIVITY_CLEAR_TOP清楚栈顶,露出底下的;FLAG_ACTIVITY_SINGLE_TOP栈顶唯一;FLAG_ACTIVITY_NO_HISTORY不记录历史,即finish后出栈;FLAG_FROM_BACKGROUND服务启动activity;
MCC(移动国家码)和 MNC(移动网络码).
android4.0版本新特性:摄像中“编辑”按钮的图片编辑工具; 全景相机拍摄; 动态墙纸; 新设计的锁屏;
从JDK1.5以后,SUN公司把它改名为J2SE5,主要是SUN感觉1.5的改进较大
atom 原子、微量; gadget 小配件;
在C/C++中,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);在c和java中,在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。
在list子类中,ArrayList不是线程安全的,而Vector是现成安全的。 hashtable:就比hashmap多了个线程安全。statck:堆栈类,先进后出。enumeration:枚举,相当于迭代器。
关键字volatile的,它的同步代价很低。
repo只是google用Python脚本写的调用git的一个脚本,主要是用来下载、管理Android项目的软件仓库。
SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
HVGA屏density=160;(Half-size VGA,Video Graphics Array)即VGA(640*480)的一半,分辨率为(480*320),(3:2宽高比)。
QVGA屏density=120;(Quarter VGA)即VGA的四分之一尺寸,亦即在液晶屏幕(LCD)上输出的分辨率是240×320像素。
WVGA屏density=240;(Wide VGA),其分辩率为800×480象素。
WQVGA屏density=120;(Wide Quarter VGA)代表480X272(宽高比16:9)或者400X240(宽高比15:9)的屏幕分辨率
百度面试题
拿一个音乐播放器来说事,在SD上有20万首.mp3歌曲,如何扫描完全部的歌曲,并将歌曲存到DB中?数据库的字段名是什么? --- 名字、路径 + 索引(根据查询要求建立)。
要将歌曲全部传到微博上,如何实现?断点续传功能? --- 要速度,就多线程上传; DB中设置标记字段,一首一首的上传。
Dialog的弹出和消失,走不走activity,走的话 如何走的?--- 普通dialog不走;activity设置成dialog主题,则属于半遮挡,走onPause、onResume;普通activity,走onPause,onStop,onRestart,onStart,onResume;恢复时要看进程是否被杀死,如果杀死则执行onCreate方法。
Handler的使用方法。 --- Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.