为什么在媒体播放器循环播放时我的服务被破坏?

问题描述

在我的应用程序的MainActivity中,我使用MediaPlayers播放一些声音,并在该活动中的onPause()中重新实现播放器,并开始通过再次创建声音来继续播放这些声音的服务,然后发送resourcesNames和Volume从活动到服务的每个玩家,我正在使用setLooping()使这些声音循环播放,并且我在Handler和HandlerThread的新线程(主线程之外)中运行该服务。 当活动暂停时,服务会启动并且正在播放声音,但问题是它们只是循环播放了3次,然后服务被销毁,而没有调用stopService()或stopSelf(),也没有退出app(该应用仍在最近的应用中)?

以下是该服务的代码:

package com.example.naturesounds;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
import android.os.Process;
import android.util.Log;
import androidx.annotation.NonNull;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

public class SoundSPlayingService extends Service  implements MediaPlayer.OnPreparedListener
 {

  private static final String PACKAGE_NAME = "com.example.naturesounds";

  private float playerVolume = 0.0f;

  serviceHandler serviceHandler;

  Looper serviceLooper;

  HandlerThread thread;

  Intent intent;

  Bundle playersVolume = new Bundle() ;

  ArrayList<String> runningResourceNames = new ArrayList<>();

  HashMap<String,MediaPlayer> playersMap = new HashMap<>();

    @Override
    public void onCreate() {
        
        thread = new HandlerThread("ServiceThread",Process.THREAD_PRIORITY_BACKGROUND);

        thread.start();

        serviceLooper = thread.getLooper();

        serviceHandler = new serviceHandler(serviceLooper);
    }

    @Override
   public int onStartCommand(Intent intent,int flags,int startId) {

        Message message = serviceHandler.obtainMessage();

        message.obj = intent;

        serviceHandler.sendMessage(message);

        return START_STICKY;
    }

    @Override
   public IBinder onBind(Intent intent)
    {
        return null;
    }

    @Override
    public void onDestroy() {

        releasePlayers();

        Log.d("serviceLifeCycle","onDestroy() is running");
    }

    public void createPlayer(String resourceName)
    {
        playersMap.put(resourceName,new MediaPlayer());

        try {
            playersMap.get(resourceName).setDataSource(getApplicationContext(),Uri.parse("android.resource://com.example.naturesounds/raw/" + resourceName));

            playersMap.get(resourceName).setOnPreparedListener(this);

            playersMap.get(resourceName).prepareAsync();

            playersMap.get(resourceName).setWakeMode(getApplicationContext(),PowerManager.PARTIAL_WAKE_LOCK);

            setPlayerLooping(resourceName);

            setPlayerVolume(resourceName);
        }
        catch (IOException e1)
        {
            e1.printStackTrace();
        }
        catch (IllegalArgumentException e2)
        {
            e2.printStackTrace();
        }
    }

    public void releasePlayers()
    {
        for(int i=0 ; i<runningResourceNames.size(); i++)
        {
            String resourceName = runningResourceNames.get(i);

            if(playersMap.get(resourceName) != null)
            {
                playersMap.get(resourceName).release();

                playersMap.put(resourceName,null);
            }
        }
    }

    public  void setPlayerVolume(String resourceName)
    {
        playerVolume = playersVolume.getFloat(resourceName);

        Log.d("playerVolume",String.valueOf(playerVolume));

        playersMap.get(resourceName).setVolume(playerVolume,playerVolume);
    }

    public void setPlayerLooping(String resourceName)
    {
        playersMap.get(resourceName).setLooping(true);
    }

    @Override
    public void onPrepared(MediaPlayer mp) {

        mp.start();
    }


    class serviceHandler extends Handler
  {
      public serviceHandler(Looper looper)
      {
          super(looper);
      }

      @Override
      public void handleMessage(@NonNull Message msg) {

          Log.d("serviceHandlerChecking","handleMessage() is executing");

          intent = (Intent) msg.obj;

          runningResourceNames = intent.getStringArrayListExtra(PACKAGE_NAME +                             ".MainActivity.runningResourceNames");

          playersVolume = intent.getBundleExtra(PACKAGE_NAME + ".MainActivity.playersVolume");

          for(int i=0; i<runningResourceNames.size(); i++)
          {
              String resourceName = runningResourceNames.get(i);

             createPlayer(resourceName);
          }
      }
    }
  }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...