第一节:AAF110426_玩懂Log,打开Android大门:
1.利用monkey进行压力测试
monkey -p packageName -v 次数
2.出现异常的情况
FC,NAR
NAR:第一种是handMessage超过10s,第二种是等待消息超过5s造成的
3.异常的log日志一般存放在/data/log下面
4.ANR的日志搜索ANR,FC的日志搜索fatal
第二节:AAF110427_进程生命周期(Process Lifecycle)
1.进程等级
A:Foreground Process
正处于Onresume的Activity
正处于与bound服务交互的状态
正处于服务前台的状态(StartForeground())
service生命周期正处于Oncreate(),OnStart(),OnDestroy()
BroadCastReceive正执行onReceive()
杀死foreground状态需要用户的相应
B:Visiable Process
弹出对话框
C:Service Process
非上述两种,正在运行的Service
D:Background Process
不可见的Activity进程(onStop()被调用)
E:Empty Process
没有运行任何组件的状态,主要起缓存的作用。例如退出一个输入框,下次进去的时候,原来输入框的信息还存在。
进程的入口是通过一个packageManage的类,将launch写入到内存中
第三节:AAF110428_Android应用程序入口和出口
入口:
AndroidSystm--startLaunch----startActivity
实际上Launch是extends了Activity的。在开机的时候就会执行startLaunch,而oncreate()方法中有一个Loading Packinfo of APPs 的方法。这个方法是通过PackageManage的类来加载Activity的。点击了一个app则执行onclick() 方法。中的startActivity() 方法。
LAUNCH比ACTION_BOOT_COMPLETED先启动
出口:
finish()
System.exit();
restart Package()
Activity stack()
第四节:AAF110429_介绍Manifest文件的使用
Manifest文件是如何被解析的
1.系统启动的时候
PackageManageService读取Manifest文件信息,将XML映射到共享内存中
2.应用程序启动的时候
Launch进行系统级的判断,例如最小SDK等
3.四大组件在需要的时候才被实例化
到共享内存中去查找,查到到了在去实例化。
第五节:AAF110430_Activity,Window,View的关系
考虑两个方面第一:Activity启动过程(attach)初始化Window对象及使用WindowManage第二:Activity调用setContentView过程中加载view
1.一个Activity构造的时候一定会构造一个Window(PhoneWindow),并且只有一个
2.这个窗户有一个RootView(View,ViewGroup)
3.addView()
4.windowMangerService接受消息,并且回调activity的函数,例如onKeyDown();
第六节:AAF110430_Android 中 Context介绍
Context可以看作是一个环境变量和句柄,手里握着很多的权限。Activity,Service等都是extends自Context。实际上各种Manage,startActiviyt这些方法都是Context定义的
第七节:AAF110502_Activity 是什么
1.Activity如何实例化的:Activity通过StartActivity启动,由于Activity是extends自context的。在context查到StartActivity调用了ActivityManagerNative.getDefault.StartActivity().所以启动Activyt是通过系统的原生层实现的。
2.Activity的生命周期:利用观察者模式,通过ActivityMonitor监听各个生命周期
3.Activity与binder是什么关系。Activity通过intent传值,实际上Activiyt之间通信是通过binder来实现的。binder是android的IPC通信的机制。可以用C/S模型来进行理解。
第八节:AAF110504_Activity状态保存
Activity两种状态保存方式
第一:onSaveInstanceState/onRestoreInstanceState,onCreate
系统回收当前Activity的时候会调用onSaveInstanceState方法。例如,你正在打游戏,突然有一个电话来了。这个时候就会调用onSaveInstanceState。执行顺序onRestoreInstanceState---onResume---onSaveInstanceState---onPause
第二:lifeCycle结合SharePreference来保存
对于Back键,Home键,横竖屏等操作,系统是不会调用onSaveInstanceState方法的。这个时候就需要使用SharePreference来保存成XML文件来。
第九讲:AAF111029_Android界面开发的基础(二)
所有的UI控件均继承自View和ViewGroup。只需注意两点。第一界面的呈现,第二响应界面的事件
界面的呈现:通过onDrwa(Canvas canvas),validate()线程非安全和posValidate()在子线程中调用实现。
界面的事件:onKeyEvent,onTouchEvent,实际上是phoneWindow的windowManageService来进行事件处理的
第九节:AAF111029_Android界面开发的基础(三)
android界面的2+1原则。呈现和事件+摆放
呈现通过两种方式。一种是xml的静态加载。一种是layoutInflater.form。
事件触发分为:onKeyEvent和onTouchEvent
事件的分发分为两种:对于key:消息发给当前上下文,context发给window,window发给输入框体,发给rootview,继续下发直到focus的view。对于touch。根据点击的位置快速定位到focus。
事件的执行。从控件树的最小层开始执行。如果返回true则交给上层继续处理,返回false则上层不再处理。
第十节:LLY110426_Android系统启动过程(Android)
本节课讨论从按下电源键到应用程序启动整个过程的启动。主要分三层来讲解。第一层:Linux系统启动。第二层:Android系统启动。第三层:应用程序启动。
第一层:Android是基于Linux的。所以这里和Linux系统本身的启动是一样的。加载BootLoader,启动Kernal。
第二层:Android系统的启动。启动的入口是Init.rc---ServiceManage.cpp(daemons)----zygote(孵化器)---startVm(dalvik)----SystemService.java--serviceThread---PackageManagerService等各种*ManagerService
第三层:Android的应用程序启动。PackageManageService--startLauncher().
第十一课:AFF110525_Android多线程系统概述
与进程相对应,线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。
线程分为核心级和用户级的线程。核心级是内核自己处理的线程,用户级是用户发起的线程。在Linux中内核只有进程和轻量级的进程,没有线程的概念。用户层是有线程和进程
异步任务不一定是新线程
Thread,Runnable,Handler,AsyncTask这四种方式实现异步
多线程和界面交互有四种方法。第一Activity.runOnUiThread第二View.post(Runnable),View.postDelay(Runnable)第三:handler第四AsyncTask
第十二课:AFF110529_Handler-不可缺少的异步(上)
handler并没有开一个子线程,那么looper既然是循环监听,为什么主函数其它的方法也可以执行呢。其实looper是由系统来控制循环,即使没有开自线程,也不会阻塞主线程。
handler有两个作用:一个是定时任务(post),一个是线程之间通信(send,handle)。
handler三个重要的方法。第一个post,第二个,sendmessage,第三个handmessage
理解hander,message,messageQueue,looper之间的关系。
主线程一般是UI线程。主线程创建的时候就自动创建了一个looper和messageQueue。且只有一个。并不是所有线程创建的时候都会有looper和messageQueue。handlerThread是有looper和messageQueue的。
第十三课:AFF110529_Handler-不可缺少的异步(下)
handler可以在子线程中创建吗?这个比较复杂。核心点就是:创建handler必须要现有looper,没有looper这个对象就会报错,而只有主线程才会自动创建looper,子线程是不会创建looper的。
handler一般的用法是在子线程send在主线程handle
那么在自线程怎么创建handler呢?有三种方法可以实现。这三个方法的根本都是,在new thread之前,先实例化一个looper。
第一种方法:handlerThread是一个特殊的Thread。用这个thread可以调用looper
第二种方法:在子线程new handler(getMainLooper())这样就可以直接使用主线程messageQueue
第三种方法:在子线程中new handler之前,调用Looper.pre();之后调用looper.loop()
第十四课:AFF110606_AsyncTask异步任务
AsyncTask是新开了线程的。这个是它和handler的区别。handler是没有开新线程的。AsyncTask它有pending,running,finish三个状态。
new MyAsyncTask(Params Progress Result).excute(params);
主要的几个方法是
onPreExcute(),doInbackground(),onPostExcute();onUpdateProgress(),publishProgress();
通过追踪AsyncTask.java的源码可以发现以下几个问题
1.AsncTask是重新开了线程的,而且这个线程是放在了线程池进行管理的。
2.AsyncTask实例必须在UiThread中创建
3.AsyncTask必须在UiThread中执行
4.AsyncTask.excute()只能够执行一次。因为在执行前回坚持是否位pending状态,不是,则抛异常。
5.不要手动调用doInbackground,onPostExcute,等方法。