Android基础知识(一)
前言
前言
从软件测试最终目的发现问题缺陷来看,Findyou比较认同一个观念,测试的能力大致可以划分成三个能力层次:发现问题、定位问题、预防问题。有机会探讨一下这个分类。
发现问题各种方式方法,比如边界值,如何有效提高发现问题的效率?比如APP前后台切换数据为什么容易丢失?什么情况下容易产生OOM?
定位问题要求测试综合能力强,你比如业务熟悉、代码熟悉、平台(比如Linux系统、Android系统)熟悉等均有很强的要求。比如上文的栗子,APP前后台切换界面录入数据丢失,能否通过日志、代码、系统机制定位到准确的原因,如何找?
这是一个日积月累的过程,今天我们先从了解Android系统的一些知识入门学起。
Android系统有四种组件,这四种组件构成了Android应用的框架,然后由Intent联系这四种组件。
Activity:直译为活动,用来显示Android的程序界面,一个应用往往有多个界面,所以一个应用中会有多个Activity。
Service:服务,没有界面的后台服务,会一直运行在后台。常被用来做数据处理,也可以做一些定时的任务。
Broadcast Receiver:广播接收器,在广播机制中充当广播的接受者的作用,Android中充满了各种广播,所有需要有选择地接收一些有用的广播,然后处理这些广播。
Content Provider:直译为内容提供者,它是用在不同的应用程序之间共享数据时,可以把一个应用的数据提供给其他的应用使用。
Intent: 意图,描述应用想干什么。最重要的部分是动作和动作对应的数据。

应用程序层(Java应用程序):
该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。
框架层(JAVA框架):
该层是Android应用开发的基础,包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。开发人员可以完全访问核心应用程序所使用的API框架。
系统库和android运行时层(本地框架和JAVA运行环境):
包含一些C/C++库,这些库能被Android系统中不同的组件使用。Android运行时包括核心库和Dalvik虚拟机,前者既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,后者是一种基于寄存器的java虚拟机,Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。
LINUX内核层
Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。
主要有7个方法:onCreate()、onStart()、onResume()、onPause()、onStop()、onRestart()、onDestroy()。

启动Activity: onCreate()--->onStart()--->onResume(),Activity进入运行状态。
Activity切入后台:onPause()--->onStop(),进入停滞状态。【操作】当前Activity跳转到新的Activity界面,或者按Home键回主屏。
Activity返回前台: onRestart()--->onStart()--->onResume(),再次回到运行状态。
Activity后台,系统内存不足终止,再启动:onCreate()-->onStart()--->onResume(),Activity进入运行状态。
锁定屏与解锁屏幕:只会调用onPause(),而不会调用onStop方法,开屏后则调用onResume()
横竖屏切换时 Activity 的生命周期 :此时的生命周期跟清单文件里的配置有关系。1、不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期默认首先销毁当前 activity,然后重新加载。2、设置 Activity
android:configChanges=”orientation|keyboardHidden|screenSize”时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法。 通常在游戏开发, 屏幕的朝向都是写死的。
service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径:

图转换为文字:
context.startService() ->onCreate()- >onStartCommand()->Service running--调用context.stopService() ->onDestroy()
context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()
通常分为两种服务:
本地服务, Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。 在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次 stopService()来停止。
远程服务, Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服 务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加 载它。
总结:
如果service是被开启的,那么它的活动生命周期和整个生命周期一同结束。
如果service是被绑定的,它们它的活动生命周期是在onUnbind()方法返回后结束。

切换到该Fragment:onAttach--->onCreate--->onCreateView--->onActivityCreated--->onStart--->onResume
屏幕灭掉:onPause--->onSaveInstanceState--->onStop
屏幕解锁:onStart--->onResume
切换到其他Fragment:onPause--->onStop--->onDestroyView
切换回本身的Fragment:onCreateView--->onActivityCreated--->onStart--->onResume
回到桌面:onPause--->onSaveInstanceState--->onStop
回到应用:onStart--->onResume
退出应用:onPause--->onStop--->onDestroyView--->onDestroy--->onDetach
与Activity生命周期对比:

