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

时间:2013-07-20 20:05:27

标签: android android-service android-mediaplayer android-ui android-notifications

我正在制作音频播放器。目前我在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);
    }       
};

用户按下后退按钮从最近的应用列表中删除后,音乐停止。 现在我想要音乐在后台运行,所以在互联网上查找我发现在服务中运行它,并从Activity调用startService()。此外,我在播放音乐时会出现通知,暂停播放时会被删除。

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

如何在活动重启后让UI将SeekBar更新为服务中的正确值?

1 个答案:

答案 0 :(得分: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)
    {
    }       
};

Service类是这样的:

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;
    }
}

希望这有助于某人!