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

5
我的安卓应用程序在后台运行时通过一个作为前台运行的服务播放音频,类似于其他许多应用程序,例如Google Play音乐、Spotify和其他音乐播放器/播客应用程序。
我检查了大多数应用程序,包括Google Play音乐,在应用程序从最近清除时仍将服务保持运行。另一方面,有些应用程序会停止音频并关闭服务(我只发现Spotify这样做)。
我想知道处理这个问题的正确方式是什么?虽然大多数应用程序都保持服务开启,但用户似乎希望音频停止,并且通知与应用程序一起从状态栏消失。
这里是否有正确的方法?
6个回答

1
你可以查看此链接,了解当应用程序从最近列表中删除时,进程会发生什么。
即使调用了onTaskRemoved(),在这种情况下应用程序也不会被杀死。服务将继续存在。可以通过进入隐藏的开发人员菜单来检查运行进程来证明这一点。
您可以在此回调方法中执行某些代码,并获得所需的行为。

谢谢提供链接,但这并没有真正回答我的问题。如果你愿意,可以在应用程序从最近列表中清除时停止服务。默认情况下,它不会停止。问题是,如果有的话,什么是首选/正确的行为? - Hadas Kaminsky

1

既然这是一个观点问题,我作为一名开发人员和智能手机的重度用户(现在谁不是呢),我将给出自己的看法:

简而言之:让它保持运行状态。

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

更长的版本

使用手机作为音乐播放器的目的是在您进行其他活动时(例如跑步、浏览、发送短信,甚至为通过扬声器连接的其他人播放音乐并成为您小组的“DJ”)提供音频。您很少会将音乐播放器用作主要任务,我希望您在像尝试弄清歌词或观看视频剪辑(因此,您将使用YouTube)这样的事情时使用它。因此,我认为您的音乐播放器应该具有与您的手机其他活动不同的生命周期。

想象一下,当您在手机上处理无关的事情时,突然停止播放音乐给其他人听的噩梦。

但是,当您提到“似乎用户希望音频停止并且通知与应用程序一起从状态栏消失”时,您说得有道理。我不会把整个陈述看作真实,而是提取要点:用户希望轻松停止他们的音乐应用程序

在这种意义上,为了优化用户体验,您应该尽可能地简化停止播放的步骤。首先想到的最好的方法是在通知栏扩展版本(甚至是紧凑版本)中添加一个漂亮的“X”按钮。用户可以直接从状态栏停止播放,而不必将应用程序带到前台。
如果您想更进一步,您可以在设置中添加一个选项,以使用前台或后台服务。为了让用户更容易理解,您可以使用像“清除最近应用程序时停止音乐”这样的措辞,因此根据他们的需求委派选择给用户。当然,这会增加复杂性和用户权力,因此需要您自己决定是否需要它。

1
感谢您的全面回复!您让我相信玩家应该有一个单独的生命周期,并且安卓用户不一定希望在这种情况下停止音频,而是想要轻松停止音乐,而通过在通知中添加“X”按钮已经实现了这一点。我也非常喜欢您的“进一步”的想法! - Hadas Kaminsky

1

请保持其运行,并使用通知。

这一切都在名称中。 根据Android开发者

“最近使用的活动和任务列表(也称为概述屏幕、最近任务列表或最近应用程序)是一个系统级用户界面,列出了最近访问的活动和任务。”

从此列表中滑动任务只会将其从列表中移除,而不会停止执行。

通知(特别是在Oreo下)是您让用户知道您仍在运行服务的地方。使用通知允许他们重新打开任务,然后根据他们的意愿终止服务。


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

但是,如果您希望在从最近的任务中删除后停止应用程序的后台服务,则需要进行以下操作:

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");
    }
}

现在在 AndroidManifest.xml 中声明服务。
<service android:name=".CustomService" android:stopWithTask="false" />

android:stopWithTask="false"会在onTaskRemoved()上回调,因此请在那里处理停止服务。


0

当应用程序从最近列表中清除时,请保持服务运行,用户可以通过通知栏上的按钮完全停止音频和服务,就像这样: 这里有一张图片 -> QQ音乐


0
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" />

然后在您的活动上启动此服务

startService(new Intent(getBaseContext(), OnClearFromRecentService.class));

现在,每当您从Android最近的应用程序中清除您的应用程序时,就会执行此onTaskRemoved()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接