我检查了大多数应用程序,包括Google Play音乐,在应用程序从最近清除时仍将服务保持运行。另一方面,有些应用程序会停止音频并关闭服务(我只发现Spotify这样做)。
我想知道处理这个问题的正确方式是什么?虽然大多数应用程序都保持服务开启,但用户似乎希望音频停止,并且通知与应用程序一起从状态栏消失。
这里是否有正确的方法?
既然这是一个观点问题,我作为一名开发人员和智能手机的重度用户(现在谁不是呢),我将给出自己的看法:
简而言之:让它保持运行状态。
===============================
更长的版本
使用手机作为音乐播放器的目的是在您进行其他活动时(例如跑步、浏览、发送短信,甚至为通过扬声器连接的其他人播放音乐并成为您小组的“DJ”)提供音频。您很少会将音乐播放器用作主要任务,我希望您在像尝试弄清歌词或观看视频剪辑(因此,您将使用YouTube)这样的事情时使用它。因此,我认为您的音乐播放器应该具有与您的手机其他活动不同的生命周期。
想象一下,当您在手机上处理无关的事情时,突然停止播放音乐给其他人听的噩梦。
但是,当您提到“似乎用户希望音频停止并且通知与应用程序一起从状态栏消失”时,您说得有道理。我不会把整个陈述看作真实,而是提取要点:用户希望轻松停止他们的音乐应用程序。
在这种意义上,为了优化用户体验,您应该尽可能地简化停止播放的步骤。首先想到的最好的方法是在通知栏扩展版本(甚至是紧凑版本)中添加一个漂亮的“X”按钮。用户可以直接从状态栏停止播放,而不必将应用程序带到前台。请保持其运行,并使用通知。
这一切都在名称中。 根据Android开发者,
“最近使用的活动和任务列表(也称为概述屏幕、最近任务列表或最近应用程序)是一个系统级用户界面,列出了最近访问的活动和任务。”
从此列表中滑动任务只会将其从列表中移除,而不会停止执行。
通知(特别是在Oreo下)是您让用户知道您仍在运行服务的地方。使用通知允许他们重新打开任务,然后根据他们的意愿终止服务。
但是,如果您希望在从最近的任务中删除后停止应用程序的后台服务,则需要进行以下操作:
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");
}
}
<service android:name=".CustomService" android:stopWithTask="false" />
android:stopWithTask="false"会在onTaskRemoved()上回调,因此请在那里处理停止服务。
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()方法。