4.12 作业题

1.web测试和app测试的相同点与区别?

WEB测试重点

1.功能测试:

所实现的功能是否和需求一致;

2.界面测试:

界面是否美观,风格是否一致,文字内容是否正确;

3.链接测试:

打开链接速度是否合理;是否链接到正确的页面;是否有空白页面;

4.性能测试:

系统能支持多少用户同时在线;超过这些用户数,系统会给出什么样的反映;

5.兼容性测试:

项目在不 同操作系统,不同浏览器上功能是否能正常使用;

6.安全性测试:

用户的登录名和密码在传输过程中是否是加密传输的;

用户长时间未操作页面,session会话是否会过期,要求用户重新登录;

日志文件cookies里的用户名和密码是否是加密的;

登录次数和登录设备是否有限制,是否支持一个账号多个设备登录;

APP测试重点

1.安装卸载测试:

app在 不同的操作系统(安卓和ios),不同的版本,不同的机型上是否都能安装成功;

在安装过程中,突然断网或网络不好,是否给出有好的提示,网络恢复之后是否能正常下载;

在安装过程中,突然内存不足,是否有相应的提示;

在安装过程中,是否支持取消操作;

在安装过程中,突然死机,断电,卡死,手机恢复正常后,是否能正常安装;、

安装成功后能否正常运行

卸载时在不同系统,不同版本上能够卸载成功;

在卸载过程中是否支持取消操作;

在卸载过程中,突然死机,断电,卡死,手机恢复正常后,是否能正常卸载;

卸载完成之后,查看文件是否卸载干净; 

2.运行测试:

运行过程中,是否有加载提示;

运行速度是否流畅;

各个模块之间的切换是否正常;

3.更新测试:

打开旧版app时,是否有更新提示,且在不同的手机版本上都能更新成功;

打开新版app时,不显示更新提示,在设置中检查更新,提示已更新到最新版本;

app时强制更新,用户打开旧版app时,有更新提示,旧版qpp新版功能不可用,用户退出app,再进    app时,仍有强制更新提示;

app不是强制更新,用户打开旧版app,有更新提示,取消更新,再次打开时,仍有更新提示;

在不删除客户端的情况下,用户是否能更新成功,查看新版功能是否正常;

更新过程中,更新速度是否合理;

更新过程中,突然网络不好是否有提示;

更新过程中,突然死机,断电,卡死,手机恢复正常后,是否能更新成功;

4.兼容性测试:app在不同手机,不同操作系统,不同手机版本上功能是否正常;

5.弱网络环境测试:

appwifi4g3g2g情况下是否能正常运行;

app在网络不好时,是否给出提示;

app网络不好时,会出现重复提交,用户不断点击的问题,开发是否做判断;

当网络由不好变为良好时,软件功能能否正常使用

6.中断冲突测试:

app运行时拨打或接听电话、发送短信、接受邮件、启动相机等有何提示;

app运行时突然断电、断网、不断点击、不断刷新、切换前后台是否崩溃(变态测试)

7.压力测试:

安卓用monkey,不断点击、滑动屏幕,看软件是否崩溃,

8.应用的前后台切换:

app切换到后台,再回到app,检查是否停留在上次操作界面;

app切换到后台,再回到app,检查功能和应用状态是否一样;

app切换到后台,再回到前台时,注意程序是否崩溃,尤其对于从后台切换到前台数据有自动更新的时候;

手机锁屏解屏后进入app注意是否会崩溃,功能状态是否正常,尤其对于从后台切换到前台数据有自动更新的时候;

当杀掉app进程,再开启appapp能否正常启动;

对于有数据交换的页面,每个页面必须进行前后台切换和锁屏的测试,这种页面最容易出现崩溃;

出现必须处理的提示框后,切换到后台,再切换回来,检查提示框是否还存在,有时候会出现提示框自动消失的缺陷;

app横竖屏的切换,功能是否正常;

app手势的操作;

9.消息推送开关测试:

