什么是服务

服务是一个没有可视化界面的组件,它可以在后台长期运行并进行各种操作。

服务的创建

我们只需要继承Service类并实现相应的方法即可创建服务

要想启动服务,还得在AndroidManifest中注册服务

服务类的示例代码

package com.whathecode.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast; public class ExtendsionService extends Service
{ /**
* 当服务第一次被创建的时候调用此方法
*/
@Override
public void onCreate()
{ super.onCreate();
Toast.makeText(getBaseContext(), "服务被创建了", Toast.LENGTH_SHORT).show();
} /**
* 当通过startService方法启动服务时此方法被调用
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Toast.makeText(getBaseContext(), "服务被启动了", Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent, flags, startId);
} @Override
public IBinder onBind(Intent intent)
{
return null;
} @Override
public void onDestroy()
{
super.onDestroy();
} }

使用startService启动服务

主界面的逻辑代码:


package com.whathecode.servicedemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View; public class MainActivity extends Activity
{ Intent service = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //创建服务
service = new Intent(this, ExtendsionService.class);
} public void start(View view)
{
//启动服务
startService(service);
} public void stop(View view)
{
//停止服务
stopService(service);
}
}

注册服务:

<service android:name="com.whathecode.servicedemo.BackgroundService"></service>

运行效果:

注意:

当我们第一次点击启动服务按钮的时候,onCreate方法和onStartCommand方法依次执行,

但在第二次点击启动服务按钮的时候,这个服务已经处于运行状态,onCreate方法不再执行第二次,

而onStartCommand方法总是在调用startService启动服务的时候执行。

onDestroy方法在stopService方法被调用后执行。

除了使用startService方法启动服务外,我们还可以使用Bind的方式启动服务。

前者和后者的不同在于:

服务的生命周期不依赖于启动者。服务被启动后一直在后台运行直到调用stopService被停止。

使用Bind方式启动服务,服务的生命周期依赖于启动者。即服务在启动者退出后自动销毁。

使用Bind方式启动服务

主要使用bindService方法启动服务,unbindService方法销毁服务。

使用此方式启动服务的好处是,bind定成功的时候服务返回一个IBinder对象,

我们可以通过在服务类里面实现这个对象,从而访问服务里面的具体方法。

从而达到和服务沟通的目的。

注意:

我们不能以直接实例化服务的方式调用里面的方法。

另外:

如果在退出服务的时候没有解绑,那么程序就会抛出异常IllegalArgumentException异常。

因此,每次调用bindService启动服务,完成后需要退出服务都需要使用unbindService 解绑。

示例代码:

package com.whathecode.servicedemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View; public class MainActivity extends Activity
{ Intent service = null;
IReceptionist rpst; /**
* bindService和unbindService方法使用的参数
*/
private ServiceConnection conn = new ServiceConnection()
{ //此方法在服务连接被意外终止的时候被调用,
@Override
public void onServiceDisconnected(ComponentName name)
{ } //当服务被连接上的时候自动调用这个方法,第二个参数是服务类onBind方法中返回的对象
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
rpst = (IReceptionist) service;
rpst.callExtendsionNumber();
}
}; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //创建服务
service = new Intent(this, ExtendsionService.class);
} public void start(View view)
{
//启动服务
startService(service);
} public void stop(View view)
{
//停止服务
stopService(service);
} public void bind(View view)
{
//绑定服务
bindService(service, conn , BIND_AUTO_CREATE);
} public void unBind(View view)
{
//解绑服务
unbindService(conn);
}
}

继承ServiceBinder对象,并实现自定义接口:

通过这个方式,我们可以暴露只需要的方法,实现代码的保护。

IReceptionist接口代码:

package com.whathecode.servicedemo;

public interface IReceptionist
{
public void callExtendsionNumber();
}

ExtendsionService服务类代码:

package com.whathecode.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast; public class ExtendsionService extends Service
{ private static final String TAG = "ExtendsionService"; /**
* 当服务第一次被创建的时候调用此方法
*/
@Override
public void onCreate()
{ super.onCreate();
Toast.makeText(getBaseContext(), "服务被创建了", Toast.LENGTH_SHORT).show();
} /**
* 当通过startService方法启动服务时此方法被调用
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
Toast.makeText(getBaseContext(), "服务被启动了", Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent, flags, startId);
} @Override
public IBinder onBind(Intent intent)
{
return new ServiceBinder();
} @Override
public void onDestroy()
{
Toast.makeText(getBaseContext(), "服务被销毁了", Toast.LENGTH_SHORT).show();
Log.d(TAG, "服务被销毁了");
super.onDestroy();
} public void putExtendsion()
{
Toast.makeText(getBaseContext(), "正在帮你转接分机", Toast.LENGTH_SHORT).show();
} /**
*
* 继承Binder并实现IReceptionist接口
* 继承Binder类的目的是onBind方法中需要返回这个类型的对象
*
* 实现IReceptionist接口是暴露方法的需要
*/
private class ServiceBinder extends Binder implements IReceptionist
{
public void callExtendsionNumber()
{
putExtendsion();
} private void otherMethod()
{ }
}
}

运行效果:

注意看上图,我们在按下返回键的时候,Activity被销毁,由它启动的服务也跟着被销毁。

