我正在制作音频播放器。目前我在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更新为服务中的正确值?
答案 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;
}
}
希望这有助于某人!