在app内播放后台音频需要调用Service组件
Service组件需要在清单文件里使用标签注册 (一般会自动在文件里注册)
Service 是编写服务组件的抽象基类
onCreate() 和onDestroy() 是Service的2个重要生命周期方法,需要在其内编写代码
非绑定方式启动服务时,不需要在生命周期方法onBind()内编写代码
通过点击按钮播放bgm
service:
package com.example.example5_1;import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;public class MyAudioService extends Service {MediaPlayer mp;@Overridepublic void onCreate() { //开始服务时调用super.onCreate();mp = MediaPlayer.create(this,R.raw.white);mp.start();}@Overridepublic void onDestroy() {super.onDestroy();mp.stop();if (mp != null) mp=null;}@Overridepublic IBinder onBind(Intent intent) { //不可省略的生命周期方法// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}
}
MainActivity:
package com.example.example5_1;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener{Intent intent;Button btn_play,btn_stop;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_play = findViewById(R.id.btn_play);btn_stop = findViewById(R.id.btn_stop);btn_play.setOnClickListener(this);btn_stop.setOnClickListener(this);}@Overridepublic void onClick(View v){intent = new Intent(this,MyAudioService.class); //用intent来实现服务的运行和停止int id = v.getId();switch (id){case R.id.btn_play:startService(intent);Toast.makeText(this, "音乐服务进行中...", Toast.LENGTH_SHORT).show();btn_stop.setEnabled(true);btn_play.setEnabled(false);break;case R.id.btn_stop:stopService(intent);btn_stop.setEnabled(false);btn_play.setEnabled(true);}}@Overrideprotected void onDestroy() { //考虑播放时返回super.onDestroy();if (intent != null) stopService(intent); //停止服务finish(); //关闭}
}
进入app直接后台播放bgm
Service:
package com.example.example5_2;import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;public class MyAudioService extends Service {private MediaPlayer mp;public class PlayBinder extends Binder{ //用作代理的内部类public void MyMethod(){ //服务方法mp = MediaPlayer.create(getApplicationContext(),R.raw.white);mp.start();}}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.// throw new UnsupportedOperationException("Not yet implemented");return new PlayBinder(); //返回服务代理类}@Overridepublic void onDestroy() { //服务销毁时停止音乐播放if (mp != null){mp.stop();mp.release();}super.onDestroy();}
}
MainActivity:
需要创建一个接口ServiceConnection对象来实现建立服务连接时的内容
package com.example.example5_2;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;public class MainActivity extends AppCompatActivity {
//以绑定方式启动服务(活动和服务绑定),需要建立代理人@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {MyAudioService.PlayBinder playBinder = (MyAudioService.PlayBinder) iBinder;//获取代理人对象playBinder.MyMethod(); //调用代理方法}@Overridepublic void onServiceDisconnected(ComponentName componentName) {//断开服务连接}};Intent intent = new Intent(getApplicationContext(),MyAudioService.class);bindService(intent,connection,BIND_AUTO_CREATE); //绑定服务}
}
代理人
所谓的代理人相当于一个可以帮助 用户 和 程序 进行更好的交互的角色,比如
“取款人——自动取款机——银行服务器” 中的取款机
还有一种远程服务调用音频播放的方法,用的比较少