消息推送默认打开;

关闭消息推送关闭后,收不到推送消息;

打开推送开关能否正常接收消息;

app运行时消息推送不会进入消息栏;

app后台挂机时,消息栏可以接收到推送提醒,点击后从消息栏消失

10、性能测试

app运行时耗电量,流量,CPUMemery 

2.如何测试一个APP的登录功能?

功能测试 (Function test)

输入正确的用户名和密码,点击提交按钮,验证是否能正确登录

输入错误的用户名或者密码,  验证登录会失败,是否有相应的错误提示信息

登录成功后是否跳转到正确的页面

用户名和密码,如果太短或者太长,应该怎么处理

用户名和密码,中有特殊字符,和其他非英文的情况

记住用户名和密码的功能

登陆失败后,不能记录密码的功能

用户名和密码输入时前后有空格的处理

密码是否可见,是否用星号标识

界面测试 (UI Test)

布局是否合理,2Testbox 和一个按钮是否对齐

Testbox和按钮的长度、高度是否复合要求

界面是否美观

图片,颜色,字体,超链接,是否都显示正确

性能测试 (performance test)

打开登录页面,需要几秒

输入正确的用户名和密码后,登录成功跳转到新页面,不超过5

能支持多少个用户同时登陆

安全性测试 (Security test)

登录成功后生成的Cookie,是否是httponly (否则容易被脚本盗取)

用户名和密码是否通过加密的方式,发送给Web服务器

用户名和密码的验证,应该是用服务器端验证, 而不能单单是在客户端用javascript验证

用户名和密码的输入框,应该屏蔽SQL 注入攻击

用户名和密码的的输入框,应该禁止输入脚本 (防止XSS攻击)

错误登陆的次数限制(防止暴力破解)

可用性测试  (Usability Test)

是否可以全用键盘操作,是否有快捷键

输入用户名,密码后按回车,是否可以登陆

兼容性测试(Compatibility Test

主流的浏览器下能否显示正常(IE/Edge, Firefox, Chrome,Safari 等)

不同的平台是否能正常工作,比如Windows, Mac

移动设备上是否正常工作,比如iPhone, Andriod

不同的分辨率

不同的浏览器大小(浏览器最大化, 和非最大化)

软件辅助性测试 Accessibility test

软件辅助功能测试是指测试软件是否向残疾用户提供足够的辅助功能

比如高对比度下能否显示正常 (视力不好的人使用)

3. 推送消息如何测试?

消息推送对象

消息推送一般可以自定义推送对象,有全部推送,精确推送,及安卓和IOS渠道推送,注意推送对象是否正确,推送之前确认自己是否在测试环境操作,以免造成生产问题。

消息简介

客户端收到消息推送有两种形式,客户端后台运行一般推送显示在通知栏,客户端前台运行一般弹出弹框,简介内容注意字数过多溢出情况。

消息详情

注意详情所支持的内容,包括文字、图片、表情包、换行以及链接跳转。

消息推送场景(支持定时推送)

1)消息推送时间:

a)设置过去时间

b)未推送之前修改消息内容

c)删除消息,查看是否还会推送

2)客户端运行状态

a)前台运行

b)后台运行

c)进程关闭状态

2)特殊场景 

a)多个提醒冲突

b)当天设置当天推送

c)当天设置隔几天起效

4. APP闪退是由哪些原因造成的? 

闪退的原因和处理方法 

1、缓存垃圾过多

  平时在使用软件的过程中,会产生一些垃圾文件,如果长时间不清理会导致手机越来越卡,也会出现闪退状况。

  进入设置–应用程序——全部——找到有问题的应用程序,清除数据或者缓存。

(注:清除数据,会清除掉应用的个人设置、账户信息等。)

2、运行程序过多

  如果不进行设置,很多软件都会自己运行,而手机后台程序过多会造成内存不足,从而造成应用闪退。如出现软件闪退,可先清理内存后再试试。

