一、 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 stoponBind()将返回给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(); } }