分类
1. Started Service
image.png启动的Activity与Service无太大联系之间无法进行方法调用
Started Service的生命周期
image.png基本用法
1. 创建与配置Service
new -> Service -> Service
- 通常会重写onCreate()、onStartCommand()、onBind()、onDestroy()几个方法。
public class MyService extends Service {
private final static String TAG = "MyService";
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
// throw new UnsupportedOperationException("Not yet implemented");
Log.d(TAG, "********* onBind *********");
Log.d(TAG, "onBind is called");
Log.d(TAG, "********* onBind *********");
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "********* onCreate *********");
Log.d(TAG, "onCreate is called");
Log.d(TAG, "********* onCreate *********");
Log.d(TAG, " ");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "********* onStart *********");
Log.d(TAG, "onStart is called");
Log.d(TAG, "********* onStart *********");
Log.d(TAG, " ");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.d(TAG, "********* onDestory *********");
Log.d(TAG, "onDestory is called");
Log.d(TAG, "********* onDestory *********");
Log.d(TAG, " ");
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "********* onUnbind *********");
Log.d(TAG, "onUnbind is called");
Log.d(TAG, "********* onUnbind *********");
Log.d(TAG, " ");
return super.onUnbind(intent);
}
@Override
public void onRebind(Intent intent) {
Log.d(TAG, "********* onRebind *********");
Log.d(TAG, "onRebind is called");
Log.d(TAG, "********* onRebind *********");
Log.d(TAG, " ");
super.onRebind(intent);
}
}
配置在AndroidManifest.xml中进行
- enabled指定是否可以实例化
- exported指定是否能被其他应用程序组件调用或者交互
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" />
2. 启动与停止Service
image.png---启动---
Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent);
---停止---
stopService(intent);
实例 - 控制背景音乐的播放
I. 创建MediaPlayer对像并加载播放的音乐文件
@Override
public void onCreate() {
player = MediaPlayer.create(this, R.raw.music); //创建MediaPlayer对像并加载播放的音乐文件
}
II. 实现音乐的播放
@Override
public int onStartCommand(Intent intent, int flags, int startId) { //实现音乐的播放
if (!player.isPlaying()) { //如果没有播放音乐
player.start(); //播放音乐
isplay = player.isPlaying(); //当前状态正在播放音乐
}
return super.onStartCommand(intent, flags, startId);
}
III. 停止音乐的播放
@Override
public void onDestroy() { //停止音乐的播放
player.stop(); //停止音频的播放
isplay = player.isPlaying(); //当前状态没有播放音乐
player.release(); //释放资源
super.onDestroy();
}
IV. 启动服务与停止服务,实现播放背景音乐与停止播放背景音乐
ImageButton btn_play = (ImageButton) findViewById(R.id.btn_play);//获取“播放/停止”按钮
//启动服务与停止服务,实现播放背景音乐与停止播放背景音乐
btn_play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (MusicService.isplay == false) { //判断音乐播放的状态
startService(new Intent(MainActivity.this, MusicService.class)); //启动服务,从而实现播放背景音乐
//更换播放背景音乐图标
((ImageButton) v).setImageDrawable(getResources().getDrawable(R.drawable.play, null));
} else {
stopService(new Intent(MainActivity.this, MusicService.class)); //停止服务,从而实现停止播放背景音乐
//更换停止背景音乐图标
((ImageButton) v).setImageDrawable(getResources().getDrawable(R.drawable.stop, null));
}
}
});
V. 实现进入界面时,启动背景音乐服务
@Override
protected void onStart() { //实现进入界面时,启动背景音乐服务
startService(new Intent(MainActivity.this, MusicService.class)); //启动服务,从而实现播放背景音乐
super.onStart();
}
image.png
2. Bound Service
image.pngActivity与Service绑定在一起,一方关闭则另一方也停止
Bound Service生命周期
image.png实现步骤
服务器端
- 创建Service并重写onBind()方法,返回一个IBinder对象,用于和绑定它的组件之间通信
- 在Service中创建一个MyBinder的内部类(继承自Binder类)
客户端 - 在Activity中创建ServiceConnection对象,用于获取onBind()返回的IBinder对象
- 在Activity的onStart()中调用bindService()绑定Service
- 在onStop()方法中调用UNbindService()解除绑定
实例 - 双色球随机选号
I. 创建MyBinder内部类并获取服务对象与Service状态
public class MyBinder extends Binder { //创建MyBinder内部类并获取服务对象与Service状态
public BinderService getService() { //创建获取Service的方法
return BinderService.this; //返回当前Service类
}
}
II. 创建获取随机号码的方法
public List getRandomNumber() { //创建获取随机号码的方法
List resArr = new ArrayList(); //创建ArrayList数组
String strNumber="";
for (int i = 0; i < 7; i++) { //将随机获取的数字转换为字符串添加到ArrayList数组中
int number = new Random().nextInt(33) + 1;
//把生成的随机数格式化为两位的字符串
if (number<10) { //在数字1~9前加0
strNumber = "0" + String.valueOf(number);
} else {
strNumber=String.valueOf(number);
}
resArr.add(strNumber);
}
return resArr; //将数组返回
}
III. 设置单击事件获取BinderService中的随机数并显示
@Override
public void onClick(View v) {
List number = binderService.getRandomNumber(); //获取BinderService类中的随机数数组
for (int i = 0; i < number.size(); i++) { //遍历数组并显示
TextView tv = (TextView) findViewById(tvid[i]); //获取文本框组件对象
String strNumber = number.get(i).toString(); //将获取的号码转为String类型
tv.setText(strNumber); //显示生成的随机号码
}
}
IV. 设置启动Activity时与后台Service进行绑定
@Override
protected void onStart() { //设置启动Activity时与后台Service进行绑定
super.onStart();
Intent intent = new Intent(this, BinderService.class); //创建启动Service的Intent
bindService(intent, conn, BIND_AUTO_CREATE); //绑定指定Service
}
V. 设置关闭Activity时解除与后台Service的绑定
@Override
protected void onStop() { //设置关闭Activity时解除与后台Service的绑定
super.onStop();
unbindService(conn); //解除绑定Service
}
image.png
Intent Service
image.pngIntent Service是Service的子类,它能自动开启线程并停止服务
网友评论