文档章节

Android之Service学习篇一:Service启动方式之startService

yolinfeng
 yolinfeng
发布于 2015/02/16 00:21
字数 1625
阅读 19
收藏 0

Service概念及用途:

A service is an application component that can perform long-running operations in the background and does not provide a user interface。

通常service用来执行一些耗时操作,或者后台执行不提供用户交互界面的操作,例如:下载、播放音乐。

Service生命周期 :

Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。

Service与Activity通信:

Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过多描述,当我们想获取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。


这里要提及一点:继承service的子类在重写service的方法中,除了一个onStart()方法之外,还有一个onStartCommand()方法,有关onStartCommand()方法稍微作点介绍:

Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。然后我们注意到这个函数有一个int的返回值,这篇文章就是简单地讲讲int返回值的作用。
从Android官方文档中,我们知道onStartCommand有4种返回值:

START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统将会把它置为started状态,系统不会自动重启该服务,直到startService(Intent intent)方法再次被调用;。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY: START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

有了 Service 类我们如何启动他呢,有两种方法:

      • Context.startService() 
      • Context.bindService()


     1.  在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。

      2. 另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。

区别概况为:
    startService() 的调用者与服务没有联系,即使调用者退出了,服务仍然运行,而bindService() 的调用者与服务绑在一起,调用者一旦退出了,服务也随即终止掉。

这里用一个实例(使用 startService()方法来启动)来讲解一下service的声明周期和使用方法:

首先编写一个类继承Service这个基类,重写里面的方法,然后在Activity中调用 startService()和stopService()来启动和停止服务。

运行界面:



工程目录结构:



ExampleService.java

package com.service.activity;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class ExampleService extends Service{
	private static final String TAG = "ExampleService"; 

	@Override
	public void onCreate() {
		Log.i(TAG, "ExampleService-onCreate");
		super.onCreate();
	}

	@Override
	public void onStart(Intent intent, int startId) {
		Log.i(TAG, "ExampleService-onStart");
		super.onStart(intent, startId);
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		//执行文件的下载或者播放等操作
		Log.i(TAG, "ExampleService-onStartCommand");
		/*
		 * 这里返回状态有三个值,分别是:
		 * 1、START_STICKY:当服务进程在运行时被杀死,系统将会把它置为started状态,但是不保存其传递的Intent对象,之后,系统会尝试重新创建服务;
		 * 2、START_NOT_STICKY:当服务进程在运行时被杀死,并且没有新的Intent对象传递过来的话,系统将会把它置为started状态,
		 *   但是系统不会重新创建服务,直到startService(Intent intent)方法再次被调用;
		 * 3、START_REDELIVER_INTENT:当服务进程在运行时被杀死,它将会在隔一段时间后自动创建,并且最后一个传递的Intent对象将会再次传递过来。
		 */
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public IBinder onBind(Intent intent) {
		Log.i(TAG, "ExampleService-onBind");
		return null;
	}
	
	@Override
	public void onDestroy() {
		Log.i(TAG, "ExampleService-onDestroy");
		super.onDestroy();
	}

}

MainActivity.java

package com.service.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{
	private static final String TAG = "MainActivity";	//日志输出标志
	private Button btnStartService;
	private Button btnStopService;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnStartService = (Button)findViewById(R.id.btnStartService);
        btnStopService = (Button)findViewById(R.id.btnStopService);
        btnStartService.setOnClickListener(this);
        btnStopService.setOnClickListener(this);
    }
    //点击事件处理监听器
	@Override
	public void onClick(View v) {
		Intent intent = new Intent(MainActivity.this,ExampleService.class);
		switch(v.getId()){
		case R.id.btnStartService:
			startService(intent);
			break;
		case R.id.btnStopService:
			stopService(intent);
			break;
		default:
			break;
		}
	}
}


最后在AndroidManifest.xml中对service进行声明,它跟Activity同一级,都写在Application标签里面:

<service android:name=".ExampleService"/>


创建完运行


在运行点击"启动service"之后(第一次启动service),我们可以查看LogCat控制台输出的日志如下:


这个时候我们点击"返回",Activity被干掉了,但是我们的服务仍然在运行,可以查看Setting-->Application-->Running Service,截图如下:



然后回到我们的Activity,再次点击启动Service,控制台输出日志如下:


onCreate()方法没有被调用,说明它并没有重新被创建。

然后我们点击停止Service,输出日志如下:



本文转载自:http://blog.csdn.net/wulianghuan/article/details/8596467

共有 人打赏支持
yolinfeng
粉丝 12
博文 196
码字总数 11946
作品 0
珠海
架构师
Android Service学习笔记

一 什么是Service 服务是运行在后台的一段代码。它可以运行在它自己的进程,也可以运行在其他应用程序进程的上下文(context)里面,这取决于自身的需要。其它的组件可以绑定到一个服务(Ser...

hewei2882
2012/07/15
0
0
Android Service学习笔记

一 什么是Service 服务是运行在后台的一段代码。它可以运行在它自己的进程,也可以运行在其他应用程序进程的上下文(context)里面,这取决于自身的需要。其它的组件可以绑定到一个服务(Ser...

带梦想一7飞
2012/07/14
0
0
android Service 服务的生命周期

1、Service的概念 2、Service的生命周期 3、实例:控制音乐播放的Service 一、Service的概念 Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界...

mayi
2011/11/14
0
2
Android插件化快速入门与实例解析(VirtualApk)必须了解一下

 集成一个第三方相册功能,只需集成一个插件APK到项目中,无需集成额外代码,并且支持随时更新相册功能,无需发布版本更新,无需AndroidManifest中声明四大组件,这就是插件化。   插件化...

android自学
07/22
0
0
Android四大组件之Service

相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了。Service作为Android四大组件之一,在每一个应用程序中都扮演着非...

的书法上的
2014/05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

wordpress 汉化

在 wp-config.php 添加 define('WPLANG','zh_CN'); 在后台,更新 now ,即可。

james_laughing
24分钟前
0
0
Android JNI开发系列(十一) JNI 访问父类的构造方法和父类实例方法

JNI 访问父类的构造方法和父类实例方法 构造方法和父类实例方法 先看一段Java代码, Java package org.professor.jni.animal;import android.util.Log;public class Animal {protecte...

蔡小鹏
30分钟前
1
0
腾讯投资最高1.75亿美元正式进军菲律宾移动支付市场

菲律宾长途电话公司(PLDT)公司今日宣布,中国互联网巨头腾讯和私募股权公司KKR将获得该公司旗下金融科技公司Voyager Innovations的少数股权。 PLDT在一份声明中称:“腾讯和KKR最多将分别收...

linuxCool
57分钟前
2
0
正则介绍及grep/egrep用法

10月16日任务 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 扩展 把一个目录下,过滤所有*.php文档中含有eval的行 grep -r --include="*.php" 'eval' /data 正则介绍 正则就是一串有规律的字符...

hhpuppy
今天
3
0
J2Cache 中使用 Lettuce 替代 Jedis 管理 Redis 连接

一直以来 J2Cache 都是使用 Jedis 连接 Redis 服务的。Jedis 是一个很老牌的 Redis 的 Java 开发包,使用很稳定,作者维护很勤勉,社区上能搜到的文章也非常非常多。算是使用范围最广的 Redi...

红薯
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部