Android四大组件之Service
Service是Android中实现程序后台运行的解决方案,它非常适合于去执行那些不需要与用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。
需要注意的是,服务并不是运行在一个独立进程当中的,而是依赖与创建服务时所在的应用程序进程。当某个进程被杀掉时,所有依赖于该进程的服务也会停止运行。
也不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程当中。
服务的基本用法:
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d("MyServie", "onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("MyServie", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.d("MyService", "onDestroy");
super.onDestroy();
}
}
重写onCreate()、onStartCommand()和Destroy()这三个方法。
Oncreate()方法会在服务第一次创建的时候调用;
OnStartCommand()方法会在每次服务启动的时候调用;
OnDestroy()方法会在服务销毁的时候调用,回收不再使用的资源。
注意,每一个服务都需要在AndroidManifest.xml文件中进行注册才能生效。
<service android:name=“com.example.servicetest.service.Myservice“>
然后在MainActivity中写两个方法,startService()和stopService(),然后怎么启动和停止服务呢?通过构建意图开始或者停止。
public void startService(View view){
Intent intent=new Intent(this,MyService.class);
startService(intent);
}
public void stopService(View view){
Intent intent=new Intent(this,MyService.class);
stopService(intent);
}
run as运行一下我们的程序。显示结果如图所示:
打开LogCat新建过滤器MyService,然后我们点击StartService按钮,我们会看到如图所示:
显然在一开始点击时调用了onCreate()方法和onStartCommand()方法。
我们再来看下一下,当我们点击StopService按钮时会调用什么样的方法呢?结果正是我们所想的,如图所示:
这就是服务的基本用法。
下面我们来分析一下服务的用法。服务可以控制背景音乐在后台的播放。下面来分享一个例子MusicControl。首先我们需要在res的raw目录下拷贝一个音频文件。
在activity_main中加入一个组件:
代码如下:
<Switch
android:id="@+id/switchMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginTop="117dp"
android:text="Music"
android:textOff="off"
android:textOn="On" />
off为关闭,on为开始。。。用法省略。。。
我们定义一个AudioService继承自Service,代码如下:
<pre name="code" class="html">public class AudioService extends Service{
private MediaPlayer mediaPlayer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mediaPlayer=MediaPlayer.create(this, R.raw.qq);
mediaPlayer.setLooping(true);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
stopSelf();
}
});
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(!mediaPlayer.isPlaying()){
new Thread(){
@Override
public void run() {
super.run();
mediaPlayer.start();
}
}.start();
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
}
}
定义MediaPlayer()媒体播放类。把想加载的音乐加载过来。Setlooping是是否设置循环播放。然后对音乐设置监听,在音乐停止时,会执行什么样的服务。。。
启动服务,在MainActivity中定义一个控件。代码如下所示:
<pre name="code" class="html">public class MainActivity extends Activity {
private Switch switchMusic;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
switchMusic=(Switch) findViewById(R.id.switchMusic);
switchMusic.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
if(checked){
startService(new Intent(MainActivity.this,AudioService.class));
}else{
stopService(new Intent(MainActivity.this,AudioService.class));
}
}
});
}
}
运行后的结果如图所示,
显然on的时候音乐播放。off后音乐停止。