目录
- Service 开发应用
- BindService
- IntentService
Service 开发应用
在后台长时间运行,没有界面UI, 在后台下载文件和获取用户GPS信息
- Service: 分为 startService 和 BoundService;
- 只有Activity 调用startService才会通知服务启动, BoundService只Activity bindService 进行启动。
- Service中Export 和Enable两个属性, Export 应用组件能不能调用被Service, Enable: 表示Service能不能被实例化。
- 重写onBind ,onCreate,onStartCommand,onDestory 这个四个方法。
- 在调用Service 时候判断本Service是否在正在运行
// 需要在XML文件中配准Service Bound
<service
android:name=".MusicService"
android:enabled="true"
android:exported="true"></service>
public boolean isRunning() {
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ArrayList<ActivityManager.RunningServiceInfo> runningServiceInfoArrayList
= (ArrayList< ActivityManager.RunningServiceInfo>) activityManager.getRunningServices();
for(int i=;i <runningServiceInfoArrayList.size();i++){
if(runningServiceInfoArrayList.get(i).service.getClassName().toString().equals("com.example.myapplication.MyService")) {
return true;
}
}
return false;
}
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageButton;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//设置全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
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));
}
}
});
}
@Override
protected void onStart() { //实现进入界面时,启动背景音乐服务
startService(new Intent(MainActivity.this, MusicService.class)); //启动服务,从而实现播放背景音乐
super.onStart();
}
}
package com.example.myapplication;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
public class MusicService extends Service {
public MusicService() {
}
static boolean isPlay =false;
private MediaPlayer player;
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 判断播放状态
if(player.isPlaying()) {
player.start();
isPlay = player.isPlaying();
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
// 创建MediaPlay对象,加载播放音频对象
player = MediaPlayer.create(this,R.raw.music);
super.onCreate();
}
@Override
public void onDestroy() {
player.stop();
isPlay = player.isPlaying();
player.release();
super.onDestroy();
}
}
注意 在Android 8.0 后不允许在后台创建Service 上面有问题 需要调整
BindService
- Service对象中 创建一个MyBinder类型的绑定器, 返回其绑定对象
- Activity中 ServiceConnection 重写其中方法,在此方法中获取Service独享
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
BinderService binderService; //声明BinderService
//文本框组件ID
int[] tvid = {R.id.textView, R.id.textView2, R.id.textView3, R.id.textView4, R.id.textView5,
R.id.textView, R.id.textView7};
// 创建ServiceConnection 对象
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
binderService = ((BinderService.MyBinder) iBinder).getService();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_random = (Button) findViewById(R.id.btn); //获取随机选号按钮
btn_random.setOnClickListener(new View.OnClickListener() { //单击按钮,获取随机彩票号码
@Override
public void onClick(View v) {
List number = binderService.getRandomNumber(); //获取BinderService类中的随机数数组
for (int i =; i < number.size(); i++) { //遍历数组并显示
TextView tv = (TextView) findViewById(tvid[i]); //获取文本框组件对象
String strNumber = number.get(i).toString(); //将获取的号码转为String类型
tv.setText(strNumber); //显示生成的随机号码
}
}
});
}
@Override
protected void onStart() { //设置启动Activity时与后台Service进行绑定
super.onStart();
Intent intent = new Intent(this, BinderService.class); //创建启动Service的Intent
bindService(intent, serviceConnection, BIND_AUTO_CREATE); //绑定指定Service
}
@Override
protected void onStop() { //设置关闭Activity时解除与后台Service的绑定
super.onStop();
unbindService(serviceConnection); //解除绑定Service
}
}
package com.example.myapplication;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class BinderService extends Service {
public BinderService() {
}
// 创建MyBinder 内部类
public class MyBinder extends Binder {
public BinderService getService() {
return BinderService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new MyBinder();
}
public List getRandomNumber() { //创建获取随机号码的方法
List resArr = new ArrayList(); //创建ArrayList数组
String strNumber="";
for (int i =; i < 7; i++) { //将随机获取的数字转换为字符串添加到ArrayList数组中
int number = new Random().nextInt() + 1;
//把生成的随机数格式化为两位的字符串
if (number<) { //在数字1~9前加0
strNumber = "" + String.valueOf(number);
} else {
strNumber=String.valueOf(number);
}
resArr.add(strNumber);
}
return resArr; //将数组返回
}
@Override
public void onDestroy() { //销毁该Service
super.onDestroy();
}
}
IntentService
IntentService VS 普通Service区别:
- 在普通service进行IO请求或者是 HTTP耗时请求,会让Android在此等待,所以使用 IntentService 解决 耗时严重的 HTTP请求。
- 普通的Service 不能自动开启线程 和 自动停止服务
- 所以IntentService 解决普通Service 这两个问题