【Android】15.1 后台任务和前台任务
分类:C#、Android、VS2015;
创建日期:2016-02-29
一、简介
Android的活动(Activities)可以有多种状态,具体取决于用户的行为以及对操作系统的要求。虽然Activity的生命周期会随着状态的变化而改变,比如创建活动、转入后台、转到前台、销毁活动等,但是,实际上Acivity并不能在后台做任何实质性的UI交互处理。由于这个原因,Android才将在后台运行的进程称为Service,其本质含义就是:Service是独立运行的类的实例,它和Activity的生命周期并没有直接的关系。此外,在活动的生命周期期间,设计良好的应用程序不应该独占资源或导致应用程序崩溃。
1、后台任务(Backgrounding)
Android在后台处理的那些事(Backgrounding)实际上是前台应用程序和后台服务(Service)之间一种折中的解决办法,换言之,通过Backgrounding可以让设备资源不会消耗太快同时又能尽量响应前台的请求。
从功能上来说,Android应用程序中的后台任务(Backgrounding)非常类似于桌面应用程序的多任务,但它和桌面应用的多任务并不是一个概念。桌面计算机一般都有应用程序可用的多种资源,如大屏幕、电源、内存、各种外存等,因此这些应用程序可以一个接一个地排列显示在屏幕上同时运行,而且都能保持高性能。但是,移动应用程序的资源极其有限,很难在那么小的屏幕上同时显示多个高速运行的应用程序,因为真要这样做的话,手机电池的电量很快就会耗尽。
处于后台状态下的Activity实际上是不能执行任何操作的,因此它又提供了一个Android专用的Service的概念(Android Service)。之所以这样做,就是为了在Android App中启用后台处理,即通过提供调用应用程序组件的方式来实现Android Service。
Android Service通常仍属于所创建的应用程序的一部分,但他们在自己的生命周期中独立运行,与Activity的生命周期无关。这意味着即便用户将应用程序转入后台,服务仍然可以继续执行,甚至在操作系统停止或已销毁了所有应用程序活动的情况下,服务也照样可以继续执行。
对于后台运行的活动(Activities)来说,Android和iOS的处理方式是不同的。在Android系统中,Activities是用转入、转出后台的状态来体现的,这些状态是Activity生命周期的一部分。而iOS处理的办法则是将没有运行的活动直接转入到后台,同时,为了节省系统资源,转入到后台后不久就会停止它,即不再允许这些转入后台的活动运行任务。
下面的概览图列出了在Android App中哪些情况下应该使用哪种后台技术,请仔细研究这个图,它能帮你快速理解相关的概念和需要采用的技术。
2、前台任务(Forgrounding)
前台任务(Forgrounding)是指在Android在前台处理那些经常会被用户关注的后台Service,这些Service的特点是:内存过低时它不会自动成为被杀死的对象。前台任务必须向用户提供一个通知,而且只有在后台服务被终止或从前台任务中被移除之后,此通知才能消失。
例如,用后台服务来播放音乐的播放器就应该将其作为前台任务来处理,因为这能让用户通过前台通知(Notification)清楚地知晓后台服务的运行情况。在前台任务中,通知可能会标明当前正在播放的歌曲,并允许用户启动一个activity来与播放器进行交互。
要把你的后台服务作为前台任务来处理(这个任务就是在前台利用通知告诉用户正在运行的后台服务当前的情况),可以调用StartForeground()方法。此方法至少有两个参数:一个是通知的标识号(整数值),另一个是提供通知的Notification对象。另外还可以在这个方法中再添加更多的参数,比如,你可以每过1秒就告诉用户一次,也可以过1分钟才告诉用户一次。
要移除前台任务,请调用StopForeground()方法,这个方法接受一个布尔型参数,表示是否同时移除通知。此方法不会终止后台服务。不过,如果后台服务被你显式终止了,那么通知也会同时被移除。
注意:StartForeground()和StopForeground()方法是自Android 2.0 (API Level 5)开始引入的。 要让后台服务能在更早版本的平台上作为前台任务来处理,你必须使用以前提供的SetForeground()方法而不是StartForeground()方法。