gpt4 book ai didi

android - API>25 中的前台服务在应用程序运行(可见)时是否强制通知

转载 作者:行者123 更新时间:2023-12-05 00:16:33 26 4
gpt4 key购买 nike

从 stackoverflow 和许多博客中,我确信在 API>25 中,前台服务永远不会在没有通知的情况下运行。但我仍然感到困惑,当应用程序在屏幕上运行或可见时,通知是否是强制的。例如。当用户站在应用程序内时无需通知。 那么这可以在应用运行时删除通知吗?在服务级别

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
......
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

Notification.Builder builder = new Notification.Builder(this, ANDROID_CHANNEL_ID)
.setContentTitle(getString(R.string.app_name))
.setContentText(text)
.setAutoCancel(true);

Notification notification = builder.build();
startForeground(1, notification);

}
return START_NOT_STICKY;
}

Activity 中

Intent myService = new Intent(this, MyService.class);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(myService);
} else {
startService(myService);
}

最佳答案

在前台服务运行时无法删除通知,但可以将前台服务更改回“常规”服务。这消除了对通知的需要。其实用的函数,

stopForeground(boolean removeNotification)

...包含一个用于此目的的 removeNotification 参数。您可以通过交替调用 startForeground()stopForeground(),按需将服务从“前台”切换为“常规”。

如果不清楚,只要至少有一个 Activity 处于“已启动”状态,您可能就需要调用 stopForeground()。这是您必须手动跟踪的事情。然后,当“已启动” Activity 的数量达到 0 时,您将调用 startForeground()

编辑

一种方法是使用绑定(bind)服务。然后,您可以在需要时轻松调用 stopForeground()

假设您有一个 Activity。您可以将其绑定(bind)到服务(请参阅 this doc 或使用 one of these examples )。那么您的 onServiceConnected() 函数可能如下所示(改编自 Google 示例):

//MyActivity.java:

@Override
public void onServiceConnected(ComponentName className, IBinder service) {
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mService.stopForeground(true); //This makes the notification go away
bound = true;
}

...

@Override
protected void onStart() {
super.onStart();
// Bind to the service
bindService(new Intent(this, MyService.class), this, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
super.onStop();
// Unbind from the service
if (bound) {
Notification.Builder builder = new Notification.Builder(this, ANDROID_CHANNEL_ID)
.setContentTitle(getString(R.string.app_name))
.setContentText(text)
.setAutoCancel(true);

Notification notification = builder.build();
mService.startForeground(1, notification); //This brings the notification back! Service is already running, and continues to run.

unbindService(this);
bound = false;
}
}

关于android - API>25 中的前台服务在应用程序运行(可见)时是否强制通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58928085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com