3、手机杀毒软件

  部分手机软件存在着恶意代码,会被杀毒软件拦截因而不能正常进入,应该通过绿色下载平台或者使用软件商店来下载安全系数较高的游戏。

(注:以上三个原因都现在都可以通过安全软件清理,轻松解决。但需要注意在删除一些大型文件时请谨慎。)

4、应用版本问题

  如果应用的版本较低,会导致应用软件不兼容,造成闪退。如果是版本太旧,更新为新版本即可。

  如新版本如果出现闪退,是应用改版本还在调试中,无需担心,会很快修复。

5、网速问题

  部分软件需要一个稳定的网络,使用的是2G/3G网络,造成闪退的可能性比较大,建议在有WiFi的情况下玩比较好。

6、缺少数据包

  一些大型游戏需要数据包才能运行。所以要先安装好数据包才能使用。

7、系统不兼容

  部分软件对版本有一定的要求,如果系统版本过低,软件是不能支持的,所以会闪退。

8、分辨率不兼容

  一些软件对手机分辨率有一定的要求,如果手机分辨率不兼容,有部分软件就容易出现闪退或其它错误。

5. 测试过程中遇到APP出现ANR,你会怎么处理?

可以先把日志过滤出来: adb logcat | findstr xxxxx(过滤日志信息) ,然后再搜索其中的关键字,比如:exceptioncrash,看看是那些方法或者异常导致了问题的发送,初步定位问题原因后,可以交给开发人员去具体查找深层原因并修复。

6.如何查看移动端的日志,以及报错的异常有哪些?

js

new VConsole();

页面引入js

<script src="https://cdn.bootcss.com/vConsole/3.3.4/vconsole.min.js"></script>

  

  1. APP测试主要测哪些,以及如何对应展开的工作

了解测试需求;根据需求说明书和开发工程师的要求,了解被测系统的详情;

制定测试计划;了解详细后,编写测试计划,包括测试项目,测试时间,测试人员安排等。

编写测试用例;针对不同的功能模块,书写不同的测试用例。

施测试计划,按照测试用例进行实际测试,出现问题记录下来;

书写测试报告;根据测试记录,书写测试报告,并将测试结果反馈开发人员。验证修改结果,修改完成后在反复测试,从部分到系统,直到bug全部解决。测试结束。系统不再出现漏洞,满足客户功能、健壮需求,测试工作结束。

8. APP的性能测试关注点有哪些?

app性能测试分类:

1、响应

2、内存

3cpu

4FPS (app使用的流畅度)

5GPU过度渲染

6、耗电

7、耗流

(app除了这些性能测试,还有:手机版本号兼容性,屏幕分辨率兼容性,稳定性测试,安全测试等)

App性能测试响应点:

主要测试点:

1、冷启动:首次启动app的时间间隔(只是启动时间,不包括页面加载)

2、热启动:非首次启动app的时间间隔(只是启动时间,不包括页面加载)

3、完全启动:从启动到首页完全加载出来的时间间隔

4、有网启动:从发起跳转,到页面完全加载出来的时间间隔

5、无网启动:从发起跳转,到页面完全加载出来的时间间隔

(在项目中,主要测试关注点是冷启动,热启动)

测试标准:冷启动时间不超过1.5s, 热启动不超过1s. 

内存:

测试点:

1、空闲状态:切换至后台或者启动后不做任何操作,消耗内存最少。

2、中强度状态:时间偏长的操作应用。

3、高强度状态:高强度使用应用,可以跑monkey来测试(通常用来测试内存泄漏)。

** 内存泄漏:指应用里的内存一直没有释放,内存一直增加 ,系统内存一直减少 **

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

memory leak会最终会导致out of memory

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出.

建议:1.尽量不要在循环中创建很多临时变量

2.可以将大型的循环拆散,分段或者按需执行

CPU:

