android视频教程

android视频教程

5 (13人评价)
  • 课时:(26)

  • 学员:(409)

  • 浏览:(14869)

  • 加入课程
  • android视频教程26的笔记

    实现带 AttributeSet(才能在layout设置属性)的MyView()构造函数。

  • android视频教程25的笔记

    学习UI 2+1原则1、界面Component是如何呈现出来的。呈现的两种方式:XML Layout的呈现;动态编码呈现:动态布局;画动态控件。呈现的核心,牢牢把握住onDraw。平面图像Graphic-Canvas&Drawable简单介绍。layoutinflatorView底层如何支持?                    Applicationjava View/Widget/Canvas      OpenSkia                                   GL                    SunfaceSkia,第三方2D画图引擎,后被google收购,现在开源。类似Linux上QT。OpenGL,支持3D实现。Sunface,frame buffer驱动支持                                      +1、UI Component放在哪?(复合界面布局)控件树的观念。要搞清放哪,就要搞清楚ViewTree层级关系。类比HTML的ViewTree。sample:view和viewgroupSDK中的工具heirarchyviewer,层级视图的浏览,分析(商业软件)界面构成,层级关系。读取模拟器当前软件activity 2 、Android界面事件机制。Android界面事件分类:KeyEventTouchEventTrackballEvent-轨迹球,基本弃用。 Android界面事件的触发及分发:事件,就是用户交互时触发的操作。可以通过如下两种方式来启动事件交互:1、定义一个事件监听程序(listener)并且注册它。以onClickListener()为例,注册往往命名setOnClickListener()。2、重载已经回调的事件方法。override,这个往往用在你基于系统的View类进行扩展的时候用。(自定义组件?)事件触发的两种方法:扩展view的时候回调事件函数。-内注册事件监听器。-外事件分发dispatchKeyEvent:keyEvent分发:   消息发到当前(activity)上下文   Context发到Window   window优先发给输入法窗体   发给rootView(DecorView)-层层找到focus   发给焦点子viewtouchEvent分发:---根据位置(坐标)快速定位当前view    从下往上。onTouchEvent()返回false,继续事件上传。返回true,“我”处理了,不再上传。 如何使用自定义组件?(在layout中)标签加上包即可:<sundy.viewtest.MyView  .../>

  • android视频教程24的笔记

    例子:界面组件继承与View,界面容器继承于ViewGroup自定义组件继承View1 画出来回调函数onDraw(),参数是画布Canvas。用到画笔。Invalidate();刷新,onDraw()再次调用。不是线程安全的。子线程中用postInvalidate()刷新显示。2 事件event:onKeyEvent 新例子:canvas画图非常简单。画笔Paint指定属性(颜色,粗细等)。onTouchEvent()view,window,activity中都有onTouchEvent() 通读View.java源码 如何学习:官网,Hello Views (Resources)查找class helper    适配器,观察者模式api demosource code  

  • android视频教程22的笔记

    AAF110727_蓝牙编程入门目标:知道蓝牙是什么,做什么用,常用apiAndroid2.0后支持;蓝牙和LAN一样通过mac地址识别远程设备;通过蓝牙串口协议(SSP)建立端口以后,以输入输出流方式通讯。(类似java的socket通讯) 重点apiBluetoothAdapterBluetoothDeviceBluetoothSocketBluetoothServerSocket 示例代码:UUID全球唯一manifest中添加使用蓝牙设备的权限pc端蓝牙用串口调试小助手1.3收发数据。 重难:理解蓝牙api,熟练使用 考核:建立蓝牙端口,接收远端蓝牙数据的过程?如何进行蓝牙设备的搜索和匹配?建立连接的过程? 练习独立开发一个蓝牙聊天程序  

  • android视频教程20的笔记

    在Android2.2以上实现MobileWidget(采用方法一 ) 2.2已支持html5,flash mobileWidget三个难点:html5,flash,WAC2.0. 目标: 通过例子,体验运行时想Webkit注册JS扩展对象(如摄像头对象,拨号) 定义JavaScriptInterface类 启动浏览器WebView对象 webView.addJavascriptInterface() 看手机运行,网页程序index.html实现了对WAC2.0的支持。 android framework 和JS对象上建立桥梁。 看src下两个类源码:JavaScriptInterface 和主activity中设置myWebView-addJavascriptInterface方法注册JavaScriptInterface JS对象,load index.html网页。 看addJavascriptInterface源码: WebView.java addJavascriptInterface() WebViewCore.java sendMessage()-handleMessage()接收(transferMessage)。 BrowerFrame.java addJavascriptInterface() NativeAddJavascriptInterface(),类库中,底层守护进程会接收到这个调用。 利用Cavas对象画图形。2.2以下不支持的用c++开发插件,NPN API标准。开发后更新成.so,在用JNI机制打包。2.2以下的源代码中有示例:/development/samples/BrowerPlugin/浏览器插件开发示例,可以参考来做开发。重难: 通过看代码,理解注册机制 考核: 如何在运行时注册Webkit的JS扩展对象,让其支持WAC2.0

  • android视频教程21的笔记

    SPI110723_Mobile Widget概述Mobile Widget应用的Webkit移植系列课程.www.mobidever.com 目标:知道Mobile Widget概念,与Webkit的关系例子:开发周期短,应用是个wgt压缩包。html+js开发,打包成wgt JIL,WRT,Apple Widget 什么是Mobile Widget? 移植需求:一、功能需求1 wiget runtime-一个apkrunning appUI Display   support full screen window,float window   support gesture   support more point touch   system notification lifecycle of appcustom launcher2 wiget manager-一个apkinstall app-support SDCarduninstall appupdate app-automatic and manuallaunch wiget appterminate appadd shortcut icon3 SDK和ADT ---开发端extend SDKextend Eclipse Plug-in二、能力需求1 支持WAC1.0 -规范2 支持html5大部分特性local file storewdb socketCanvasAndroid浏览器引擎:webkit3 支持WAC2.0扩展特性-和手机关系紧密的本地api的支持4 支持flash5 wiget安全性和私密性三、性能需求启动速度manager启动速度runtime 启动速度内存占用程序大小JS 四 test devicesNexus S(Android 2.3) 基于webkit设计。www.webkit.org在android的系统类库libraries层。ApplicationWebKit(UI Process)WebKit(Web Process)WebCore-对html的渲染JS Engine-脚本解析 设计思考及实现方式,三种方案方案一、base on Webkit release-android2.2支持html5,只需要扩展JScore。最简单,在上层解决。方案二 、webCore extension JSCore extension-典型的NDK的开发,一般不用刷ROM。类库层方案三、Porting Webkit-把最近wibkit移植到低版本,要编ROM,考虑两个web并存的情况。最复杂,系统移植。 重难:理解webkit核心模块理解Mobile Widget产生理念Widget需要支持的特性有哪些?1 开发更容易。如开发网页的程序员可以开发,本身的简易性,可移植2 基于标准的浏览器技术3 不仅是服务器端,也是客户端,要识别重力感应,通讯录,摄像头等。4 跨平台更容易,同时运行到iphone和android缺点:1 运行效率2 需要在手机上实现一个runtime运行时和一个管理器。认识wgt格式3 不能支持太复杂功能。 考核:移动的JIL Widget 和Opera Widget,这些Widget和Android framework Widget一样吗?Widget需要支持的特性有哪些?

  • android视频教程的笔记

    AFF110606_AsyncTask异步任务目标:了解AysncTask类和实现。Android为了降低异步操作开发难度,在handler基础上提供AsyncTask。是一个峰值过的后台任务类。明了它和Handler谁更轻量级?Handler更轻量级,只发消息;AysncTask不仅开新线程,还用线程池,更耗资源。代码操作更轻量级。如何使用AsyncTaskdoInBackground()onProgressUpdate()onPostExecute()AsyncTask定义了三种泛型Params,Progress,ResultParams,启动任务执行的输入参数,比如HTTP请求的URL.Progress,后台任务执行的百分比。Result,后台执行任务最终返回的结果,比如StringAsyncTask方法:必选方法:doInBackgroundonPostExecute可选方法:onProgressUpdateonPreExecuteonCancelledAsyncTask三个状态:pending,running,finished使用AsyncTask类,遵守的准则:Task的实例必需在UI thread中创建;execute方法必需在UI thread中调用;不要手动调用onPreExecute,onPostExecute,doInBackground,onProgressUpdate这几个方法;该task只能被执行一次,多次调用时将会出现异常。看代码AsyncTask.java:1 找入口:构造函数2 找关系:调用,被调用构造函数创建FutureTaskexecute()中启动FutureTasksExecuter,线程池。典型的线程池结构用法。 重难:AsyncTask与县城和线程池的关系如何分析进程的内存占用 考核:AsyncTask是多线程么?是,线程池与Handler相比,AsyncTask消耗资源情况如何,为什么?更多。新线程,线程池。  

  • android视频教程18的笔记

    概念性知道Dalvik虚拟机基于JVM的改进机器对移动设备的好处1 dex file format几个class变为一个dex,constant pool常数共享.省内存2 Zygote shared lib and heapZygote,copy-on-write shared(很少写),省内存,启动快。一个进程开启一个dvm,有很强的独立性。共享底层lib读的内存数据共享3 Register-based ISA基于寄存器的bytecode,省指令,省cpu,省电java vm基于栈,有很多push,pull动作。4 Trace-Granularity JITTrace-based JIT,省内存,省CPU,省电编译器优化。移动设备服务器上编译。 知道apk的结构知道class,apk,dex和odex文件的关机,及转换工具,存放位置dex文件在apk中。apk可以rename为zip解压缩。AndroidManifest.xml,res(.png,.xml)(aapt tool)R.java MyService.aidl(aidl tool)MyService.jva .java  android.jar(javac compiler).class *.jar external JARs(dx tool,源码/android/dalvik/dx/src:DexFile.java add() toDex()toDex0())classes.dex(akpbuilder tool PackageManagerService.java scanPackageLI()OptMain.c main())MyApp.apk adb shell位置:C:\Android\android-sdk\platform-tools>adb shell Dex在何方?如何生成?dexter:dx jar/class to dex在Eclipse插件中,保证在apk中。安装apk时,dexopt解压apk获得dex文件,存于dalvik-cache中,dexopt也可从apk或dex生成odex,存放与apk或jar文件同目录。文档:/android/dalvik/docs/ Dalvik VM之所以能优化JVM,各项措施是基于啥前途或假设?什么情况下得不到想要的优化效果?(Jeopardize)类似class中有一样的常量,优化才有效; 解压缩apk文件,观察其结构system/app/dexdump获取dex文件信息 

  • android视频教程17的笔记

    三个大实验,5个小实验。一、验证子线程中用主线程Handler实例操作主线程的MessageQueue。Handler1.sendMessage,Handler1接收Handler1.sendMessage,Handler2能接收吗?---no.同一个线程的同一个消息队列,不同的handler实例,彼此之间发送和接收消息是相对独立的,消息体的what属性来标示。主线程就一个消息队列,为什么不同Handler实例之间不能共享消息(what flag) 二、验证用子线程默认是没有消息队列的子线程中new Handler(),发消息----发生异常,log提示子线程无looper实例,不能发消息。子线程中用HandlerThread,默认有消息队列---可以发消息。官方提供的特殊线程。HandlerThread子类中,run方法中Looper lp = this.getLooper();new Handler(lp){        handlerMessage ...}.sendMessage(...); 使用lp就可以发消息了。HandlerThread在继承Thread基础上加入looper和handler的一些特性。 三、子线程的Handler可以使用子线程的消息队列子线程中得到主线程的looper,发消息。子线程的run方法中:Handler lab3Handler;lab3Handler = new Handler(Looper.getMainLooper()) {...};这种用法比较少,实际意义不大。使用Looper.prepare(),Looper.loop()。在当前子线程建立一个消息队列,handler和消息队列都在子线程中。---实际意义更不大。在子线程run方法中Handler lab3Handler;Looper.prepare();----建立一个looper的实例。lab3Handler = new Handler(){           handleMessage ...}lab3Handler.sendMessage(...);Looper.loop();实验总结:Handler实例与消息处理是关联的,发送和接收要匹配。(同一个handler自己发送和接收。)Handler操作队列,主要是在子线程操作主线程消息队列。(子线程发送消息到主线程消息队列,主线程接收到后更新界面显示)子线程默认是没有消息队列的。 使用Handler是异步的,它会建立新线程吗?---不会handler是在主线程内吗?一般在主线程,如果建handler时构造函数传入的是子线程的looper,是会(可以)在子线程内的。Handler的post和sendMessage方法,使用的是一个队列还是两个?一个子线程中建立一个handler,然后sendmessage会怎样?默认情况下会抛异常;如果实例化looper后再sendMessage是可以的。子线程建立handler,构造的时候传入主线程的looper,可以吗?可以 一般子线程用主线程handler操作主线程消息队列,涉及两个线程,实现异步,handler本身不建立新线程(post(Runnalbe)).子线程中不能直接创建handler发消息。子线程是HandlerThread,实例化looper,传给建立handler的构造函数,这个子线程的handler才能发消息,子线程handler操作主线程消息队列。 

  • android视频教程16的笔记

    Handler概念,实现原理,异步实现方法,与线程的关系Handler消息队列的实现 使用Handler是异步的,它会建立新线程吗?Handler是主线程内吗?Handler的post和sendMessage方法,使用的是一个队列还是两个?mars将有两个队列,线程队列和消息队列。应该只有一个队列。子线程中建立一个handler,然后sendMessage会怎样?子线程建立handler,构造的时候传入主线程的Looper Handler是做什么的,既然是异步任务处理,他本身是多线程的吗? Handler作用:1 执行计划任务2 线程间通信 Handler的要素:1 Handler.java 连接Looper和Message的操作,不关心Looper和Message的实现。post()发送Runnable接口实现,实际调用sendMessage。1 消息发送到消息队列。2 回调函数和Runable关联。sendMessage()把消息发送到消息队列。handleMessage()接收2 Looper.java(相当于隧道,监听器,监听消息队列中的消息)可以关联消息队列并监听。prepare()让当前线程具有一个looper的实例。loop()循环监听消息队列。不是所有的线程都有looper思考一下looper的实现?handler不是一个线程looper是一个死循环,存在于一个线程中。looper由系统来控制的,底层vm控制,和当前主线程没关系。looper没有新开一个线程。并非每个线程都有一个looper实例。3 Message.java,MessageQueue.javaMessageQueue.java:enqueueMessage()将消息体放到消息队列。next()游标指向下一个消息。looper循环时会用到。Message.java:实现Parcelable接口。一般需要传递的对象实现这个接口。需要序列号的还要实现序列化接口。what属性 name-space一个线程一般只有一个消息队列。一个handler实例只能接收到自己发出的message信息。共用一个messageQueue,通过what属性,只取自己的message。obtain()获取一个message对象的实例。handler中会通过botainMessage得到消息。实际是调用Message的obtain()方法。5.线程:UI Thread通常是main thread,android启动程序时会替它建立一个MessageQueueHandler不开启新的线程。HandlerThread类默认有looper。

  • android视频教程15的笔记

    另外的老师讲解。虚拟机概念,JVM,JIT虚拟机带来的好处C++和Java编译上的区别应用层代码不修改,为何有时候可以编译过,有时候编译不过? 什么是虚拟机虚拟机分两种:1 System virtual machine:一个系统的仿真和抽象,可供一个或多个操作系统在上面运行。eg,VM Ware,OEMU,KVM虚拟机指令集可与硬件cpu指令不同提供隔离isolation2 Process virtual machine:只供一个进程的仿真执行。eg,JVM,Microsoft.NET,Android的Dalvik 什么是JVMjava code (.java)JAVAC compilerbyte code (.class 类汇编语言,和硬件无关,和os无关)不同系统的JVM Windows,Linux,Mac WORA:Write Once,Compile once,run anywhere应用程序和bytecode编译器独立于硬件(machine-independent)虚拟机软件仿真要实现指令集转换,虚拟地址物理地址的转换,代价:慢!Java刚问世时比C/C++慢20*+ 什么是JTI改进(慢):实时编译JIT(Just in Time) compiler只有新的bytecode指令需要编译10*faster using JIT需要存储空间,占内存(memory footprint)啥叫实时?编译什么? 汇编器,链接器,加载器汇编器Assembler,转换标签(Tag)为偏移量(offset),汇编语言的IDE链接器Linker,多个目标文件和库变为一个可执行文件或者新的库lib obj《linker》lib dll exe动态链接vs静态链接动态,编译过的常用库二进制码只存一处,更新方便,but...Dll Hell-如缺少函数,函数名变了。加载器loader,加载到内存,execve()  

  • android视频教程14的笔记

    了解Linux多线程概念了解Android的一步任务机制了解Android多线程的实现 Linux有真正意义的多线程吗? linux如何支持多线程的?(附加两个系统库实现线程:LinuxThreads or NPTL(Native Posix Thread Library,radhat推出)。Linux2.6之前采用LinuxThreads。NPTL资源消耗更低,也是1:1的机构,但在信号处理,线程同步,存储管理等多方面进行了优化)我们吧线程系统分两类1、操作系统内核实现了现场模型(核心级线程)-Windows-线程与进程的多对多模型,线程的调度者在核内。windows线程调度效率比较高SampleEdraw画图工具,windows线程模型OS kernel:Process ModelProcess Manage and DispatchThread ModelThread Manage and DispatchLibraries:Porcess PiperThread PiperUserApplication:UserProcessUserThreadThreadPool用户进程和用户线程是多对多的关系:Many to Many 2、操作系统核外实现的线程(用户级线程)-Linux,部分Unix-线程与进程的一对一、一对多模型,线程的调度者在核外。效率不高。Sample:Linux设计遵循:简单即是美。最开始对线程没有充分的考虑,没考虑多核cpu。内核中轻量级进程:为了减少进程切换的开销,把资源从主体分离,进程共享资源,形成轻量级进程。OS kernel:Process ModelProcess Manage and DispatchLite Process ModelLite Process Manage and DispatchLibraries:Porcess PiperThread ModelUserApplication:UserProcessUserThreadThreadPool用户进程和用户线程是一对一的关系:One to One 代码分析:Pthread.c Android如何进行多线程或者异步的处理?(和java一样)new Thread:要调用start()方法Runnable:是线程体,通过线程thread执行。Handler(异步任务):post(Runnable)方法不启动新的线程,没有真正实现异步。Handler是通过HandlerThread 使得子线程与主线程分属不同线程的。实际上,HandlerThread 是一个特殊的线程,它是一个封装好Looper的线程。AsycTask(异步任务)(Handler和AsycTask后面有课程剖析源码) 百度了下Thread和Runnable区别,参考http://www.jb51.net/article/37465.htmhttp://www.iteye.com/problems/66985http://blog.csdn.net/boyupeng/article/details/6208072Runnable可能并没有开启一个新的线程,mHandler.post(r)其实是只调用线程的run()方法,然不是调用start()方法来启动一个新线程;而Thread必需执行start方法才启动一个新的线程,mars的java提到执行run()方法没有启动新的线程。 什么时候需要多线程和异步?说白了就是耗时操作和定时操作(android耗时一般指超过5s;定时一般指一个schedule task的需要)IO操作(网络操作,文件操作,数据库操作)复杂的运算工作消息接收方法中的耗时操作计划任务 多线程同步Synchronized 多线程和界面交互Android UI 主线程简单原则:不要Block UI Thread;不要在UI线程外直径操作UI.1 Activity.runOnThread(Runnable)2 View.post(Runnable);   View.postDelay(Runnable,long)3 Handler4 AsyncTask baidu多线程和异步:多线程可以制造异步的效果.有阻塞(不干活,白白等待)就需要异步  无阻塞无需异步,无需多线程.异步简单说就是,数据处理不会阻塞,而是立即返回继续处理下一任务异步是针对当前线程处理的时序上的概念。异步就是用多线程来实现的异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。

  • android视频教程13的笔记

    2G源码下载完成。Git tag 验证 build编译flash刷机,可以刷模拟器或者真机。初始化环境  .build/envsetup.sh选择一个Build Tag。 lounch full-engmake  大概2-3h  to 20m      1、操作系统位数不匹配的解决办法。Sundy也只做了补丁文件。      2、编译快完成时出现异常,Ubuntu11.04特有问题。下载一个补丁。编译内核--修改了驱动时编译SDK。 make sdk 修改activity等。out/target/product/generic/sdk/三个映像文件,且打成一个zip包供刷机用。调用emulator启动编译好的ROM。根目录下 emulator 1、系统的应用程序在哪?system/app/源码 package/apps2、make编译的是所有的内容吗?是否包括内核和SDK?不包含内核和SDK(framework)的编译 源码下载编译过程常见问题:Python版本过低JDK 不匹配安装了Java之后Java环境不生效操作系统位数不匹配 

  • android视频教程12的笔记

    Android Framework源码下载及编译Android不同不能比源码环境配置的不同源码版本控制用的工具什么是Repo Windows Cygwin下载 三部曲:一、准备Linux下的环境(参考官网的版本建议)这里有Sundy的详细版本。developer.android.com --应用开发查source.android.com--看源码 检查并且安装Python & Git按键JDK安装需要的包配置USB访问  二、下载源码安装Repo(仓库) 基于Git的管理工具,Git命令麻烦点。Git是分布式的。初始化Repo Client(及仓库) 开始同步文件验证Git Tag 三、Building & Flash 

  • android视频教程10的笔记

    分享原因:1.不知道activity中setContentView显示界面怎么实现的。2.界面空间树概念3.模式的使用4.是面试题 Activity是android的显示视图吗?Activity、Window、View的关系是什么?LayoutInflater是做什么的?layoutInflater.inflate()做什么的? Activity启动过程初始Window对象及使用WindowManagerActivity的setContentView过程中Window加载View Activity:setContentView()for adding viewattach()for starting PolicyManager 实现Ipolicy接口 PolicyphoneWindow makeNewWindow() PhoneWindow----》Window setContentView()setContentView()PhoneWindowaddContentView() ViewGroup---》ViewaddView() layoutInflater  把资源文件构造实例化from() 代码跟踪:Activity.javaattach()中mWindow = PolicyManager.makeNewWindow(this); 返回Window类型,返回PhoneWindow,Window是个抽象类。 PolicyManager.javamakeNewWindow()调用Ipolicy接口的函数。Ipolicy是Policy来实现的。 Policy.javamakeNewWindow()new一个PhoneWindow返回。 PhoneWindow.javaWindow是个抽象类,通过也是唯一的实例化类PhoneWindow来实例化。构造函数中如何实例化的:LayoutInflater.from()返回一个实例 Activity.javasetContentView()中getWindow()先得到当前窗体,setContentView() PhoneWindow.javasetContentView()中ViewGroup的对象addView() 1、一个Activity构造的时候一定会构造一个Window(PhoneWindow),并且只有一个。2、这个窗户有一个ViewRoot(View,ViewGroup).Layout,Layout.Inflater3、addView()。4、WindowManagerService接收的西欧阿西,并且回调Activity函数,如onKeyDown()Activity是控制单元,Window是承载模型,View才是真正的视图 写一个例子,用window的setContentView,参数不指定R资源文件,而直接用把资源文件加载成View对象(实例化成view),通过inflater实现。rootView,有视图树 

  • android视频教程9的笔记

    Launcher.java(apckages/apps/launcher)继承ActivityonCreate()中startLoaders()startLoaders()中sModel.loadApplications(),sModel是一个LauncherModel对象 LauncherModel.javaloadApplications()中startApplicationLoaderLocked()启动了一个线程(叫ApplicationsLoader)来加载。ApplicationsLoader(Thread,实现Runnable)的run()方法,PackageManager 加载应用程序信息、查询activity列表,参数:第一次加载所有,之后加载改变过的。 查grateview的onClick事件Launcher.javaonClick()得到当前应用程序(选中的)信息,主要是intent信息,启动activity。 manifest中配置,launcher,主activity packageManagerService的功劳 Launcher和ACTION_BOOT_COMPLETED的启动顺序?launcher在前。 点击图标能否不启动界面,直接启动service?点击一个应用程序图标开始,发生了什么事?(在manifest直接配置为启动主service。)不能直接启动一个service。只能启动activity,查询也只查询activity。这种配置,应用安装上,launcher无法加载和识别,不会在launcher中显示。 应用程序退出主动退出方法finish()--主要针对activitySystem.exit()restartPackage()Activity Stack被动退出,涉及虚拟机,后面单独讲   

  • android视频教程8的笔记

    学习思路,重在理解,多看几遍,难度较深。涉及java,c,c++Zyugote(孵化器)进程是什么? 一、linux启动:bootloaderkernel 二、android系统启动-Init.rc启动(system/bin下的系统启动配置文件、脚本) /system/bin/ServiceManager--Binder守护进程(和界面无关,会持续运行在后台,会用来接收响应和维持系统运营。apache服务器的服务监听就是个守护进程)RuntimeZygote-app_process/App_mainStart VMSystem Serverstart android services-Register to ServiceManagerstart launcher uml图/system/bin/ServiceManagerZygote----app_main.cpp:main()AndroidRuntime.cpp:start()              JNI invokeZygoteInit.java:main()SystemServer.java:main()init1()      com_android_server_systemService.cpp      system_init.cppinit2() 调用runtime->callStatic(),启动ServerThread(核心服务在这里):     PowerManagerService     ActivityManagerService     WindowManagerService     PackageManagerService(最重要的,应用程序靠这个启动)     ... 跟踪代码。Init.rc(system/core/)两处关键启动:service servicemanager /system/bin/servicemanager(守护进程,早于启动虚拟机)service zygote /system/bin/app_process ...(启动系统服务) ServiceManager.cppstart()   (运行在后台,让后面虚拟机启动,池的启动有个正常的环境) app_main.cpp(类)main() 添加虚拟机参数;设置了一个进程,名为zygote;runtime.start()启动了一个类ZygoteInit;runtime是个AppRuntime类;猜ZygoteInit是孵化虚拟机的,每启动一个应用都启动一个虚拟机 zytogeInit.javamain() startSystemServer()启动系统服务;永久的循环监听,一直运行runSelectLoopMode() (socket通讯也会这样做),得到socket通讯的请求,来启动一个虚拟机(startSystemServer()启动虚拟机,名字叫SystemServer)。 SystemServer.java(framework下)main()调用Init1()是个native JNI的调用。找到对应文件夹的cpp源文件/frameworks/base/services/jni/com_android_server_SystemServer.cpp com_android_server_SystemServer.cppc的动态链接extern "C" int system_init(); system_init.cppruntime->callStatic 调回去SystemServer,init2方法 SystemServer.javaInit2()启动线程ServerThread()---每个系统的service的启动线程,开机就启动,远程的;ServerThread()中PackageManagerService等系统service的启动。此后再启动launcher,完成启动。 三、应用程序启动-Running PackageManager

  • android视频教程7的笔记

    在做企业级应用非常重要。为什么需要用到Activity状态保存,如何用?eg,正在打字,来了电话,系统是否内存而没有保存;屏幕从竖屏切换横屏,重新start而没有保存输入内容。期望没有退出的情况下切换能保持状态连贯。 熟悉onSaveInstanceState,onRestoreInstanceStateonSaveInstanceState保存,类似建立hash表,onCreate中的Bundle参数恢复。2.0之后可以onRestoreInstanceState恢复系统在回收当前Activity之前会调用onSaveInstanceState ;home,back两个键不会调用此方法。被来点打断这种会调用。(百度补充:这个“容易被系统销毁”包括以下几种情况:(1)当用户按下HOME键的时候(2)长按HOME键,选择运行其它程序的时候(3)按下电源键的时候(4)从一个Activity启动到另一个Activity (5)屏幕方向切换时,例如从横屏切换到竖屏(这个时候Activity是真正被销毁了)) 熟悉preference保存信息及恢复信息借助activity lifecycle+preference来完成状态保存。onPause()onResume()没有bundle参数,通过getPreferences()保存。横竖屏幕切换,按了home、back后再回来。保存为xml文件 如何选择到底用SaveInstance还是用preference

  • android视频教程6的笔记

    分析过activity,window,view三个类之间的关系 activity什么时候实例化的,实例化过程是怎么样的?生命周期是如何注册和监控的?activity与Binder的关系。要理解清楚Activity就要理解清楚Context。 定义。本身并不是界面。 类继承关系,启动,生命周期。继承Context类startActivity()方法在ContextImpl中实现。跟踪startActivity(),execStartActivity(),ActivityManagerNative的startActivity()方法。虚拟机在控制activity的启动。生命周期:观察者模式。ActivityMonitor(Instrumentation中)类,监控Activity 和Binder的关系Intent,数据实际通过Binder传。Binder是跨进程通讯机制。跨组件,跨网络,跨io操作。Binder.java 上层实现。当中C/S结构。不同进程间的,而非网络的。类似win32的com机制。有数据共享池,底层linux支持。(广播,管道,共享内存,binder自己决定)。会用到进程间通信IPC,于是全部统一为进程间通信机制binder  

  • android视频教程5的笔记

    MindManager--课程思维导图 manifest文具店使用及系统解析此文件的过程。manifest文件,系统是吗时候加载,里面定义的activity和service什么时候实例化的。 查看官网帮助。标签是重点。<instrumentation>往往自动化测试,单元测试时用到最好了解全部标签。 结构-典型的xml 作用:抱的唯一指定名四大组件的定义定义应用程序具备的权限定义Instrumentation做自动化测试定义应用程序所需的最小API版本号列举应用程序所需要的类库 manifest系统是如何解析的?(activity如何实例化,常驻在内存中?)1 系统启动的时候PackageManageService去读Manifest信息。(xml映射到共享内存,以供查询。在共享内存中存为数据表)2 应用程序启动的时候,Launcher进行系统级判断,比如最小SDK等。(startActivity()启动主activity)3 四大组件在需要的时候实例化。 启动要用到context  

你感兴趣的课程

8万+浏览/ 916学员/ 4.5评分
免费
6万+浏览/ 177学员/ 5评分
免费
6万+浏览/ 971学员/ 4.8评分
免费