阅读 94

Android基础知识

今天看到一个观念,测试的能力大致可以划分为三个能力层次:发现问题、定位问题、预防问题。
发现问题各种方式方法,比如边界值等;
定位问题要求测试综合能力强,比如业务熟悉、代码熟悉、平台(Liunx系统、Android系统)熟悉等均有很强烈的要求;
感觉目前连发现问题的能力都还有所欠缺。。不过个人觉得,对于业务、代码、平台的熟悉度提高,对于发现问题的能力也是有很大提升的,毕竟对于测的业务都不了解,怎么知道覆盖情况呢。

Android 系统架构

由下至上依次是:

1、Linux内核层
Android是基于Liunx内核的,Linux内核提供了安全性、内存管理、进程管理、网络协议和驱动模型等核心系统服务。Linux内核层为各种硬件提供了驱动程序,如显示驱动、相机缺洞、蓝牙驱动、电池管理等等。

2、硬件抽象层(Hardware Abstraction Layer)
Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽底层的实现细节。HAL可定义一个标准接口以供硬件供应商实现,这可让Android忽略较低级别的驱动程序实现。

3、Android系统运行层
这一层包括Android Runtime和原生态的C/C++库。
通过C或者C++库为Android系统提供主要的特性支持,例如Surface Manager管理访问显示子系统和从多模块应用中无缝整合2D和3D的图形,WebKit提供了浏览器支持等。可以使用Android DNK直接访问某些原生态库。

Android运行时,其中包括了ART虚拟机(Andriod 5.0之前是Dalvik虚拟机,ART模式与Dalvik模式最大的不同在于,在启用ART模式后,系统在安装应用的时候会进行一次预编译,在安装应用程序时会先将代码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提升。如果您的应用在ART上运行效果很好,那么它应该也可在Dalvik上运行,但反过来不一定。)每个Java程序都运行在ART虚拟机上,该虚拟机专门针对移动设备进行了定制,每个应用都有自己的Andriod Runtime(ART)实例。此外,Android运行时还包含一套核心运行时库,可提供Java API框架使用的Java编程语言大部分功能,包括一些Java 8语言功能。

4、Java API框架层
这一层主要提供了构建应用程序时可能用到的各种API,开发者通过这一层的API构建自己的APP,这一层也是APP开发人员必须要掌握的内容。

5、系统应用层
所有安装在手机上的系统应用都属于这一层,用户自己开发的应用也属于这一层。

Android四大组件

1、activity(界面):用来显示Android的程序界面,一个activity通常就是一个单独的屏幕(窗口)。

2、service(服务):没有界面的后台服务,会一直运行在后台。常被用来做数据处理,也可以做一些定时的任务。

3、content provider(数据交换):直译为内容提供者,它是用在不同的应用程序之间共享数据时,可以把一个应用的数据提供给其他的应用使用。

4、broadcast receiver(广播):广播接收器,在广播机制中充当广播的接收者的作用,Android中充满了各种广播,所有需要有选择地接收一些有用的广播,然后处理这些广播。

Activity生命周期

activity的四个状态

running->paused->stopped->killed

  1. running->当前显示在屏幕的activity(位于任务栈的顶部),用户可见状态。
  2. paused->依旧在用户可见状态,但是界面焦点已经失去,此activity无法与用户进行交互。
  3. stopped->用户看不到当前界面,也无法与用户进行交互,完全被覆盖。
  4. killed->当前界面被销毁,等待被系统回收。当一个Activity处于暂停状态或者停止状态时就随时可能进入死亡状态,因为系统可能因内存不足而强行结束该activity。 关于activity四个状态所在的生命周期:

activity生命周期过程

主要有7个方法:onCreate()、onStart()、onResume()、onPause()、onStop()、onRestart()、onDestory()。

onCreate():当我们点击activity的时候,系统会调用activity的oncreate()方法,在这个方法中我们会初始化当前布局setContentLayout()方法。 
onStart():onCreate()方法完成后,此时activity进入onStart()方法,当前activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。
onResume(): onStart()方法完成之后,此时activity进入onResume()方法中,当前activity状态属于运行状态 (Running),可与用户进行交互。 
onPause():当另外一个activity覆盖当前的acitivty时,此时当前activity会进入到onPause()方法中,当前activity是可见的,但不能与用户交互状态。 
onStop():onPause()方法完成之后,此时activity进入onStop()方法,此时activity对用户是不可见的,在系统内存紧张的情况下,有可能会被系统进行回收。所以一般在当前方法可做资源回收。 
onDestory():onStop()方法完成之后,此时activity进入到onDestory()方法中,结束当前activity。 
onRestart():onRestart()方法在用户按下home()之后,再次进入到当前activity的时候调用。调用顺序onPouse()->onStop()->onRestart()->onStart()->onResume().
复制代码

activity的进程优先级

前台进程>可见进程>service进程>后台进程>空进程

前台进程
1、当前进程activity正在与用户进行交互。
2、当前进程service正在与activity进行交互或者当前service调用了或者当前service调用了startForground()属于前台进程或者当前service正在执行生命周期(onCreate()、onStrat()、onDestory())
3、进程持有一个Broadcast Receiver,这个Broadcast Receiver正在执行onReceive()方法

可见进程
1、进程持有一个activity,这个activity不在前台,处于onPause()状态下,当前覆盖的activity是以dialog形式存在的。
2、进程有一个service,这个service和一个可见的activity进行绑定

后台进行: activity的onStop()被调用,但是onDestory()没有调用的状态。该进程属于后台进程。

空进程: 该进程没有任何运行的数据了,且保留在内存空间,并没有被系统killed,属于空进程。该进程很容易被杀死。

Service生命周期

Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。服务可由其他应用组件启动(如Activity),服务一旦启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响。 Service生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径:

通常分为两种服务:

  • 本地服务,Local Service用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。 在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次 stopService()来停止。
  • 远程服务,Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服 务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。

总结:

  • 如果service是被开启的,那么它的活动生命周期和整个生命周期一同结束。
  • 如果service是被绑定的,它们它的活动生命周期是在onUnbind()方法返回后结束。