在测试Android 9上的前台通知时,我注意到了一些非常奇怪的行为。
情况:我有一些前台服务,我不知道它们需要运行多长时间,可能是1秒或整整一分钟。最后,当服务完成时,它会调用stopForeground(true)
。在所有Android 8、9和10设备上,这都可以正常工作,即使立即调用stopForeground(true)
,也总是可靠地删除通知。
问题:测试Fairphone 3时(我希望其他人也在其他设备上遇到了这个问题,因为对我来说,在任何模拟器或其他设备上都没有出现这种情况),stopForeground
没有如预期般工作。通知未能立即移除,即使我立刻调用stopForeground
,通知仍然会显示至少5秒。这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" />
类 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());
}
}
最后,只需通过启动服务(例如在按钮点击时)。
是否有其他人遇到了这个问题或者能够用上面的代码重现它?考虑到我正在 Android 9 上进行测试,并且由于 OEM 的不同行为有所不同,我该如何修复或甚至只是调试它?
Service
还是IntentService
完全取决于使用情况,不在本问题的范围内。本问题旨在提供一个最小可重现示例。我尝试将上面的片段切换到IntentService
和onHandleIntent
,但效果都是一样的。 - 0101100101stopForeground()
开始执行,并且在该函数内部阻塞了约5秒钟? - greeble31