Service 生命周期基础

原创 2015年11月20日 12:45:04
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
	private static final String TAG = "MyService";
	@Override
	public IBinder onBind(Intent arg0) {
		Log.i(TAG,"onBind called.");
		//要想实现绑定操作,必须返回一个实现了IBinder接口类型的实例,
		//该接口描述了与远程对象进行交互的抽象协议,有了它我们才能与服务进行交互
		//返回了一个Binder的实例,而这个Binder恰恰是实现了IBinder接口,所以这样就可以实现绑定服务的操作了
		return new MyBinder();
	}
	
	public class MyBinder extends Binder {
		public void greet(String name) {
			Log.i(TAG,"hello,"+name);
		}
	}
	
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		Log.d(TAG,"onCreate called...");
	}
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		Log.d(TAG,"onDestroy called...");
		super.onDestroy();
	}


	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		Log.d(TAG,"onStartCommand called...");

		return super.onStartCommand(intent, flags, startId);
	}
	
	@Override
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		
		super.onStart(intent, startId);
		Log.d(TAG,"onStart called...");
	}
	
	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		Log.d(TAG,"onUnbind called...");
		return super.onUnbind(intent);
	}
	
}


Activity


import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends ActionBarActivity {
	private static final String TAG = "MyService";
	private Button startBtn;
	private Button stopBtn;
	private Button bindBtn;
	private Button unbindBtn;
	private Button testBinderBtn;
	private boolean binded = false;
	
	private MyService.MyBinder binder;

	private ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName arg0) {
		}

		@Override
		public void onServiceConnected(ComponentName arg0, IBinder serviceBinder) {
			binded = true;
			Log.d(TAG, "onServiceConnected called");
			
			//一旦绑定了服务后, 就可以使用binder来和服务通信
			//在这一刻我们绑定服务,下一刻我们去操作binder对象,也许它还为null,
			//这就容易引起空指针异常,正确的做法是把这些操作放到绑定成功之后
			binder = (MyService.MyBinder)serviceBinder;
			//binder.greet("Lucy from Activity..");
		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		startBtn = (Button) findViewById(R.id.start);
		stopBtn = (Button) findViewById(R.id.stop);
		bindBtn = (Button) findViewById(R.id.bind);
		unbindBtn = (Button) findViewById(R.id.unbind);
		testBinderBtn = (Button) findViewById(R.id.testBinder);
		
		MyOnClickListener clickListener = new MyOnClickListener();
		startBtn.setOnClickListener(clickListener);
		stopBtn.setOnClickListener(clickListener);
		bindBtn.setOnClickListener(clickListener);
		unbindBtn.setOnClickListener(clickListener);
		testBinderBtn.setOnClickListener(clickListener);

	}

	@Override
	public void unbindService(ServiceConnection conn) {
		if (this.binded) {
			super.unbindService(conn);
			binded = false;
		}
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		unbindService(conn);
		
	}
	
	protected void testBinder(){
		if(binded && this.binder != null) {
			binder.greet("calling function from MyService binder , and this is arg string..");
		}else {
			Log.i(TAG,"service not bound or binder is null.");
		}
	}

	// 点击一次start启动按钮, 调用onCreate, onStartCommand(onStartCommand中又调用了onStart方法)
	// 第二次点击时,onCreate方法就不再被调用了,而是直接调用了onStartCommand(onStartCommand中又调用了onStart方法)
	// Settings->Applications->Running services”就会发现我们刚刚启动的服务
	// 点击stop停止按钮onDestroy方法被调用了,此时服务停止运行。我们再次查看“Running
	// services”,就会发现MyService这个服务已不存在了
	// onBind方法和onUnbind方法始终没被调用
	// 如果点击start启动了服务后,直接退出应用程序, 而没有点击stop的话, 服务还会在后台继续运行
	// 也就是说这种没有绑定的模式下启动服务后服务不会随着应用程序退出而退出
	// 使用bindService启动服务后调用者和服务绑定到了一起,当调用者被销毁,服务也立即结终止。
	// 如果starService和bindService 混合使用的话 starService -> bindService -> unbindService
	// 第一次都是正常调用 service (onCreate-onStartCommand-onStart)=> (onBind -> onServiceConnected) => onUnbind
	// 一旦unBind后, service还是处于运行状态, 这时再去bind就不会调用onBind, 而是直接调用onServiceConnected, 既然bind失败那么unbind自然也不会调用了
	// 也就是说bind, unbind 启动服务后(调用startService后)只能绑定一次, 只要unbind后  再次bind就不会调用onBind方法
	class MyOnClickListener implements OnClickListener {

		@Override
		public void onClick(View v) {

			switch (v.getId()) {
			case R.id.start:
				Log.d(TAG, "you clicked Start");
				Intent startIntent = new Intent(MainActivity.this,
						MyService.class);
				startService(startIntent);
				break;
			case R.id.stop:
				Log.d(TAG, "stop clicked");
				Intent stopIntent = new Intent(MainActivity.this,
						MyService.class);
				stopService(stopIntent);
				break;
			case R.id.bind:
				Log.d(TAG, "bind clicked");
				Intent bindIntent = new Intent(MainActivity.this,
						MyService.class);
				bindService(bindIntent, conn, Context.BIND_AUTO_CREATE);
				break;
			case R.id.unbind:
				Log.d(TAG, "unbind clicked");
				unbindService(conn);
				break;
			case R.id.testBinder:
				
				Log.d(TAG,"testBinder clicked");
				testBinder();
				break;
			default:
				break;
			}
		}

	}

}