CPU测试,主要关注的是cpu的占用率。很多时候,我们玩手机时,会出现发热发烫,那是因为CPU使用率过高,CPU过于繁忙,会使整个手机无法响应用户,整体性能降低,用户体验就会很差,也容易引起ANRapplication not responding, 主线程(UI线程)如果在规定时内没有处理完相应工作,就会出现ANR)等等一系列问题。

测试点:

1).在空闲时间(切换至后台)的消耗,基本没大应用使用cpu

2).在运行一些应用的情况下,cpu已占50%的情况下,观察应用程序占用cpu的情况

3).在高负荷的情况下看CPU的表现(cpu占用应是在80%以上)

FPS (应用的使用流畅度)

FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS是测量用于保存、显示动态视频的信息数量。每秒钟帧数愈多,所显示的动作就会愈流畅。

´一般来说,Android设备的屏幕刷新率为60/s,要保持画面流畅不卡顿,要求每一帧的时间不超过1000/60=16.6ms,这就是16ms的黄金准则,如果中间的某些帧的渲染时间超过16ms,就会导致这段时间的画面发生了跳帧,因此原本流畅的画面变发生了卡顿。

GPU渲染

GPU渲染是指在一个像素点上绘制多次(超过一次):显示一个什么都没有做的activity界面算作画了1层,给activity加一个背景是第2层,在上面放了一个Text View(有背景的Text View)是第3层,Text View显示文本就是第4层仅仅只是为了显示一个文本,却在同一个像素点绘制了四次,这是一定要优化的。过度绘制对动画性能的影响是极其严重的,如果你想要流畅的动画效果,那么一定不能忽视过度绘制。

耗电量

测试应用对电量的消耗前需要对手机本身的电量消耗有个大概了解,测试前先看规定时间内手机正常待机下(重启后待机)电量消耗为多少。然后再启动待测试APP看看消耗的电量增加了多少取差值。 

测试点:

  测试手机安装目标APK前后待机功耗无明显差异;

  常见使用场景中能够正常进入待机,待机电流在正常范围内;

  长时间连续使用应用无异常耗电现象。 

9.如何对APP进行弱网测试?

概念:测试app在网络状态不好的情况进行测试、查看app的运行状

方法

10. 常见的ADB命令?

 

基础命令
1、启动adb服务
adb start-server

 

2、终止adb服务
adb kill-server

 

3、进入adb运行环境
adb shell

 

4、获取帮助 里面有adb的各种命令和参数的介绍
adb help

 

5、查看adb版本
adb version

 

6、以root权限重启adb
adb root

 

7、将system分区重新挂在为可读写分区,此命令在操作系统目录时很重要
adb remount

 

8、重启设备,可选参数进入bootloader(刷机模式)或recovery(恢复模式)
adb reboot [bootloader|recovery]

 

9、滑动
adb shell input swipe {x1} {y1} {x2} {y2}

 

10、点击
adb shell input tap {x} {y}

 

apk相关:

 

1、安装apk
adb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡

 

2、卸载apk
adb uninstall -k <package_name>
可选参数-k的作用为卸载软件但是保留配置和缓存文件

 

3、查看app相关所有信息,包括action,codepath,version,需要的权限等等信息
adb shell dumpsys package <package_name>

 

4、查看app的路径
adb shell pm path <package_name>

 

查看了一个普通app的路径,如下,位于data/app下面的普通app
package:/data/app/com.tencent.test-1/base.apk

 

5、查看apk的版本信息
adb shell dumpsys package <package_name> | grepversion

 

系统相关

 

1、查看设备名称,豌豆荚等应用就是通过此来获得设备的名称
adb shell cat /system/build.prop/

 

2、查看手机分辨率有两种方法,第二种方法最为简洁
adb shell wm size

 

3、查看手机sdk版本
adb shell getprop | grep version
运行上面的命令后,列出来的version中[ro.build.version.release]: [6.0.1]即为手机sdk版本

 

4、查看手机型号信息
adb shell getprop | grep product
运行此命令之后,能看到product,board,brand和cpu等等的型号

 

