gpt4 book ai didi

android - 在 Activity 可见时隐藏前台服务的通知

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:41:25 34 4
gpt4 key购买 nike

他们是将服务作为前台服务启动并在 Activity 可见时隐藏通知的方法吗?

考虑一个音乐播放器,当应用程序打开时,您不需要通知(即按钮),但只要音乐播放器在后台,就应该显示通知。

我知道,如果我不在前台运行我的服务,该怎么做...但是在前台运行时,服务本身需要通知并显示它,我无法自己管理通知。 ..

我该如何解决这个问题?

最佳答案

你可以这样做。此方法的一个先决条件是,您的 Activity 必须绑定(bind)服务。

首先你启动服务前台。

private Notification mNotification;

public void onCreate() {
...
startForeground(1, mNotification);
}

然后在您的 Activity 中绑定(bind)和取消绑定(bind)服务,如下所示。 BIND_ADJUST_WITH_ACTIVITY 对于在绑定(bind)到可见 Activity 时保持服务 Activity 很重要。

public void onStart() {
...
Intent intent = new Intent(this, PlayerService.class);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
}

public void onStop() {
...
unbindService(mConnection);
}

现在这里是最后的过去。当至少一个客户端连接到该服务时,您停止前台,并在最后一个客户端断开连接时启动前台。

@Override
public void onRebind(Intent intent) {
stopForeground(true); // <- remove notification
}

@Override
public IBinder onBind(Intent intent) {
stopForeground(true); // <- remove notification
return mBinder;
}

@Override
public boolean onUnbind(Intent intent) {
startForeground(1, mNotification); // <- show notification again
return true; // <- important to trigger future onRebind()
}

绑定(bind)服务时,您必须考虑 Android 应用的规则。如果您绑定(bind)一个未启动的服务,该服务将不会自动启动,除非您指定 BIND_AUTO_CREATE 标志以及 BIND_ADJUST_WITH_ACTIVITY 标志。

    Intent intent = new Intent(this, PlayerService.class);
bindService(intent, mConnection, BIND_AUTO_CREATE
| BIND_ADJUST_WITH_ACTIVITY);

如果服务是在自动创建标志打开的情况下启动的,并且最后一个客户端解除绑定(bind),那么服务将自动停止。如果您想保持服务运行,您必须使用 startService() 方法启动它。基本上,您的代码将如下所示。

    Intent intent = new Intent(this, PlayerService.class);
startService(intent);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);

为已经启动的服务调用 startService() 对其没有影响,因为我们没有覆盖 onCommand() 方法。

关于android - 在 Activity 可见时隐藏前台服务的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22066531/

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