0

我正在制作一种音频播放器。目前我有一个在 Activity 本身中运行的MediaPlayer (我知道这很糟糕)。屏幕上有一个SeekBar ,它会随着音乐播放而更新,如下所示:

private Runnable mUpdateTimeTask = new Runnable() {     
    public void run()
    {
        long totalDuration = mp.getDuration();
        long currentDuration = mp.getCurrentPosition();

        songTotalDurationLabel.setText("" + utils.millisecondsToTimer(totalDuration));
        songCurrentDurationLabel.setText("" + utils.millisecondsToTimer(currentDuration));

        int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration));
        songProgressBar.setProgress(progress);

        if(mp.isPlaying())
            mHandler.postDelayed(this, 100);
        else
            mHandler.removeCallbacks(mUpdateTimeTask);
    }       
};

一旦用户按下后退按钮从最近的应用程序列表中删除它,音乐就会停止。现在我希望音乐在后台运行,所以环顾互联网,我发现在ServicestartService()中运行它,并从 Activity调用。此外,我在播放音乐时会出现通知,并在暂停时将其删除。

我从一项服务中了解到,即使应用程序关闭,我也会播放音乐。但我不明白的是,如果用户在服务正在运行的情况下点击通知,则活动将在 SeekBar 处重新启动progress = 0

Activity 重新启动后,如何让 UI 将 SeekBar 更新为 Service 的正确值?

4

1 回答 1

0

弄清楚了!解决方案是使用 ActivityManager 获取正在运行的服务并像这样找到您的服务

private boolean fooRunning() 
{
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

    for(RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE))
    {
        if("com.name.packagename.foo".equals(service.service.getClassName()))
        {
            return true;
        }
    }
    return false;
}

如果此方法返回 true,则绑定到服务并从 MediaPlayer 对象获取当前位置

public void bindToService()
{
    if(fooRunning()) 
    {
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        serviceExists = true;
    }
    else
        serviceExists = false;
}

private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className, IBinder serviceBinder) 
    {
        bar binder = (bar) serviceBinder;
        mService = binder.getService();

        if(serviceExists)
        {
            int getProgress = mService.mp.getCurrentPosition();
            // mp is the MediaPlayer object in the service
            seekbar.setProgress(getProgress);               
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName className)
    {
    }       
};

服务类是这样的:

public class foo extends Service
{
    private MediaPlayer mp = new MediaPlayer();
    private final IBinder mBinder = new bar();

    public class bar extends Binder 
    {
        public foo getService()
        {
            return foo.this;
        }
    }

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

希望这对某人有帮助!

于 2013-07-24T15:16:15.700 回答