第四章 Android开发三大基石—Activity、Service和Handler(4)

4.2千变万化的服务-Service开发

Service是Android系统中运行在后台、不和用户交互应用组件。它和Activity的级别差不多,只能在后台运行。每个Service必须在manifest文件中 通过<service>来声明。

4.2.1 Service的生命周期

Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service的时候,先后调用onCreate()、onStart()这两个方法,当停止Service的时候,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会再执行onCreate()方法,而是直接执行onStart()方法。Service的启动有StartService和BindService两种方法,这两种方法对Service生命周期的影响是不一样的。

下面,我们分别来看看这两种方法是如何影响Service生命周期的:

1)  StartService启动Service

用这种方法启动Service,Service会经历 onCreate 然后是onStart,接着一直处于运行状态,直到stopService的时候调用onDestroy方法。如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。

2)  BindService启动Service

通过这种方法启动Service,Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbindonUnbind->onDestroyed方法。

4.2.2 Service的启动和停止

我们已经对Service的生命周期有了一定的了解,Service的启动方式不同,它的生命周期也不相同。下面,就让我们来看看Service到底是如何启动和停止的。

服务不能自己运行,需要通过调用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()方法。

4.2.3我的服务我来用—本地服务(Localservice)开发

本地服务用于应用程序内部。它可以启动并运行,直到有人停止了它或它自己停止。在这种方式下,它以调用Context.startService()来启动,调用Context.stopService()来停止。它也可以调用Service.stopSelf() 或Service.stopSelfResult()来自己停止。不论调用了多少次startService()方法,你只需要调用一次stopService()就可以停止服务。

它用于实现应用程序自己的一些耗时任务,比如查询升级信息,它并不占用应用程序Activity所属线程,而只是单开线程后台执行,这样用户体验比较好。

有些服务是不需要和Activity交互就能直接运行的,而有些则是需要与Activity进行交互。下面,我们通过一些例子来加以说明。

--------------------------------------------

试着放个广告 现在没工作 要生存 没办法

平安陆金所 隶属于平安集团的p2p平台

年投资回报率7%-9% 是替代银行理财的首选

个人经验教训 推荐投资安鑫或者有担保的彩虹项目

不要投资安e 那个几乎无法转让 想提前提现非常困难

注册链接 http://affiliate.lufax.com/action/36XBU

用此链接注册 你我都会有几十元的额外现金奖励

--------------------------------------------

1)不和Activity交互的本地服务

首先,我们新建一个LocalService类继承自Service,代码如下:


// import略

public class LocalService extends Service{

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onCreate() {

super.onCreate();

}

@Override

public void onDestroy() {

super.onDestroy();

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

}

}

然后,新建一个类ServiceActivity继承自Actvity,代码如下:


// import略

public class ServiceActivity extends Activity{

private Button startBtn,stopBtn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.localservice);

startBtn = (Button)findViewById(R.id.start_button);

stopBtn = (Button)findViewById(R.id.stop_button);

startBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

startService(new Intent("com.char4.LOCAL_SERVICE"));

}

});

stopBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

stopService(new Intent("com.char4.LOCAL_SERVICE"));

}

});

}

}

布局文件localservice.xml代码如下,它定义了两个按钮,一个用来启动Service,一个用来停止Service:


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="match_parent">

<Button

android:id="@+id/start_button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="启动"/>

<Button

android:id="@+id/stop_button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="停止"/>

</LinearLayout>

别忘了,在AndroidMainfest.xml中注册Service:


<service android:name=".LocalService">

<intent-filter>

<action android:name="com.char4.LOCAL_SERVICE " />

<category android:name="android.intent.category.default" />

</intent-filter>

</service>

下面,我们来看看效果,如图4-7所示:

图4-7 startService启动顺序

通过日志打印我们可以发现,第一次点击“启动”按钮时,会调用onCreate和onStart方法,在没有点击“停止”按钮前,无论点击多少次“启动”按钮,都只会调用onStart。而点击“停止”按钮时则调用onDestroy。再次点击 “停止”按钮,会发现不会进入service的生命周期的,即不会再调用onCreate,onStart和onDestroy,而onBind在点击“启动”和“停止”按钮时都没有调用。

时间: 2024-07-30 10:18:40

第四章 Android开发三大基石—Activity、Service和Handler(4)的相关文章

第四章 Android开发三大基石—Activity、Service和Handler(1)