这样的服务貌似作用不大,有没有办法在退出Activity的时候不退出服务呢?

答案是有的:Android允许我们先启动一个服务,然后再调用bindService绑定到服务,

这样,我们既可以达到和服务沟通的目的,也可以使服务长期在后台运行。

看下图:

通过下面的图,就可以更清楚地理解上面代码的工作原理:

Android四大组件之—— 使用服务进行后台操作的更多相关文章

  1. Android四大组件之Service --- 服务的生命周期

    一旦在项目的任何位置调用了Context的startService() 方法,相应的服务就会启动起来,并回调onStartCommand() 方法.如果这个服务之前还没有创建过,onCreate() ...

  2. Android四大组件之一Service介绍-android学习之旅(十二)

    基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...

  3. Java乔晓松-android的四大组件之一Service(服务的绑定)

    android的四大组件之一Service(服务的绑定) 怎么绑定服务,又怎么解除服务,代码如下: MainActivity.java源码: package com.example.lesson14_ ...

  4. 入职小白随笔之Android四大组件——服务(Service)

    Service Android多线程编程 当我们在程序中执行一些耗时操作时,比如发起一条网络请求,考虑到网速等原因,服务器未必会立刻响应我们的请求,此时我们就需要将这些操作放在子线程中去运行,以防止主 ...

  5. Android四大组件之服务

    创建一个服务,并与活动绑定 作为安卓四大组件之一的服务,毫无例外也要在manifast中进行注册 新建服务类继承于Service,并覆盖onBind( )方法,用于与活动绑定 public class ...

  6. Android 四大组件 与 MVC 架构模式

    作为一个刚从JAVA转过来的Android程序员总会思考android MVC是什么样的? 首先,我们必须得说Android追寻着MVC架构,那就得先说一下MVC是个啥东西! 总体而来说MVC不能说是 ...

  7. android四大组件(简单总结)

    activity 一个Activity通常就是一个单独的屏幕(窗口) Activity之间通过Intent进行通信 android应用中每一个Activity都必须要在AndroidManifest. ...

  8. Android四大组件及activity的四大启动模式

    Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...

  9. Android成长日记-Android四大组件之Service组件的学习

    1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它 ...

随机推荐

  1. Android项目实战(二十四):项目包成jar文件,并且将工程中引用的jar一起打入新的jar文件中

    前言: 关于.jar文件: 平时我们Android项目开发中经常会用到第三方的.jar文件. 其实.jar文件就是一个类似.zip文件的压缩包,里面包含了一些源代码,注意的是.jar不包含资源文件(r ...

  2. CSS3-02 样式 1

    概述 上一篇博客中,概述了如何在 HTML 文档中使用 CSS,以及如何选择 HTML 元素,并且在文档的最后以表格的形式给出了 CSS 中所有的属性.在接下来的这篇博客中,将阐述主要 HTML 元素 ...

  3. 敏捷开发与jira之阶段工作项概述

    每次迭代都分这5个阶段,但每个阶段的时间根据版本情况定,最终目标是:第一个阶段拿到交付范围,在第五个阶段都完成,并拿到本次版本团队所消耗的工时. Jira是项目过程管理的一种手段,跟多体现在工时跟踪, ...

  4. vim 使用 YouCompleteMe

    当然前提是先装好vundle 1 在vimrv中加入Bundle 'Valloric/YouCompleteMe' 2 vim +PluginInstall +qall 3 安装一对底层需要的编译的东 ...

  5. ORACLE计算表引占用空间大小

    在ORACLE数据库中,如何计算一个表所占用的存储空间呢?我们可以通过系统视图DBA_SEGMENTS.USER_SEGMETNS.DBA_TABLES来查看一个表所占空间的大小,如下所示:   SE ...

  6. Linux命令学习总结:cp命令

    命令简介: cp命令用来复制文件或目录.指令英文原义:copy 指令所在路径:/bin/cp 命令语法: Usage: cp [OPTION]... [-T] SOURCE DEST or: cp [ ...

  7. SQL Server 使用OPENROWSET访问ORACLE遇到的各种坑总结

    在SQL Server中使用OPENROWSET访问ORACLE数据库时,你可能会遇到各种坑,下面一一梳理一下你会遇到的一些坑. 1:数据库没有开启"Ad Hoc Distributed Q ...

  8. Tomcat部署web项目

    在Myeclipse中,我们很容易做到这一步:把一个web项目生成war文件 其实在eclipse中,实现这样的功能,也是很简单的. 下面就看一下是怎样操作的吧! 新建一个web项目: 取名为:ecl ...

  9. ununtu设置开机启动服务-手工将Tomcat设为自启动服务

    配置Ubuntu Server,上面装了一Tomcat7,希望在服务器电源打开后,希望没有登录的情况下也可以自动启动Tomcat 1.编写启动文件/etc/init.d/tomcat7 tomcat7 ...

  10. 【小白的CFD之旅】15 四种境界

    天气不错,小白一大早就起床了,吃过早餐就往奔实验室而去.路上碰到了同去实验室的小牛师兄. "小白,这么早啊",小牛师兄老远就发现了小白,打招呼道. "早啊,牛师兄,刚吃完 ...