我有一个问题..我使用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();
}
}
编辑:我找到了答案,答案是坚持服务并在前台发布通知
答案 0 :(得分:0)
警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。 来自:Services
您的服务可能与活动绑定,并随之死亡。请查看Android文档中的Creating a Background Service,了解具体方法。
答案 1 :(得分:0)
一旦关闭,不要试图让你的活动保持活力,你不会成功,这是一个黑客。你想要的是保持你的服务前景,这将阻止你的申请过程被杀死。您应该设计活动,以便在关闭和销毁活动后不会停止MediaPlayer。
了解更多信息,请点击此处:Using a Service with MediaPlayer
还有一个关于制作服务前景的部分:Running as a foreground service
[编辑]
我可能会错过理解您的问题,如果问题是清除最近列表后服务被杀死然后查看SO:Android - Service stops when swiping app from recent apps,其解决方案是使用alarmmanager,它会在任务被杀后重启您的服务。< / p>
答案 2 :(得分:0)
如果进程被终止,您可以重新启动服务,您必须覆盖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);
}
或者你可以在START_STICKY
中返回onStartCommand()
,如果它终止,它将重启服务。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
来源:The process of the service is killed after the application is removed from the application tray