Sundy深入浅出读书笔记

第一节: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,等方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值