我有一个问题。我使用MediaPlayer类来启动歌曲,问题是当应用程序关闭时,歌曲播放也停止了。
我搜索了网络,发现我可以覆盖背按方法将任务移动到后台,它对我来说很好,但是,当我从最近的应用程序中删除应用程序(通过滑动最近的应用程序或清除最近的应用程序)时,歌曲播放停止。
那么有什么方法可以防止这种情况发生吗?
我的代码是这样的:主要活动:
oncreate()
{
//
public static MediaPlayer mp;
startsong();
}
void startsong()
{
mp = MediaPlayer.create(....);
mp.start();
Intent intent = new Intent(this,Service.class);
startService(inent);
}
onBackPressed()
{
moveTaskToBack(true);
}
服务类别:
onStartCommand()
{
Main.mp.setOnCompletitionListener( ... new oncomp ...)
{
Main.mp.stop();
Main.mp.release();
}
}
编辑:我找到了答案,答案是在前台设置通知服务
警告:服务运行在其托管进程的主线程中——服务不创建自己的线程,也不运行在单独的进程中(除非您另有指定)。来自:服务
你的服务很可能绑定到Activity,并随着Activity一起死亡。查看Android文档中的创建后台服务,以了解如何使其不这样做。
如果进程被终止,您可以重新启动服务,您必须重写public void onTaskRemoved()
@Override
public void onTaskRemoved(Intent rootIntent){
Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
restartServiceIntent.setPackage(getPackageName());
PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmService.set(
AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + 1000,
restartServicePendingIntent);
super.onTaskRemoved(rootIntent);
}
或者您可以在onStartCommand()
中返回START_STICKY
,这将在服务被终止时重新启动服务。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
源:在应用程序从应用程序托盘中移除后,服务进程被杀死
不要试图让你的活动在关闭后保持活跃,你不会成功的,这是一个黑客。你想要的是保持你的服务前台,它应该防止你的应用程序进程被杀死。你应该这样设计你的活动,MediaPlayer将不会停止一旦活动被关闭和销毁。
更多信息请看这里:使用MediaPlayer服务
还有一部分是关于使服务前台:作为前台服务运行
[编辑]我可能误解了你的问题,如果问题是服务在清除最近的列表后被杀死,那么看看这个SO: Android -服务在从最近的应用程序中滑动应用程序时停止,它的解决方案是使用alarmmanager,它会在任务被杀死后重新启动你的服务