首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当应用关闭时,Android媒体播放器如何继续播放歌曲?

问当应用关闭时,Android媒体播放器如何继续播放歌曲?
EN

Stack Overflow用户
提问于 2011-07-13 01:19:35
回答 5查看 30.8K关注 0票数 7

想知道关闭应用程序后如何播放下一首歌曲,就像播放整个CD或播放列表一样……

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-13 01:22:35

媒体播放器仅播放一首音轨。媒体播放器所做的就是收听onCompletion事件并播放下一首曲目。

MediaPlayer绑定到流程,而不是活动,所以只要流程运行,它就会一直播放。该活动可能会被暂停或销毁,但这不会影响MediaPlayer使用的内部线程。

我正在构建一个音频播放器来学习安卓,你可以看到播放音频文件的here服务

编辑

关于第一个评论:服务继续在后台运行,并在您“退出”应用程序后继续运行,因为服务和活动的生命周期是不同的。

为了播放下一首曲目,该服务在MediaPlayer上注册一个回调,以便在音频流完成时通知该服务。当音频播放完成时,该服务通过调用MediaPlayer.release()来清理MediaPlayer使用的资源,然后使用要播放的下一个音轨创建一个新的媒体播放器,并注册它自己以便在该音轨结束时再次收到通知,ad infinitum :)。

MediaPlayer类不理解播放列表,因此该服务负责在前一首曲目结束后播放曲目。

在我创建的AudioPlayer服务中,activity对AudioPlayer中的曲目进行排队,AudioPlayer负责按顺序播放曲目。

我希望这是清楚的,如果你有时间,请检查我上面放的AudioPlayer服务的代码。它不是纯粹的美,但它有它的作用。

票数 15
EN

Stack Overflow用户

发布于 2011-07-13 01:34:14

您可以创建一个服务,以便在应用程序退出或暂停后继续播放MediaPlayer。要让MediaPlayer播放连续的曲目,您可以注册一个onCompletionListener,它将决定接下来要播放的曲目。下面是一个执行此操作的简单示例服务:

代码语言:javascript
复制
package edu.gvsu.cis.muzak;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.IBinder;
import android.util.Log;

public class MuzakService extends Service {

    private static final String DEBUG_TAG = "MuzakService";
    private MediaPlayer mp;
    private String[] tracks = {
            "http://freedownloads.last.fm/download/288181172/Nocturne.mp3",
            "http://freedownloads.last.fm/download/367924875/Behemoths%2BSternentanz.mp3",
            "http://freedownloads.last.fm/download/185193341/Snowflake%2BImpromptu.mp3",
            "http://freedownloads.last.fm/download/305596593/Prel%25C3%25BAdio.mp3",
            "http://freedownloads.last.fm/download/142005075/Piano%2BSonata%2B22%2B-%2Bmovement%2B2%2B%2528Beethoven%2529.mp3",
            "http://freedownloads.last.fm/download/106179902/Piano%2BSonata%2B%25231%2B-%2Bmovement%2B%25234%2B%2528Brahms%2529.mp3",

    };
    private int currentTrack = 0;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(DEBUG_TAG, "In onCreate.");

        try {
            Uri file = Uri.parse(tracks[this.currentTrack]);
            mp = new MediaPlayer();
            mp.setDataSource(this, file);
            mp.prepare();
            mp.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    currentTrack = (currentTrack + 1) % tracks.length;
                    Uri nextTrack = Uri.parse(tracks[currentTrack]);
                    try {
                        mp.setDataSource(MuzakService.this,nextTrack);
                        mp.prepare();
                        mp.start();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } 

                }

            });

        } catch (Exception e) { 
            Log.e(DEBUG_TAG, "Player failed", e);
        }
    }


    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.d(DEBUG_TAG, "In onDestroy.");
        if(mp != null) {
            mp.stop();
        }
    }

    @Override
    public int onStartCommand(Intent intent,int flags, int startId) {
        super.onStart(intent, startId);
        Log.d(DEBUG_TAG, "In onStart.");
        mp.start();
        return Service.START_STICKY_COMPATIBILITY;
    }


    @Override
    public IBinder onBind(Intent intent) {
        Log.d(DEBUG_TAG, "In onBind with intent=" + intent.getAction());
        return null;
    }

}

您可以在活动中启动此服务,如下所示:

代码语言:javascript
复制
Intent serv = new Intent(this,MuzakService.class);
startService(serv);

然后像这样停下来:

代码语言:javascript
复制
Intent serv = new Intent(this,MuzakService.class);
stopService(serv);
票数 3
EN

Stack Overflow用户

发布于 2012-06-25 21:44:58

请注意,服务也在前台运行。

请参考官方文档。它用一个示例代码进行了解释。在MediaPlayer中使用服务:http://developer.android.com/guide/topics/media/mediaplayer.html#mpandservices

作为前台服务运行

服务通常用于执行后台任务

但是考虑一下播放音乐的服务的情况。显然,这是一个用户主动意识到的服务,任何中断都会严重影响用户的体验。此外,这是一个用户可能希望在其执行期间与之交互的服务。在这种情况下,服务应该作为“前台服务”运行。前台服务在系统中具有更高的重要性-系统几乎不会终止该服务,因为它对用户来说是直接重要的。在前台运行时,服务还必须提供状态栏通知,以确保用户知道正在运行的服务,并允许他们打开可以与服务交互的活动。

要将服务转换为前台服务,必须为状态栏创建通知并从服务调用startForeground()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6668298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档