第十四讲:Service入门指南
680本讲内容:Service1、Service的概念
2、Service的生命周期
3、实例:控制音乐播放的Service本讲源代码:http://www.apkbus.com/data/attachment/forum/201104/23/1409017lbzowih7le7bj7r.jpgService对象不能自己启动,需要通过某个Activity、Service或者其他Context对象来启动。启动的方法有两种,Context.startService和Context.bindService()。两种方式的生命周期是不同的,具体如下所示。Context.startService方式的生命周期:
启动时,startService –> onCreate() –> onStart()
停止时,stopService –> onDestroy()Context.bindService方式的生命周期:
绑定时,bindService-> onCreate() –> onBind()
解绑定时,unbindService –>onUnbind() –> onDestory()下面我们用一个可以控制在后台播放音乐的例子来演示刚才所学知识,同学们可以通过该例子可以明显看到通过绑定方式运行的Service在绑定对象被销毁后也被销毁了。http://www.apkbus.com/data/attachment/forum/201104/23/140857h49r4lr839zh4k99.png下面把代码分享如下:1、建立一个新项目名字叫 Lesson14_HelloService,Activity起名叫MainHelloService.java2、res/layout/main.xml中代码写成 < ?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<textview android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="音乐播放服务" android:textsize="25sp" android:layout_margintop="10dp">
<button android:text="开启音乐播放服务" android:textsize="20sp" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="10dp">
</button>
<button android:text="停止音乐播放服务" android:textsize="20sp" android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="10dp">
</button>
<button android:text="绑定音乐播放服务" android:textsize="20sp" android:id="@+id/Button03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="10dp">
</button>
<button android:text="解绑定音乐播放服务" android:textsize="20sp" android:id="@+id/Button04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="10dp">
</button>
</textview></linearlayout>
2、在res目录中建立一个raw目录,并把一个音乐文件babayetu.mp3拷贝进来3、在Activity的同目录新建一个service文件MusicService.java package android.basic.lesson14;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class MusicService extends Service {
//为日志工具设置标签
String tag ="MusicService";
//定义音乐播放器变量
MediaPlayer mPlayer;
//其他对象通过bindService方法通知该Service时该方法会被调用
@Override
public IBinder onBind(Intent intent) {
Toast.makeText(this,"MusicService onBind()",Toast.LENGTH_SHORT).show();
Log.i(tag, "MusicService onBind()");
mPlayer.start();
return null;
}
//其他对象通过unbindService方法通知该Service时该方法会被调用
@Override
public boolean onUnbind(Intent intent){
Toast.makeText(this, "MusicService onUnbind()", Toast.LENGTH_SHORT).show();
Log.i(tag, "MusicService onUnbind()");
mPlayer.stop();
return false;
}
//该服务不存在需要被创建时被调用,不管startService()还是bindService()都会在启动时调用该方法
@Override
public void onCreate(){
Toast.makeText(this, "MusicService onCreate()", Toast.LENGTH_SHORT).show();
//创建一个音乐播放器对象
mPlayer=MediaPlayer.create(getApplicationContext(), R.raw.babayetu);
//设置可以重复播放
mPlayer.setLooping(true);
Log.i(tag, "MusicService onCreate()");
}
//用startService方法调用该服务时,在onCreate()方法调用之后,会调用改方法
@Override
public void onStart(Intent intent,int startid){
Toast.makeText(this,"MusicService onStart",Toast.LENGTH_SHORT).show();
Log.i(tag, "MusicService onStart()");
mPlayer.start();
}
//该服务被销毁时调用该方法
@Override
public void onDestroy(){
Toast.makeText(this, "MusicService onDestroy()", Toast.LENGTH_SHORT).show();
mPlayer.stop();
Log.i(tag, "MusicService onDestroy()");
}
}4、MainHelloService.java中的代码: package android.basic.lesson14;
import android.app.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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainHelloService extends Activity {
//为日志工具设置标签
String tag = "MusicService";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//输出Toast消息和日志记录
Toast.makeText(MainHelloService.this, "MainHelloService onCreate", Toast.LENGTH_SHORT).show();
Log.i(tag, "MainHelloService onCreate");
//定义组件对象
Button b1= (Button)findViewById(R.id.Button01);
Button b2= (Button)findViewById(R.id.Button02);
Button b3= (Button)findViewById(R.id.Button03);
Button b4= (Button)findViewById(R.id.Button04);
//定义服务链接对象
final ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Toast.makeText(MainHelloService.this, "ServiceConnection onServiceConnected", Toast.LENGTH_SHORT).show();
Log.i(tag, "ServiceConnection onServiceConnected");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(MainHelloService.this, "ServiceConnection onServiceDisconnected", Toast.LENGTH_SHORT).show();
Log.i(tag, "ServiceConnection onServiceDisconnected");
}};
//定义点击监听器
OnClickListener ocl= new OnClickListener(){
@Override
public void onClick(View v) {
//显示指定intent所指的对象是个Service
Intent intent = new Intent(MainHelloService.this,android.basic.lesson14.MusicService.class);
switch(v.getId()){
case R.id.Button01:
//开始服务
startService(intent);
break;
case R.id.Button02:
//停止服务
stopService(intent);
break;
case R.id.Button03:
//绑定服务
bindService(intent,conn,Context.BIND_AUTO_CREATE);
break;
case R.id.Button04:
//解除绑定
unbindService(conn);
break;
}
}
};
//绑定点击监听器
b1.setOnClickListener(ocl);
b2.setOnClickListener(ocl);
b3.setOnClickListener(ocl);
b4.setOnClickListener(ocl);
}
@Override
public void onDestroy(){
super.onDestroy();
Toast.makeText(MainHelloService.this, "MainHelloService onDestroy", Toast.LENGTH_SHORT).show();
Log.i(tag, "MainHelloService onDestroy");
}
}
好了,本讲就到这里。
页:
[1]