Android 当应用程序从最近的应用程序中清除时,如何处理作为前台运行的服务?

Android 当应用程序从最近的应用程序中清除时,如何处理作为前台运行的服务?,android,audio-player,foreground-service,Android,Audio Player,Foreground Service,我的Android应用程序正在播放音频,而该应用程序在后台运行,其服务作为前台运行,类似于许多其他应用程序,如Google Play Music、Spotify和其他音乐播放器/播客播放器应用程序 我检查过的大多数应用程序,包括Google Play Music,即使该应用程序已从最近的应用程序中清除,也会让该服务继续运行。另一方面,有些人会停止音频并关闭服务(我只发现Spotify正在这样做) 我想知道处理这个问题的正确方法是什么?尽管大多数应用程序都会让服务保持打开状态,但用户似乎希望音频停

我的Android应用程序正在播放音频,而该应用程序在后台运行,其服务作为前台运行,类似于许多其他应用程序,如Google Play Music、Spotify和其他音乐播放器/播客播放器应用程序

我检查过的大多数应用程序,包括Google Play Music,即使该应用程序已从最近的应用程序中清除,也会让该服务继续运行。另一方面,有些人会停止音频并关闭服务(我只发现Spotify正在这样做)

我想知道处理这个问题的正确方法是什么?尽管大多数应用程序都会让服务保持打开状态,但用户似乎希望音频停止,通知会与应用程序一起从状态栏中消失

这里有正确的方法吗?

您可以检查一下,看看当应用程序从中删除时,流程会发生什么变化

最近的名单

即使调用了onTaskRemoved(),在这种情况下也不会终止应用程序。该服务继续存在。可以通过转到隐藏的开发者菜单来检查正在运行的进程来证明这一点


您可以在此回调方法中执行一些代码,并获得所需的行为。

当应用程序从最近清除时,让服务保持运行,用户可以使用如下按钮完全停止通知中的音频和服务:

既然这是一个意见问题,我将作为一名开发者,同时也是一名强大的智能手机用户(好吧,现在已经不是了):

tl;dr:让它继续运行

===============================

较长版本

将手机用作音乐播放器的意义在于,当你做其他活动时,为你提供音频,比如跑步、浏览、发短信,甚至为通过扬声器连接的其他人播放音乐,成为你所在团队的“dj”。你很少使用音乐播放器作为主要任务,我希望你在做一些事情时,比如试图找出歌词,或观看视频剪辑(因此,你会使用YouTube)因此,我认为您的音乐播放器应该有一个独立于手机其他活动的生命周期。想象一下为他人播放音乐的噩梦,当您在手机上处理无关的内容时,音乐突然停止

然而,当你提到“用户似乎希望音频停止,通知将与应用程序一起从状态栏消失”时,你有一个观点。我不认为这句话是真的,而是把要点摘录出来:用户想要轻松地停止他们的音乐应用程序

从这个意义上讲,您应该尽可能轻松地停止播放,以优化您的用户体验。在我脑海中,我会想象最好的方法是在你的通知扩展版(甚至是压缩版)中安装一个漂亮的“X”按钮。然后,用户就可以从状态栏上停止播放,而不必将应用程序放在最前面


如果你想更进一步,你可以在设置中选择使用前台或后台服务——为了让用户更容易理解,你可以使用“当最近的应用被清除时停止音乐”这样的措辞,从而根据用户的需要将选择权交给用户。当然,这会给用户增加复杂性和太多的功能,因此由您自己决定是否需要它。

让它运行,并发出通知

这一切都在名义上。 根据,

“最近的屏幕(也称为概览屏幕,最近的 任务列表(或最近的应用程序)是一个系统级UI,用于列出最近的任务 已访问的活动和任务。”

从该列表中删除任务只会将其从列表中删除,而不是从执行中删除

(当然是在Oreo下)是让用户知道您仍在运行服务的地方。使用通知允许他们重新打开任务,然后在他们认为合适时终止服务

public class OnClearFromRecentService extends Service {

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d("ClearFromRecentService", "Service Started");
    return START_NOT_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d("ClearFromRecentService", "Service Destroyed");
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    Log.e("ClearFromRecentService", "END");
    //Code here
    stopSelf();
}
}

在Manifest.xml中注册此服务,如下所示

<service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />

现在,无论何时从android recent中清除应用程序,都会执行此方法onTaskRemoved()。

您正在制作一个类似音乐播放器的应用程序,因此大多数时间用户都希望即使应用程序在最近的任务中关闭,也会播放音乐。现在,您正在使用前台服务,因此将显示通知,在该通知中,您提供了停止按钮,以便用户可以从那里停止音乐

但如果你想在从最近的任务中删除后停止应用程序的后台服务

public class CustomService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);
        //stop service
        stopService(new Intent(this, CustomService.class));
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("CustomService", "Service Destroyed");
    }
}
现在在AndroidMenifest.xml中声明服务

<service android:name=".CustomService" android:stopWithTask="false" />


android:stopWithTask=“false”将在onTaskRemoved()上进行回调,因此在那里处理停止服务。

感谢链接,但这实际上并没有回答我的问题。如果您愿意,您可以在清除应用程序的最近访问权限后停止服务。默认情况下,它不会停止。问题是什么是首选/正确的行为,如果有的话。感谢您的全面回复!你让我相信播放器应该有一个独立的生命周期,Android用户不一定希望音频在这种情况下停止,而是希望轻松停止音乐,而这已经通过在通知中使用“X”按钮实现了。我也很喜欢你的“更进一步”的想法!
<service android:name=".CustomService" android:stopWithTask="false" />