Android:通过清除最近的应用来阻止活动被破坏

时间:2015-07-29 12:53:27

标签: android

我有一个问题..我使用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();
    }

}

编辑:我找到了答案,答案是坚持服务并在前台发布通知

3 个答案:

答案 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