使用service

[b]服务(Service)[/b]是运行在后台的一段代码。它可以运行在它自己的进程,也可以运行在其他应用程序的上下文(context)里面。其他的组件可以绑定到一个服务上面,通过远程过程调用(RPC)来调用这个方法。例如:媒体播放器的服务,当用户退出媒体选择用户界面,仍然希望音乐可以继续播放,这时就是由服务(Service)来保证当用户界面关闭时音乐继续播放的。

[b]使用服务的方法[/b]
[list]
[*]第一种是通过调用Context.startServece()启动,调用Context.stoptService()结束,startService()可以传递参数给Service。
[*]第二种方式是通过调用Context.bindService()启动,调用Context.unbindService()结束,还可以通过ServiceConnection 访问Service。二者可以混合使用,可以先startServece()再unbindService()。
[/list]
[b]Service的生命周期[/b]
[list]
[*]startService()后,即使调用startService()的进程结束了,Service 仍然还存在,直到有进程调用stoptService(),或者Service 自己自杀(stopSelf())。
[*]bindService()后,Service 就和调用bindService()的进程同生共死,也就是说当调用bindService()的进程死了,那么它bind 的Service 也要跟着被结束,当然期间也可以调用unbindService()让Service 结束。
[*]两种方式混合使用时,比如说你startService()了,我bindService()了,那么只有你stoptService()了而且我也unbindService()了,这个Service 才会被结束。
[/list]
[b]进程生命周期[/b]
[list]
[*]Android 系统将会尝试保留那些启动了的或者时绑定了的服务进程。
[*]如果该服务正在进程的onCreate(),onStart()或者onDestroy()这些方法中执行时,那么主进程将会成为一个前台进程,以确保此代码不会被停止。
[*]如果服务已经开始,那么它的主进程会就重要性而言低于所有可见的进程但高于不可见的进程,由于只有少数几个进程是用户可见的,所以只要不是内存特别低,该服务不会停止。
[*]如果有多个客户端绑定了同一个服务,只要客户端中的一个对于用户是可见的,即认为该服务可见。
[/list]

实现一个当用户界面关闭时音乐继续播放的程序,代码如下:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="peng.test"
android:versionCode="1"
android:versionName="1.0">
...
<application android:icon="@drawable/icon" android:label="@string/app_name">
<service android:name=".Music" >
<intent-filter>
<action android:name="peng.test.START_AUDIO_SERVICE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
</application>
</manifest>

src/peng/test/Music.java 服务类
package peng.test;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

public class Music extends Service {
private MediaPlayer player;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
player = MediaPlayer.create(this, R.raw.aimo);
Log.d("DEBUGTAG", "Music Start");
player.start();
}

public void onDestroy() {
super.onDestroy();
Log.d("DEBUGTAG", "Music Stop");
player.stop();
}
}

src/peng/test/MyMusicPlayer.java Activity 类代码
package peng.test;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MyMusicPlayer extends Activity
implements OnClickListener {
private Button playMusic;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
playMusic = (Button)findViewById(R.id.btn_play);
playMusic.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_play) {
startService(new Intent("peng.test.START_AUDIO_SERVICE"));
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值