/********************************************************************************************
* 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()方法.


//Context.startService方式的生命周期:启动时,调用startService方法 –>onCreate() –> onStart()停止时,调用stopService 方法 –> onDestroy()//Context.bindService方式的生命周期:绑定时,调用bindService方法  ->onCreate() –> onBind()解绑定时,调用unbindService方法 –>onUnbind() –> onDestory(

Service的生命周期方法比Activity少,只有onCreate, onStart, onDestroy 。


5、简单音乐播放例子

MP3文件在res目录下的raw目录里面,拖动mp3文件进去即可。(raw为自己新建)

文件格式为mp3和ogg,文件名为0~9或者a~z,比特率最好低于或等于320kps

//第一个Activitypackage 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 {/** Called when the activity is first created. */@Overridepublic 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);// 定义intent为final,全局变量,供下面两个匿名内部类(onclicklisenter)使用play.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubstartService(intent);// 开始播放,通过前面定义好的intent传递}});stop.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubstopService(intent);// 停止播放}});/*******************************以下为bindService方式启动Service*****************************************/final ServiceConnection conn=new ServiceConnection() {//全局变量final ,供下面两个内部类使用@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubToast.makeText(ServiceActivity.this, "绑定成功", Toast.LENGTH_LONG).show();}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubToast.makeText(ServiceActivity.this, "解绑成功", Toast.LENGTH_LONG).show();}};//当采用bindService启动Service,Service和执行bindService所在的Activity绑定成功以后会调用ServiceConnection;//同理,当的Service和使用该Service的客户端取消绑定以后会调用onServiceDisconnected //ServiceConnection(conn)也为下面的bindService和unbindService的参数bind.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubbindService(intent, conn, Context.BIND_AUTO_CREATE);}});unbind.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubunbindService(conn);}});}}

第二个class为service的处理方法,通过复写各种service方法实现不同的功能。


//第二个classpackage 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;//新建播放器@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();player = MediaPlayer.create(this, R.raw.lt26);player.setLooping(true);//两种方式的第一个生命周期都是onCreate()}@Overridepublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stubsuper.onStart(intent, startId);player.start();}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubplayer.start();return null;}@Overridepublic boolean onUnbind(Intent intent) {// TODO Auto-generated method stubplayer.stop();return super.onUnbind(intent);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.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;@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();player = MediaPlayer.create(this, R.raw.lt26);player.start();}// player.start()在onCreate方法里面时,多次点击play按钮,一样正常播放,也就是说音乐不会再开多一个。        //若play.start()放在onStart方面里面,没多一次点击play按钮,就会多播放一次,同样的音乐同时播放(起步不同)@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();player.stop();}}






更多相关文章

  1. Android(安卓)系统调用
  2. Android学习笔记(1)————Android四大组件之一(Activity)
  3. Android(安卓)Parcelable接口使用方法详解
  4. android,webview增加自定义JS对象,调用过程追踪。
  5. Adb连接超时错误
  6. Java中,使用HTTP Basic进行验证
  7. Keyguard之LockPatternView学习
  8. 编译android源码前的准备
  9. Android(安卓)Camera CTS related

随机推荐

  1. Android联网方式判断
  2. android短信监听
  3. android 三种解析,构建xml方法
  4. Android(安卓)线程
  5. 【Android】如何寻找出某个Intent是否可
  6. Android中如何实现EditText的自动换行
  7. Android(安卓)Studio中Android(安卓)Parc
  8. android Spinner的使用
  9. [GUIDE][SCRIPT] How to root Android(安
  10. android绘制view的过程(自定义view一)