Android 如果服务正在运行,则使用从通知更新的UI启动活动
我在做一种音频播放器。目前,我在活动中运行了一个MediaPlayer(我知道这很糟糕)。屏幕上有一个SeekBar,它会随着音乐播放而更新,如下所示: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
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;
}
}
希望这对别人有帮助