第四章 Android开发三大基石-Activity.Service和Handler 学习Android开发,首先就不得不学习Activity和Service这两个组件.Activity是有界面的程序,几乎承载着用户对应用程序的所有操作.而Service是没有界面的程序,它是所谓的服务,也叫后台程序.掌握好它们,是我们学习Android开发必不可少的环节.Handler是Android开发中最常用的消息机制,几乎所有应用程序都会使用Handler传递消息.可以说,想要学习Android应用开发,

第四章 Android开发三大基石—Activity、Service和Handler(2)

4.1.3Activity的创建 在 Android 中创建一个 Activity 是很简单的事情,编写一个继承自 android.app.Activity的类,并在 AndroidManifest.xml文件中声明即可.下面,我们来看一个例子,我们创建一个MyActivity类继承自Activity,代码如下: public class MyActivity extends Activity {     @Override     public void onCreate(Bundle sav

第四章 Android开发三大基石—Activity、Service和Handler(6)

4.3 Android线程间的通信-消息机制 在Android程序运行中,线程之间或者线程内部进行信息交互时经常会使用到消息,如果我们熟悉这些基础的东西及其内部原理,将会使我们的Android开发变的更加容易,从而更好地架构系统.下面,就让我们来看看Android中的消息机制到底是怎样一回事吧. 4.3.1消息的传递-Handler的使用 在Android中,线程之间进行信息交互时经常会使用消息,那么,"消息"是在什么时候使用呢?它的工作原理又是怎么样的呢? 在解释这些之前,我们先来看

第四章 Android开发三大基石—Activity、Service和Handler(3)

4.1.5Activity交互-Activity跳转 一般的,我们的应用程序都不会简单到只有一个界面,而是会有很多个界面,这个时候我们就会创建多个Activity,然后根据业务逻辑在多个Activity之间进行跳转. 我们可以用切换Layout的方式进行手机页面间的转换.但是如果要转换的页面并不单单只是背景.颜色或文字内容的不同,而是需要对整个Activity进行置换,并将主控权交给新的Activity,那就不是仅靠改变Layout就能完成了,我们需要在这些Activity中进行跳转及数据传递.

第四章 Android开发三大基石—Activity、Service和Handler(7)

4.3.2Android中消息机制的详细分析 下面,我们就来详细分析一下Android中的消息机制. 熟悉Windows编程的朋友知道Windows程序是消息驱动的,并且有全局的消息循环系统.Google参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制.Android通过Looper.Handler来实现消息循环机制.Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环. Android系统中的Looper负责管理线程的消息队列(Messa

第四章 Android开发三大基石—Activity、Service和Handler(5)

2)和Activity交互的本地服务 刚刚我们介绍的Service是不需要与Activity进行交互的,现在我们再来看看与Activity交互的本地服务.首先,我们新建一个BindLocalServide类继承自Serivce,代码如下: // import略 public class BindLocalServideextends Service { private static final String TAG = "localservice"; private MyBinder

Android学习笔记—第四章 Android开发组件2

第四章 Android开发组件2 列表类组件 (1)ListView组件:以垂直列表的形式列出需要显示的列表项 相关属性: a. android:divider  用于为列表视图设置分隔条,可以用颜色或者图片资源 b. android:dividerHeight  设置分隔条的高度 c. android:entries  通过数组资源为ListView指定列表项 d. android:footerDividersEnabled  设置是否在footerView之前绘制分隔条,默认为true. e

【Android的从零单排开发日记】之入门篇(四)——Android四大组件之Activity

在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页面类似.当然,这种相似性主要体现在设计思想上.在具体实现方面,Android的Activity组件有自己的设计规范,同时,它能够更简便地使用线程.文件数据等本地资源. 一.Activity 的生命周期 Activity 的生命周期是被以下的函数控制的. 1 public class Activity

2017-2018-2 20165331 实验四《Android开发基础》实验报告

实验四 <Android开发基础> 实验报告封面 课程:Java程序设计 班级:1653 姓名:胡麟 学号:20165331 成绩: 指导教师:娄嘉鹏 实验日期:2018.5.14 实验密级: 预习程度: 实验时间:15:35 - 17:50 仪器组次:31 必修/选修: 实验序号:4 实验名称:Android开发基础 实验目的与要求:①完成云班课中的检查点,也可以先完成实验报告,直接提交.注意不能只有截图,要有知识点,原理,遇到的问题和解决过程等说明.实验报告中一个检查点要有多张截图. ②发