android - 如何在 Android 的 MainActivity 中暂停/播放背景音乐?
问题描述
我在 Splashscreen.class 中调用服务 MusicaFundo 并希望在 MainActivity.class 中暂停/播放它。我正在尝试使用 sendBroadcast 但服务没有接收到意图,我在 MusicaFundo.class 中创建了 BroadcastReceiver、MyServiceReceiver,这样做有错吗?
MainActivity.class
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
boolean musicaTocar = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent svc = new Intent (this, MusicaFundo.class);
TextView titulo = findViewById(R.id.titulo);
final ImageView som = findViewById(R.id.som);
som.setBackgroundResource(R.drawable.volumeup);
final ImageView jogomem = findViewById(R.id.jogomem);
jogomem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Animation diminuir = (Animation) AnimationUtils.loadAnimation(MainActivity.this, R.anim.diminuir);
jogomem.startAnimation(diminuir);
Intent jogomemoria = new Intent(MainActivity.this, JogoMemoria.class);
startActivity(jogomemoria);
}
});
Animation deslocarD = (Animation) AnimationUtils.loadAnimation(this, android.R.anim.slide_in_left);
titulo.startAnimation(deslocarD);
som.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!musicaTocar){
som.setBackgroundResource(R.drawable.volumemut);
playMusica();
musicaTocar = true;
}
else {
if (musicaTocar){
som.setBackgroundResource(R.drawable.volumeup);
pausarMusica();
musicaTocar = false;
}
}
}
});
}
private void pausarMusica() {
Intent pausar = new Intent();
pausar.setAction("pausar");
sendBroadcast(pausar);
}
private void playMusica() {
Intent tocar = new Intent();
tocar.setAction("tocarmusica");
sendBroadcast(tocar);
}
MusicaFundo.class 内部
public class MusicaFundo extends Service {
private MediaPlayer player;
public int posatual = 0;
private static final String TAG = "MusicaFundo";
public static Object getName() {
return null;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate(){
player = MediaPlayer.create(this, R.raw.musicafundo);
player.setLooping(true);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
player.seekTo(posatual);
player.start();
return START_STICKY;
}
public boolean onUnbind(Intent intent){
return false;
}
@Override
public void onDestroy() {
super.onDestroy();
if (player != null) {
if (player.isPlaying()) {
player.stop();
}
player.release();
}
}
public void resumeMusic(){
if (player != null) {
if (player.isPlaying() == false) {
player.seekTo(posatual);
player.start();
}
}
}
public void onPause(){
if (player != null) {
if (player.isPlaying()) {
posatual = player.getCurrentPosition();
player.pause();
}
}
}
public class MyServiceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String pausa = intent.getAction();
if(pausa.equals("pausar")){
onPause();
Log.d(TAG, "onReceive: " + pausa);
}
else if(pausa.equals("tocarmusica")){
resumeMusic();
Log.d(TAG, "onReceive: " + pausa);
}
}
}
想要接收意图,以便它比较字符串以暂停或播放。
解决方案
不确定问题中的代码是否不完整,但您需要在服务中调用registerReceiver以便接收器实际接收广播。
此外,如果这主要是在同一进程中进行通信,我建议使用LocarBroadcastManager,因为它更高效、更安全。
推荐阅读
- c# - 在 Rider 中隐藏以 {string} 开头的特定代码行
- php - 如何使用 Nginx 在 Ubuntu 上正确运行 PHP 文件?
- ansible - Ansible jinja2 模板获取当前正在构建的 IP 文件
- javascript - 验证特定频道中的命令,以及不带前缀的特定消息
- javascript - 使一个单选按钮选择第二个镜像单选按钮
- reactjs - 使用 Material UI DropzoneDialogBase 上传文件
- excel - 从不同工作表中的数据创建图表时下标超出范围错误
- javascript - 使用javascript(chrome bug?)以编程方式从网页中的表格中选择多个单元格
- javascript - 如何处理 useEffect 依赖数组中不变的数组?
- c# - 在 Unity3D 中创建自定义检查器