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()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到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示例

工程包括两个类:MainActivity.java,PlayService.java

其中:MainActivity.java定义了两个按钮,分别控制音乐的播放与停止。

用startService和stopService完成Activity与Service之间的切换,启动Service以及取消Service,如果不用按钮,可以在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();
	}

}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术在路上

帮助需要的人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值