当活动可见时,隐藏前台服务的通知

他们是以前台服务的方式启动服务,并在活动可见时隐藏通知

考虑一个音乐播放器,而应用程序打开,你不需要通知(即button),但是每当音乐播放器在后台,通知应该显示。

我知道如何做到这一点,如果我不在前台运行我的服务…但在前台运行时,服务本身需要通知并显示它,我不能自己pipe理通知…

我该如何解决这个问题?

Solutions Collecting From Web of "当活动可见时,隐藏前台服务的通知"

你可以这样做。 此方法的一个先决条件是您的活动必须绑定服务。

首先你开始服务的前景。

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

然后在您的活动中,您绑定和解除绑定服务,如下所示。 BIND_ADJUST_WITH_ACTIVITY对于保持服务在绑定到可见活动时保持活动非常重要。

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

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

 @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() } 

在绑定服务时,您必须考虑Android应用的规则。 如果绑定未启动的服务,则除非BIND_AUTO_CREATE标志指定了BIND_AUTO_CREATE标志,否则服务将不会自动启动。

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

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

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

调用startService()已经启动的服务对它没有任何影响,因为我们不重写onCommand()方法。

使用以下步骤:

1.使用ActivityManager获取当前的包名称(即活动在最上面)。

2.检查你的应用程序是否不显示通知

3.如果不是您的应用程序,则显示通知。

 ActivityManager manager =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(1); String topActivityName = tasks.get(0).topActivity.getPackageName(); if(!(topActivityName.equalsIgnoreCase("your package name"))){ //enter notification code here }