有段时间没有写博客了,最近一段时间跳到了深圳,新的公司新的环境要去适应,人挺累的,所以近段时间没有写博客。这几天QQ群上有位朋友在问要Service的例子,当时没有跟他应答,现在抽空把例子整理了一下,发表上博客园,希望他能看得到。
Service 简介
何谓“Service”?“Service” 意思即“服务”的意思, 像 Windows 上面的服务一样,有些服务是在后台上运行,干着静悄悄的勾当不让人知道 。与 Activity 不同,Service 是并不直接与用户交互的运行于后台的一类组件。
Google对Service的解释
- 一个服务不是一个单独的进程。服务对象本身并不意味着它是在自己的进程中运行,除非另有规定,否则它与运行程序是同在一个进程中。
- 一个服务不是一个单独的线程。它是一种手段,本身做着主线的工作 (以避免应用程序没有响应的错误)。
Service 与 Activity 的相同点与不同点
- 不同点:Activity是与用户交互的组件,即我们用眼睛可以看到的界面,而Service是在后台运行,执行隐藏的动作。
- 相同点:使用Activity 时我们需要在配置文件中声明<activity>标签,同样的使用Service 也需要在配置文件中声明<service>标签
使用Service
创建Service需要继承自 android.app.Service 的类,然后重新实现在Service各个状态要回调的方法,Service的回调方法有三个,分别是:
- onCreate()
创建
- onStart()
开始
- onDestry()
释放
注意:Service是不能自己启动的,只有通过 Context 对象 调用startService和bindService方法来启动。但两种方法的Service生命周期是不同的,下面我们通过一个小例子来区别各自的生命周期。
例子效果图如下:
代码如下:
package
com.terry;
import
android.app.Service;
import
android.content.Intent;
import
android.os.IBinder;
import
android.util.Log;
public
class
ServiceSample
extends
Service {
final
String TAG
=
"
Service
"
;
@Override
public
IBinder onBind(Intent intent) {
//
TODO Auto-generated method stub
Log.i(TAG,
"
onBind
"
);
return
null
;
}
@Override
public
boolean
onUnbind(Intent intent) {
//
TODO Auto-generated method stub
Log.i(TAG,
"
onUnbind
"
);
return
super
.onUnbind(intent);
}
@Override
public
void
onRebind(Intent intent) {
//
TODO Auto-generated method stub
super
.onRebind(intent);
Log.i(TAG,
"
onRebind
"
);
}
@Override
public
void
onCreate() {
//
TODO Auto-generated method stub
super
.onCreate();
Log.i(TAG,
"
onCreate
"
);
}
@Override
public
void
onDestroy() {
//
TODO Auto-generated method stub
super
.onDestroy();
Log.i(TAG,
"
onDestroy
"
);
}
@Override
public
void
onStart(Intent intent,
int
startId) {
//
TODO Auto-generated method stub
super
.onStart(intent, startId);
Log.i(TAG,
"
onStart
"
);
}
}
当调用startService方法时:
当调用bindService方法时:
下面通过一组图来更详细的说明Service的生命周期
开始服务
停止服务
绑定服务
销毁服务
音乐服务DEMO
通过上面的小例子可能有些园友还是很模糊,下面通过一个播放音乐的小例子加深大家对Service 的理解,该例子通过播放一首mp3 ,当用户点击开始“按钮”,音乐开始播放,即时你退出程序音乐也会播放,点击“停止”按钮,停止播放音乐 。
该例子继承service 然后重写onStart播放音乐 重写onDestry停止音乐 ,代码如下:
package
com.terry;
import
android.app.Service;
import
android.content.Intent;
import
android.media.MediaPlayer;
import
android.os.IBinder;
public
class
musicServer
extends
Service {
private
MediaPlayer player;
@Override
public
IBinder onBind(Intent intent) {
//
TODO Auto-generated method stub
return
null
;
}
@Override
public
void
onStart(Intent intent,
int
startId) {
//
TODO Auto-generated method stub
super
.onStart(intent, startId);
if
(player
==
null
)
{
player
=
MediaPlayer.create(
this
, R.raw.start);
player.start();
}
}
@Override
public
void
onDestroy() {
//
TODO Auto-generated method stub
super
.onDestroy();
player.stop();
}
}
完成了service类,我们只要在对应的Activity的事件中调用服务即可实现,代码如下:
package
com.terry;
import
android.app.Activity;
import
android.content.Intent;
import
android.os.Bundle;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
public
class
musicActivity
extends
Activity{
private
Intent intent
=
new
Intent(
"
com.terry.Android.MUSIC
"
);
@Override
protected
void
onCreate(Bundle savedInstanceState) {
//
TODO Auto-generated method stub
super
.onCreate(savedInstanceState);
setContentView(R.layout.music);
findView();
viewHolder.myButton.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
//
TODO Auto-generated method stub
startService(intent);
}
});
viewHolder.myButton2.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
//
TODO Auto-generated method stub
stopService(intent);
}
});
}
void
findView(){
viewHolder.myButton
=
(Button)findViewById(R.id.play);
viewHolder.myButton2
=
(Button)findViewById(R.id.stop);
}
}
运行效果图:
差不多就到这里吧,有点晚了,把源码提供给大家:
本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/338863,如需转载请自行联系原作者