5、获取序列号,获取到的序列号即为adb devices列出来的序列号
adb get-serialno

 

7、查看wifi密码(需要root权限)
adb shell cat data/misc/wifi/*.conf

 

8、查看wifi_mac
adb shell cat /sys/class/net/wlan0/address

 

9、 查看设备上进程的cpu和内存占用情况
adb shell top

 

文件操作相关:

 

1、拷贝文件/目录到设备
adb push …

 

2、从设备拷贝文件/目录,-a参数保留了文件的时间戳和模式
adb pull [-a] …

 

3、查看设备log,和studio和eclipse的logcat相同,可通过参数控制输出的日志
adb logcat -s 过滤指定参数log -v time 保留日志时间 >> 追加写 > 覆盖写

 

下面的命令含义为:打印出log信息中的时间并且包含关键字“Test” 的所有log以覆盖写的方式保存到test文件
adb logcat -v time -s Test > test.txt

 

4、列出目录下的文件和文件夹,可选参数-al可查看文件和文件夹的详细信息
adb shell ls [-al]

 

5、进入文件夹
adb shell cd

 

6、查看文件
adb shell cat

 

7、重命名文件
adb shell rename path/oldfilename path/newfilename

 

8、删除文件/文件夹
adb shell rm path/filename -r 可选参数用于删除文件夹及下面的所有文件 eg:adb shell rm -r

 

9、移动文件
adb shell mv path/filename newpath/filename

 

10、拷贝文件
adb shell cp file newpath/file1

 

11、创建目录
adb shell mkdir path/folder

 

12、设置文件最高读写权限
adb shell chmod 777 filename

11.常见的monkey命令?

https://blog.csdn.net/u013823101/article/details/89228475

12.Android 的四大组件?

Android四大组件分别为activity、service、content provider、broadcast receive

Activity生命周期的方法是成对出现的

onCreate() & onDestory()

onStart() & onStop()

onResume() & onPause()

每一个活动( Activity)都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。 但是当一个活动的状态发生改变的时候,开发者可以通过调用onXX() 的方法获取到相关的通知信息。 在实现 Activity 类的时候,通过覆盖( override )这些方法即可在你需要处理的时候来调用。

 

一,onCreate:当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。onCreate方法有一个参数,该参数可以为空(null),也可以是之前调用onSaveInstanceState方法保存的状态信息。 二,在onStart:方法该触发的所属表示将活动被展现给用户四,在onPause:当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。 五,onStop:当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发onStop方法。所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开 者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,在onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。六,onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。七,onDestroy:当活动销毁的时候,触发该方法。和onStop方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法·。 的onSaveInstanceState:系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等活动栈

每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。

当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部。

 

一个应用程序的优先级是受最高优先级的Activity影响的。当决定某个应用程序是否要终结去释放资源,Android内存管理使用栈来决定基于Activity的应用程序的优先级。

Activity状态

Activity有以下四种状态:

活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活,这个将会被暂停。

暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了。有可能原因是一个透明或者非全屏的Activity被激活。

当被暂停,一个活动仍会当成活动状态,只不过是不可以接受用户输入。在极特殊的情况下,机器人将会杀死一个暂停的活动来为活动的活动提供充足的资源。当一个活动变为完全隐藏,它将会变成停止。停止:。当一个活动不是可视的,它“停止”了这个活动将仍然在内存中保存它所有的状态和会员信息尽管如此,当其它地方需要内存时,它将是最有可能被释放资源的。当一个活动停止后,一个很重要的步骤是要保存数据和当前UI状态。一旦一个活动退出或关闭了,它将变为待用状态。待用:。在一个活动被杀死后和被装在前,它是待用状态的待用胡亚蓉被移除活动栈,并且需要在显示和可用之前重新启动它的活性的四种加载模式在机器人的多活性开发中,活动之间的跳转可能需要有多种方式,有时是普通的生成一个新实例 有时希望跳转到原来某个活动实例,而不是生成大量的重复的活性。加载模式便是决定以哪种方式启动一个跳转到原来某个活动实例。在机器人里,有4种活性的启动模式,分别为:·standard:标准模式,一调用startActivity()方法就会产生一个新的实例。·singleTop:如果已经有一个实例位于Activity stack的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。·singleTask:会在一个新的任务中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。

·singleInstance:这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。

这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置,中的launchMode属性。

相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

标志,这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。1、Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);

2、intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

3、startActivity(intent);

复制代码

Activity的加载模式受启动Activity的Intent对象中设置的Flag和manifest文件中Activity的元素的特性值交互控制。

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

核心的特性有:

taskAffinity

launchMode

clearTaskOnLaunch

alwaysRetainTaskState

finishOnTaskLaunch

四种加载模式的区别 所属task的区别

一般情况下,“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,就相当于谁调用它,它就跟谁在同一个Task中。

除非Intent包括参数FLAG_ACTIVITY_NEW_任务。如果提供了FLAG 活动新_ TASK参数,会启动到别的任务里。“singleTask”和” singleInstance”总是把要启动的活动作为一个任务的根元素,他们不会被启动到一个其他任务里。是否允许多个实例“standard”和“singleTop”可以被实例化多次,并且是可以存在于不同的任务中;这种实例化时一个任务可以包括一个activity的多个实例; “ singleTask“和”singleInstance“则限制只生成一个实例,并且是task的根元素。singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不创建新的实例。是否允许其它活动存在于本任务内“singleInstance”独占一个任务,其它活动不能存在那个任务里; 如果它启动了一个新的活动,不管新的活动的启动模式如何,新的活动都将会到别的任务里运行(如同加了FLAG 活动 NEW_TASK参数)。而另 三种模式,则可以和其它活动共存。是否每次都生成新实例

“standard”对于每一个启动Intent都会生成一个activity的新实例;

“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。

“singleInstance”是其所在栈的唯一activity,它会每次都被重用。

“singleTask” 如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。

当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法,如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。

———————————–

二、Service

service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。

Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中

通过来声明。可以通过contect.startservice和contect.bindserverice来启动。

Service和其他的应用组件一样,运行在进程的主线程中。这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现。

启动service,根据onStartCommand的返回值不同,有两个附加的模式:

1、START_STICKY 用于显示启动和停止service。

2、START_NOT_STICKY或START_REDELIVER_INTENT用于有命令需要处理时才运行的模式。

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。

1、 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。

如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。

如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。

采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

2、使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用的onDestroy()方法。拥有服务的进程具有较高的优先级1.如果service正在调用onCreate,onStartCommand或者onDestory方法,那么用于当前service的进程则变为前台进程以避免被杀死。2.如果当前服务已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着服务一般不会被杀死。3。如果客户端已经连接到service(bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。4.如果service可以使用startForeground(int,Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时被杀。如果有其他的应用组件作为服务,活动等运行在相同的进程中,那么将会增加该进程的重要性。本地服务1.不需和活动交互的本地服务2.本地服务和活动交互\ ———————–

三、Broadcast Receiver

是一个全局的监听器,属于Android四大组件之一

作用是监听 / 接收 应用 App 发出的广播消息,并 做出响应

应用场景为

1、Android不同组件间的通信

2、多线程通信

3、与Android系统在特定情况下的通信

四、Content Provider详解

ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。

android中对数据操作包含有:

file, sqlite3, Preferences,ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的应用内的数据。

android中提供ContectResolver与ContentProvider来操作别的应用程序的数据。

使用方式:

一个应用实现ContentProvider来提供内容给别的应用来操作,

一个应用通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。

1.ContentProvider

Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。

2.ContentResolver

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。

3.Uri

Uri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。

第一部分是”content://”。可以看作是网址中的”http://”。

第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如”blog.csdn.net”。

第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

posted @ 2021-04-12 10:08  Python代  阅读(326)  评论(0编辑  收藏  举报