首页 > 解决方案 > 在媒体播放器上实现后台服务

问题描述

我正在尝试在运行网络广播的媒体播放器上实现后台服务。但我是使用 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();
        }
    }
}

这是我的服务示例类(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 可以工作。现在想实现后台服务。但是我不能用我现在看到的例子,可能是因为缺乏知识。有人可以帮忙吗?

标签: javaandroidandroid-serviceandroid-mediaplayer

解决方案


你必须使用一种叫做 Android 服务的东西。

从文档:

“服务是一个应用程序组件,代表应用程序希望在不与用户交互的情况下执行更长时间运行的操作,或者为其他应用程序提供功能使用。”

START_STICKY

如果系统在 onStartCommand() 返回后终止服务,则重新创建服务并调用 onStartCommand(),但不要重新传递最后一个意图。相反,系统会以空意图调用 onStartCommand() ,除非有待启动的意图来启动服务。在这种情况下,这些意图就会被传递。这适用于不执行命令但无限期运行并等待作业的媒体播放器(或类似服务)。


推荐阅读