gavanwanggw

导航

Android项目之HomeHealth基础学习2:Service

一、 Service简单介绍

Service是android 系统中的四大组件之中的一个(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差点儿相同。但不能自己执行仅仅能后台执行,而且能够和其它组件进行交互。service能够在非常多场合的应用中使用。比方播放多媒体的时候用户启动了其它Activity这个时候程序要在后台继续播放,比方检測SD卡上文件的变化。再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的。

Service的启动有两种方式:context.startService() 和 context.bindService()


二、 Service启动流程

context.startService() 启动流程:

context.startService()  -> onCreate()  -> onStart()  -> Service running  -> context.stopService()  -> onDestroy()  -> Service stop 


假设Service还没有执行,则android先调用onCreate(),然后调用onStart()。

假设Service已经执行,则仅仅调用onStart(),所以一个Service的onStart方法可能会反复调用多次

 

假设stopService的时候会直接onDestroy。假设是调用者自己直接退出而没有调用stopService的话,Service会一直在后台执行,该Service的调用者再启动起来后能够通过stopService关闭Service。

所以调用startService的生命周期为:onCreate --> onStart (可多次调用) --> onDestroy


context.bindService()启动流程:

context.bindService()  -> onCreate()  -> onBind()  -> Service running  -> onUnbind()  -> onDestroy()  -> Service stop
 

onBind()将返回给client一个IBind接口实例,IBind同意client回调服务的方法,比方得到Service的实例、执行状态或其它操作。这个时候把调用者(Context,比如Activity)会和Service绑定在一起。Context退出了,Srevice就会调用onUnbind->onDestroy对应退出。

 

所以调用bindService的生命周期为:onCreate --> onBind(仅仅一次。不可多次绑定) --> onUnbind --> onDestory。

在Service每一次的开启关闭过程中。仅仅有onStart可被多次调用(通过多次startService调用),其它onCreate。onBind,onUnbind,onDestory在一个生命周期中仅仅能被调用一次。

 


三、 Service生命周期 

Service的生命周期并不像Activity那么复杂,它仅仅继承了onCreate()、onStart()、onDestroy()三个方法

当我们第一次启动Service时。先后调用了onCreate()、onStart()这两个方法;当停止Service时,则运行onDestroy()方法。

这里须要注意的是,假设Service已经启动了,当我们再次启动Service时,不会在运行onCreate()方法,而是直接运行onStart()方法。

它能够通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停止自己,仅仅要调用一次stopService()方法便能够停止服务。不管调用了多少次的启动服务方法。


四、 代码演示样例

(1)startService演示样例

project包含两个类:MainActivity.java,PlayService.java

当中:MainActivity.java定义了两个button。分别控制音乐的播放与停止。

用startService和stopService完毕Activity与Service之间的切换。启动Service以及取消Service。假设不用button,能够在Activity的OnCreate和OnDestrpy里面启动和取消Service

AndroidManifest.xml文件例如以下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.serviceactivity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        <service android:enabled="true" android:name=".PlayService" />
    </application>
    
</manifest>

layout布局文件activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button 
        android:id="@+id/button_on"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="open"/>
	
	<Button 
        android:id="@+id/button_off"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/button_on"
        android:text="close"/>
	
	<TextView 
	    android:id="@+id/txt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/button_off"
        android:text="we will via"
	    />


</RelativeLayout>


MainActivity.java代码例如以下:

package com.example.hellowendy;

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

public class MainActivity extends Activity implements OnClickListener {
	/** Called when the activity is first created. */
	Button buttonOn, buttonOff;
	String TAG = "ServiceActivity";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		buttonOn = (Button) findViewById(R.id.button_on);
		buttonOff = (Button) findViewById(R.id.button_off);

		buttonOn.setOnClickListener(this);
		buttonOff.setOnClickListener(this);
		Log.v(TAG, "ActivityonCreate");
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {

		case (R.id.button_on):
			Log.v(TAG, "ActivitystartService");
			this.startService(new Intent(this, PlayService.class));
			// startService(new Intent(this, PlayService.class));

			break;
		case (R.id.button_off): {
			Log.v(TAG, "ActivitystopService");
			this.stopService(new Intent(this, PlayService.class));
			// stopService(new Intent(this, PlayService.class));

		}
			break;

		default:
			break;

		}

	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.v(TAG, "ActivityonStop");
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		Log.v(TAG, "ActivityonDestroy");
		super.onDestroy();

	}

}


PlayService.java代码例如以下:

/**
 * 
 */
/**
 * @author Administrator
 *
 */
package com.example.hellowendy;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class PlayService extends Service {
	String TAG = "ServiceActivity";
	MediaPlayer mediaPlayer;

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		Toast.makeText(this, "Play Service Created", Toast.LENGTH_LONG).show();
		Log.v(TAG, "ServiceonCreate");
		
		//TextView txtview;
		
		//txtview = (TextView) findViewById(R.id.txt);
		
<span style="white-space:pre">		</span>//从本地资源中获取的歌曲cong.mp3, “匆匆那年”,<span style="color:#ff0000;font-family: 'black Verdana', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px;">cong.mp3文件夹是hellowendy -> res</span><span style="font-family: 'black Verdana', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px;"><span style="color:#ff0000;"> ->raw -> cong.mp3</span></span>
		mediaPlayer = MediaPlayer.create(this, R.raw.cong);
	}

	@Override
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		//super.onStart(intent, startId);
		//super.onStart();
		/*
		 * //能够在OnCreate里面创建与音乐的链接,也能够在OnStart里面创建 mediaPlayer =
		 * MediaPlayer.create(this, R.raw.test);
		 */
		Toast.makeText(this, "Play Service onStart", Toast.LENGTH_LONG).show();
		Log.v(TAG, "ServiceonStart");
		mediaPlayer.start();
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Toast.makeText(this, "Play Service Stopped", Toast.LENGTH_LONG).show();
		Log.v(TAG, "ServiconDestroy");
		mediaPlayer.stop();
	}

}







posted on 2017-05-19 15:35  gavanwanggw  阅读(122)  评论(0编辑  收藏  举报