在媒体播放器上实施后台服务

时间:2019-07-15 14:27:25

标签: java android android-service android-mediaplayer

我正在尝试在运行网络广播的媒体播放器上实现后台服务。但是我是使用Java / Android进行编程的初学者,并且无法实现示例中显示的代码。

这是我的MainActivity.java:

public class MainActivity extends AppCompatActivity {
    Button button_play;
    boolean prepared = false;
    boolean started = false;
    String Stream = "UrlFromWebRadio";
    // in my case i use http://wz5.dnip.com.br/litoral/litoral.stream/playlist.m3u8
    MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button_play = findViewById(R.id.button_play);
        button_play.setEnabled(false);
        button_play.setText("Loading");
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        new PlayerTask().execute(Stream);

        button_play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(started){
                    started = false;
                    mediaPlayer.pause();
                    button_play.setText("Play");
                }
                else{
                    started = true;
                    mediaPlayer.start();
                    button_play.setText("Stop");
                }
            }
        });
    }

    class PlayerTask extends AsyncTask<String, Void, Boolean> {
        @Override
        protected Boolean doInBackground(String... strings){
            try{
                mediaPlayer.setDataSource(strings[0]);
                mediaPlayer.prepare();
                prepared = true;
            }
            catch (IOException e){
                e.printStackTrace();
            }
            return prepared;
        }

        @Override
        protected void onPostExecute(Boolean aBoolean){
            super.onPostExecute(aBoolean);
            button_play.setEnabled(true);
            button_play.setText("Play");
        }
    }

    @Override
    protected void onPause(){
        super.onPause();
        if(started){
            mediaPlayer.pause();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(started){
            mediaPlayer.start();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(prepared){
            mediaPlayer.release();
        }
    }
}

这是我的Service(WebRadioService.java)示例类:

public class WebRadioService extends Service{
    MediaPlayer mediaPlayer;

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

    @Override
    public void onCreate() {
        Toast.makeText(this, "Service Created", Toast.LENGTH_SHORT).show();
        //
        // mediaPlayer = MediaPlayer.create(this, R.drawable.test);
        // the line above will play specific file
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
        mediaPlayer.start();
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        Toast.makeText(this, "Service Finalized", Toast.LENGTH_SHORT).show();
        mediaPlayer.release();
    }
}

这是我当前拥有代码的方式,并且MainActivity可以工作。现在想实施后台服务。但是我可能无法使用我现在看到的示例,这可能是由于缺乏知识。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您必须使用称为Android Services的东西。

从文档中

“服务是一种应用程序组件,代表应用程序执行长时间运行的操作而不与用户交互或提供功能供其他应用程序使用的愿望。”

以下是使用服务入门的出色官方指南:http://developer.android.com/guide/components/services.html

START_STICKY

如果onStartCommand()返回后系统终止了该服务,请重新创建该服务并调用onStartCommand(),但不要重新传递最后一个意图。取而代之的是,系统将以空意图调用onStartCommand(),除非有未决的意图来启动服务。在这种情况下,这些意图就可以实现。这适用于没有执行命令但正在无限期运行并等待任务的媒体播放器(或类似服务)。