Android 如果服务正在运行,则使用从通知更新的UI启动活动

Android 如果服务正在运行,则使用从通知更新的UI启动活动,android,android-service,android-mediaplayer,android-ui,android-notifications,Android,Android Service,Android Mediaplayer,Android Ui,Android Notifications,我在做一种音频播放器。目前,我在活动中运行了一个MediaPlayer(我知道这很糟糕)。屏幕上有一个SeekBar,它会随着音乐播放而更新,如下所示: private Runnable mUpdateTimeTask = new Runnable() { public void run() { long totalDuration = mp.getDuration(); long currentDuration = mp.getCurr

我在做一种音频播放器。目前,我在活动中运行了一个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);
    }       
};
一旦用户按下后退按钮将其从最近的应用列表中删除,音乐就会停止。 现在我想让音乐在后台运行,所以我在互联网上找到了一个服务,并通过Activity调用
startService()
。此外,我在播放音乐时会弹出一个通知,在暂停时会将其删除

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

如何让UI在活动重新启动后从服务中将SeekBar更新为正确的值?解决了这个问题! 解决方案是使用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;
    }
}
希望这对别人有帮助