standard
模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
singleTop
如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
singleTask
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
模式之间的区别:
singleTop跟standard模式比较类似,singleTop跳转的对象是位于栈顶的activity(用户所见),程序将不会生成一个新的activity 实例,而是直接跳到现存于栈顶的那个activity 实例,按返回键程序将直接退出。
singleTask 模式和singleInstance模式都是只创建一个实例的。在这种模
式下,无论跳转的对象是不是位于栈顶的 activity,程序都不会生成一个新的实例(当然前提是栈里面已经有这个实例)。这种模式相当有用,在以后的多 activity 开发中,常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始终有点不好,而如果你将对应的 activity 声明为singleTask 模式,这种问题将不复存在,在主页的 Activity 很常用。
Manifest.xml文件中主要包括:
manifest:根节点,描述了package中所有的内容。
uses-permission:请求你的package正常运作所需赋予的安全许可。
permission: 声明了安全许可来限制哪些程序能你package中的组件和功能。
instrumentation:声明了用来测试此package或其他package指令组件的代码。
application:包含package中application级别组件声明的根节点。
activity:Activity是用来与用户交互的主要工具。
receiver:IntentReceiver能使的application获得数据的改变或者发生的操作,即使它当前不在运行。
service:Service是能在后台运行任意时间的组件。
provider:ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件。
在Android中,每个应用(Application)执行在它自己的进程中,无法直接调用到其他应用的资源,这也符合“沙箱”的理念。但各应用间需要交互通信,因此有了IPC(进程间通信)协议:AIDL。
实现步骤:
定义一个AIDL接口
为远程服务(Service)实现对应Stub
将服务“暴露”给客户程序使用
Force close,或者Crash
常见原因
Error: OOM(out of memory error)
Error:StackOverFlowError
RuntimeException
ANR,无响应
常见原因
1、当用户输入事件5s内没有得到响应,将弹出ANR对话框
2、广播接收者的onReceive()执行时间超过10s
基础知识
1、Main线程也称为UI线程、主线程
2、功能: 1.创建UI控件;2.更新UI控件状态; 3.事件处理
3、限制:Main线程不建议有超过5秒的事件
解决方案
1、所有可能的耗时操作都要在子线程()中执行
2、常见耗时操作:I/O,网络操作,SDcard,数据运算
3、子线程更新UI:handler+massage线程间通讯
参考:
[1] http://blog.csdn.net/vfush/article/details/51481127
[2] http://www.cnblogs.com/zhujiabin/p/5714797.html
本文为原创文章,如需转载,请在开篇显著位置注明作者和出处(这最先发在我自己玩的订阅号)
Android基础知识(一)的更多相关文章
- 【Xamarin开发 Android 系列 4】 Android 基础知识
原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...
- Android基础知识巩固:关于PendingIntent和广播
平时使用广播的场合比较多,但细节的东西,看过了也没有总结,以至于某些场合有小问题,还是要把原理和属性搞清楚才能运用自如. 其实也是自己比较懒,先看别人的blog,有个概念再去官网看英文的能好理解一些. ...
- android开发学习---linux下开发环境的搭建&& android基础知识介绍
一.配置所需开发环境 1.基本环境配置 JDK 5或以上版本(仅有JRE不够) (http://www.oracle.com/technetwork/java/javase/downloads/ind ...
- Android基础知识-1
1.Android的Activity任务栈 在Android的系统中,在APP运行时每个APP都会默认有一个任务栈,任务栈的名称以APP的包名命名.任务栈是一中先进后出的结构,APP中每一个调用的Ac ...
- 看看android基础知识,谁帮我作答
无论怎么着,了解一点android的基本知识还是有必要的,就当开阔一些自己的眼界吧. .. . android的四大功能组件是_activity_,_service_,_BroadcastReceiv ...
- Android基础知识学习
IPC (Inter-Process Communication) 意思是: 进程间的通信,是指两个进程之间进行数据交换的过程. Android中如何开启多进程呢? 只需要给四大组件(Activit ...
- Android基础知识之Manifest文件的组织结构
原文:http://android.eoe.cn/topic/android_sdk 是AndroidManifest.xml文件中的根标签,她必须包含一个标签和指定的xmlns:android. p ...
- Android基础知识之拼写检查框架
原文:http://android.eoe.cn/topic/android_sdk 拼写检查器框架 Android平台提供了一个拼写检查器的框架,来方便你在你的应用中实现并使用拼写检查.这个框架是A ...
- android基础知识:SharedPreferences和PreferenceActivity
1.android文件存储 对Android系统了解的都知道,Android系统有四种基本的数据保存方法,一是SharedPreference,二是文件,三是SQLite,四是ContentProvi ...
随机推荐
- eclipse web module版本问题:Cannot change version of project facet Dynamic Web Module to 2.5.
Description Resource Path Location TypeCannot change version of project facet Dynamic We ...
- MySQL服务安全加固
数据库管理人员可以参考本文档进行 MySQL 数据库系统的安全配置加固,提高数据库的安全性,确保数据库服务稳定.安全.可靠地运行. 漏洞发现 您可以使用安骑士企业版自动检测您的服务器上是否存在 MyS ...
- vue中使用scss
之前项目里我一般是使用less的,朋友问到如何引入scss,于是我就简单的跑了一下,以下主要供自己学习,如有更好的方法可以一起交流讨论一下 第一步,安装依赖 cnpm install node-sas ...
- JS基本事件(小记)
一. 事件的概念种类及作用(一) 概念:通常鼠标或热键的动作我们称之为事件(event),热键引发的一连串程序的动作,称之为事件驱动(event Driver).而对事件进行处理的程序或函 ...
- Django框架详细介绍---模型---ORM
一.概述 ORM(Object Relational Mapping),全称:对象关系映射,简单的说就是通过创建类.实例化出对象的方法,使得类.对象.对象的属性能够和数据库中的表.记录.字段意义对应. ...
- RxJava 详解——简洁的异步操作(二)
上次说的两个例子,事件的发出和消费都是在同一个线程的.如果只用上面的方法,实现出来的只是一个同步的观察者模式.观察者模式本身的目的就是异步机制,因此异步对于 RxJava 是至关重要的.而要实现异步, ...
- arcgis 制图-插值图
1.生成插值图 插值工具: 方案1:Spatial Analyst 工具-->插值分析-->反距离权重法 (IDW) + Spatial Analyst 工具-->提取分析--> ...
- vue-i18n安装配置,运行
需求:根据浏览器语言自动切换语言 1.安装vue-i18n, yarn安装 $ yarn add vue-i18n npm安装 $ npm install vue-i18n 2.导入语言包 src下创 ...
- Html h1-h6 标签
Html h1-h6 标签 <html> <body> <!-- h1-h6标签:标题标签 --> <h1>XSK</h1> <h2& ...
- 剑指offer(35)数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...