/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@hotmail.com
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/
1、首先service如windows下面的服务是差不多的,没有用户界面,只是在后台工作。
2、看一下service的继承关系
3、service本身不能自己启动,要调用其他方法才能启动service。有如下两种方法
a、Context.startService()
使用这个方法时,service与启动者是没有关系的,只是单纯的启动service,若启动者退出了,service依旧在后台运行。
(如音乐播放,即使退出了程序,音乐还在播放着)
b、Context.bindService()
使用此方法时,顾名思义,就是把启动者与service绑定在一起了,启动者退出,service也跟着停止。
4、service的生命周期
a、采用startService()方法启动的服务,只能调用stopService()方法结束服务,服务结束时会自动调用onDestroy()方法。
b、采用bindService()方法启动的服务,可以调用unbindService()方法来解绑,调用该方法时,也会同时导致系统自动调用服务的onUnbind()和onDestroy()方法.
-
- 启动时,调用startService方法 –>onCreate() –> onStart()
- 停止时,调用stopService 方法 –> onDestroy()
-
-
- 绑定时,调用bindService方法 ->onCreate() –> onBind()
- 解绑定时,调用unbindService方法 –>onUnbind() –> onDestory(
Service的生命周期方法比Activity少,只有onCreate, onStart, onDestroy 。
5、简单音乐播放例子
MP3文件在res目录下的raw目录里面,拖动mp3文件进去即可。(raw为自己新建)
文件格式为mp3和ogg,文件名为0~9或者a~z,比特率最好低于或等于320kps
-
- package conowen.szu.Service;
-
- 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.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
-
- public class ServiceActivity extends Activity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button play = (Button) findViewById(R.id.play);
- Button stop = (Button) findViewById(R.id.stop);
- Button bind = (Button) findViewById(R.id.bind);
- Button unbind = (Button) findViewById(R.id.unbind);
- final Intent intent = new Intent(ServiceActivity.this,MusicService.class);
-
- play.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
-
- startService(intent);
-
-
- }
- });
- stop.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
-
- stopService(intent);
-
-
- }
- });
-
- final ServiceConnection conn=new ServiceConnection() {
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
-
- Toast.makeText(ServiceActivity.this, "绑定成功", Toast.LENGTH_LONG).show();
-
- }
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
-
- Toast.makeText(ServiceActivity.this, "解绑成功", Toast.LENGTH_LONG).show();
-
- }
- };
-
-
-
-
- bind.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
-
- bindService(intent, conn, Context.BIND_AUTO_CREATE);
-
- }
-
- });
- unbind.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
-
- unbindService(conn);
-
-
- }
- });
- }
- }
第二个class为service的处理方法,通过复写各种service方法实现不同的功能。
-
- package conowen.szu.Service;
-
- import android.app.Service;
- import android.content.Intent;
- import android.media.MediaPlayer;
- import android.os.IBinder;
-
- public class MusicService extends Service {
-
- MediaPlayer player;
-
-
- @Override
- public void onCreate() {
-
- super.onCreate();
- player = MediaPlayer.create(this, R.raw.lt26);
- player.setLooping(true);
-
- }
-
- @Override
- public void onStart(Intent intent, int startId) {
-
- super.onStart(intent, startId);
- player.start();
-
- }
-
- @Override
- public IBinder onBind(Intent intent) {
-
- player.start();
- return null;
- }
-
- @Override
- public boolean onUnbind(Intent intent) {
-
- player.stop();
- return super.onUnbind(intent);
- }
-
- @Override
- public void onDestroy() {
-
- super.onDestroy();
- player.stop();
- }
-
- }
效果图:
6、
注:第二个java文件
- public class MusicService extends Service {
继承的是Service,则要在AndroidManifest里面开启Service
- <service
- android:label="player"
- android:name=".MusicService" >
-
- service>
若第一个java文件继承的是Activity,则AndroidManifest里面为
- <activity
- android:label="player"
- android:name=".MusicService" >
-
- activity>
/********************************************************/
对于每多一次点击“播放”按钮时,音乐就多播放一个。(都是同一个音乐,但是播放起步时间不同)
可以把player.start()方法置于onCreate里面,这样就算多次点击“播放”按钮,也没事。因为Service的onCreate的方法只会被调用一次。
如下代码所示(只有“播放”与“停止功能”)并没有加入绑定与解绑
onStart方法不用写出
- package conowen.szu.Service;
-
- import android.app.Service;
- import android.content.Intent;
- import android.media.MediaPlayer;
- import android.os.IBinder;
-
- public class MusicService extends Service {
- MediaPlayer player;
-
- @Override
- public void onCreate() {
-
- super.onCreate();
- player = MediaPlayer.create(this, R.raw.lt26);
- player.start();
- }
-
-
-
-
- @Override
- public IBinder onBind(Intent intent) {
-
- return null;
- }
-
-
- @Override
- public void onDestroy() {
-
- super.onDestroy();
- player.stop();
- }
-
- }