版权声明:本文为博主原创文章,未经博主允许不得转载。

Android:Service生命周期最全面解析

前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍Service最基础的知识:Service的生命周期 如果你对Service还未了解,建议先阅读我写的文章: ...
  • carson_ho
  • carson_ho
  • 2016年11月14日 16:15
  • 2073

Service详解(二):Service生命周期

与Activity类似,Service也有自己的生命周期函数,在不同的时刻,系统会调用对应的Service生命周期函数,不过与Activity声明周期相比,Service的声明周期更加简单,我们通过官...
  • Todo_
  • Todo_
  • 2016年04月08日 16:03
  • 7629

Service简介与生命周期讲解(一)

一、Service的介绍Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定...
  • hello_1s
  • hello_1s
  • 2016年08月03日 16:19
  • 1570

Android中startService的使用及Service生命周期

Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯startService的使用,不涉...
  • sunqunsunqun
  • sunqunsunqun
  • 2015年08月16日 00:10
  • 20360

四大组件之Service(二)-Service在各种情况下的生命周期

Service的生命周期和Activity有相似的地方,也有很大不一样。本文详细的讨论了start servie和bind service在各种使用场景下的生命周期,让你对Service的生命有系统化...
  • anddlecn
  • anddlecn
  • 2016年06月13日 13:38
  • 5097

【Android笔记】Service的生命周期

Andriod中Service的生命周期1. Service生命周期1)  可以通过调用Context.startService()启动一个Service,这可能会触发Service的onCreate...
  • ddna
  • ddna
  • 2009年12月11日 14:56
  • 9654

Service 的生命周期;两种启动方法和区别

1:startService  Service的生命周期:onCreate() --> onStart() -> onDestroy() 停止服务:service.stopService() ...
  • zgaoq
  • zgaoq
  • 2017年02月07日 23:39
  • 1120

Spring的bean、dao、service、action的生命周期

当作用域范围为singleton时,在初始化Spring容易的时候实例化bean实例,为缺省值。 当作用域范围为prototype时,在调用Spring的getBean的方法时实例化bean对象 ...
  • u010739551
  • u010739551
  • 2015年11月02日 14:37
  • 1018

java-Service生命周期及用法! - 随心

大家好,上一节我讲解了Android Activity的生命周期,这一节我将讲解一下Service,首先我们要知道Service具体是干什么的,什么时候用到?以及它的生命周期等。 Service概念...
  • Super_Level
  • Super_Level
  • 2012年08月23日 16:04
  • 2695

Android Service两种启动方式及 生命周期

onStart()后调用bindService该service则调用onBind(),调用onBind以后调stopService将无法释放该service必须再调unbindService才触发on...
  • hezuco
  • hezuco
  • 2014年03月22日 01:20
  • 3893
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Service 生命周期基础
举报原因:
原因补充:

(最多只允许输入30个字)