android Service 的简单使用

一、要使用Service,首先就是在配置文件里吗添加Service,若是不填加,你的Service是不可以使用的。目前学到的方法有两种java

   方法一:<service android:enabled="true" android:name=".PlayService" />android

   方法二:<service android:name=".PlayService" />app

  点后面是Service类的名字。ide

二、工程包括两个类:oop

ServiceActivity.javathis

PlayService.javaspa

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

用startService和stopService完成Activity与Service之间的切换,启动Service以及取消Service,继承

若是不用按钮,能够在Activity的OnCreate和OnDestrpy里面启动和取消Service,以下:接口

 

复制代码

代码

 

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);



this.startService(new Intent(this, PlayService.class));
}

@Override

protected void onDestroy() {
super.onDestroy();
this.stopService(new Intent(this,PlayService.class));
}

复制代码

 

在activity里面,若是须要使用Service的话,须要调用startService(),从而利用startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。

启动一个Service的过程以下:context.startService() ->onCreate()->onStart()->Servicerunning其中onCreate()能够进行一些服务的初始化工做,onStart()则启动服务。

中止一个Service的过程以下:context.stopService() |->onDestroy() ->Service stop 

 

建立Service须要继承自 android.app.Service 的类,而后从新实如今Service各个状态要回调的方法,Service的回调方法有三个,分别是:

  • onCreate()
    建立
  • onStart()
    开始
  • onDestry()
    释放

注意:Service是不能本身启动的,只有经过 Context 对象 调用startService和bindService方法来启动。也就是说Service不能本身调用的,因此咱们看见不少Service都是用Activity调用的。

(1)Context.startService():Service会经历onCreate -> onStart(若是Service尚未运行,则android先调用onCreate()而后调用onStart();若是Service已经运行,则只调用onStart(),因此一个Service的onStart方法可能会重复调用屡次);stopService的时候直接onDestroy,若是是调用者本身直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后能够经过stopService关闭Service。 注意,屡次调用Context.startservice()不会嵌套(即便会有相应的onStart()方法被调用),因此不管同一个服务被启动了多少次,一旦调用Context.stopService()或者stopSelf(),他都会被中止。补充说明:传递给startService()的Intent对象会传递给onStart()方法。调用顺序为:onCreate --> onStart(可屡次调用) --> onDestroy。
(2)Context.bindService():Service会经历onCreate() -> onBind(),onBind将返回给客户端一个IBind接口实例,IBind容许客户端回调服务的方法,好比获得Service运行的状态或其余操做。这个时候把调用者(Context,例如Activity)会和Service绑定在一块儿,Context退出了,Srevice就会调用onUnbind -> onDestroyed相应退出,所谓绑定在一块儿就共存亡了
补充说明:传递给bindService()的Intent对象会传递给onBind(),传递给unbindService()的Intent对象会传递给onUnbind()方法调用顺序为:onCreate --> onBind(只一次,不可屡次绑定) --> onUnbind --> onDestory。
(3)注意事项:在Service每一次的开启关闭过程当中,只有onStart可被屡次调用(经过屡次startService调用),其余onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。还有一点,目前我没有遇到过须要startService和bindService交互使用的状况(我认为不会有这种需求),因此没必要去考虑交互的问题,待遇到时再考虑不迟。
(4)BroadcastReceiver只能经过startService启动Service,由于广播自己生命周期很短,bind的话没有意义

 

PlayService.java是Service类,

包括OnCreate,OnStart,OnDestroy三种方法,

   其中OnCreate无关紧要,若是有,能够在这里建立与MediaPlayerd的连接。若是无,能够在Onstart里面建立这个连接。

        OnCreate在音乐播放周期里面(未OnDestroy)以前,只建立一次,而每按一次播放,OnStart就会被调用一次。

        OnStart,里面能够启动播放音乐,

        OnDestroy,里面调用中止播放音乐。

若是按了中止按钮,会调用(或者打印Log更直观)“ServiconDestroy“,可是Activity不会退出。

当退出Activity的时候,会相继调用(或者打印Log更直观)"ActivityonStop",和"ActivityOnDestroy"此时,音乐播放是不会中止的,

能够知道,若是想让Service一启动就执行的代码,能够写在Service的OnCreate或OnStart,里面,会在启动Service的时候自动调用,与Activity自动调用OnCreate道理是同样的。

代码以下:

复制代码

代码

 

package com.service.su;

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 ServiceActivity 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.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();

}

}

复制代码

复制代码

代码

 

package com.service.su;

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.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");

mediaPlayer
= MediaPlayer.create(this, R.raw.test);

/*
* 要用MediaPlayer来建立,不能用MediaPlayer的对象来建立 // 不用带后缀 mediaPlayer = new
* MediaPlayer(); mediaPlayer.create(this, R.raw.test);

*/

/*
* try { mediaPlayer.setDataSource("/sdcard/music/lost times.mp3");
* mediaPlayer.prepare();
*
*
* //方法二,从网上的连接获取歌曲 try { mediaPlayer.setDataSource(
* "
http://www.yousss.com/uploadfile/mp3/2007-11/20071129134414713.mp3"
* );

*/

// mediaPlayer.setLooping(true);
}

@Override

public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
/*
* //能够在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(); } }

相关文章
相关标签/搜索