前台服务通知始终显示至少 5 秒
Foreground service notification always shown for at least 5 seconds
我在 Android 9.
上测试前台通知时注意到一些非常奇怪的行为
情况:我有一些前台服务,我不知道他们需要多长时间运行因为,无论是 1 秒还是整分钟。最后,当服务完成后,它会调用stopForeground(true)
。这曾经在所有 Android 8、9 和 10 设备上运行良好,其中 stopForeground(true)
,即使立即调用,也始终可靠地删除通知。
问题:在 Fairphone 3 上进行测试(我希望其他人在其他设备上遇到过这个问题,因为对我来说这是未在任何模拟器或其他设备上发生),stopForeground
未按预期工作。通知不会立即删除通知,而是始终显示 至少 5 秒 ,即使我立即致电 stopForeground
也是如此。这 5 秒恰好是可怕错误 Context.startForegroundService() did not then call Service.startForeground() - still a problem 的确切 5 秒限制。很奇特!使用下面的代码可以很容易地重现并检查您的设备是否受到影响。
里面 AndroidManifest.xml
:
<service
android:name="<your package name>.TestService"
android:exported="false" />
Class TestService.java
:
package <your package name>;
import android.annotation.TargetApi;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
@TargetApi(Build.VERSION_CODES.O)
public class TestService extends Service {
@Override
public void onCreate() {
super.onCreate();
showNotification();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
showNotification();
stopForeground(true);
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void showNotification() {
String channelId = "TEST";
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager.getNotificationChannel(channelId) == null)
notificationManager.createNotificationChannel(new NotificationChannel(channelId, "TEST NOTIFICATIONS", NotificationManager.IMPORTANCE_DEFAULT));
startForeground(1, new NotificationCompat.Builder(this, channelId).setContentText("TEST NOTIFICATION").build());
}
}
最后,只需通过 startForegroundService(new Intent(this, TestService.class));
启动服务(例如单击按钮)
有没有其他人遇到过这个问题或者能够用上面的代码重现这个问题?考虑到我正在 Android 9 上进行测试,并且行为仅仅因为 OEM 而不同,我该如何修复甚至只是调试它?
最新的安全补丁声称这是正常行为:
https://issuetracker.google.com/issues/147792378
但是我不确定为什么它已经在 Android 9.
上发生了
我在 Android 9.
上测试前台通知时注意到一些非常奇怪的行为情况:我有一些前台服务,我不知道他们需要多长时间运行因为,无论是 1 秒还是整分钟。最后,当服务完成后,它会调用stopForeground(true)
。这曾经在所有 Android 8、9 和 10 设备上运行良好,其中 stopForeground(true)
,即使立即调用,也始终可靠地删除通知。
问题:在 Fairphone 3 上进行测试(我希望其他人在其他设备上遇到过这个问题,因为对我来说这是未在任何模拟器或其他设备上发生),stopForeground
未按预期工作。通知不会立即删除通知,而是始终显示 至少 5 秒 ,即使我立即致电 stopForeground
也是如此。这 5 秒恰好是可怕错误 Context.startForegroundService() did not then call Service.startForeground() - still a problem 的确切 5 秒限制。很奇特!使用下面的代码可以很容易地重现并检查您的设备是否受到影响。
里面 AndroidManifest.xml
:
<service
android:name="<your package name>.TestService"
android:exported="false" />
Class TestService.java
:
package <your package name>;
import android.annotation.TargetApi;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
@TargetApi(Build.VERSION_CODES.O)
public class TestService extends Service {
@Override
public void onCreate() {
super.onCreate();
showNotification();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
showNotification();
stopForeground(true);
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void showNotification() {
String channelId = "TEST";
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager.getNotificationChannel(channelId) == null)
notificationManager.createNotificationChannel(new NotificationChannel(channelId, "TEST NOTIFICATIONS", NotificationManager.IMPORTANCE_DEFAULT));
startForeground(1, new NotificationCompat.Builder(this, channelId).setContentText("TEST NOTIFICATION").build());
}
}
最后,只需通过 startForegroundService(new Intent(this, TestService.class));
有没有其他人遇到过这个问题或者能够用上面的代码重现这个问题?考虑到我正在 Android 9 上进行测试,并且行为仅仅因为 OEM 而不同,我该如何修复甚至只是调试它?
最新的安全补丁声称这是正常行为: https://issuetracker.google.com/issues/147792378
但是我不确定为什么它已经在 Android 9.
上发生了