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

时间:2014-02-27 11:03:32

标签: android service notifications foreground

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

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

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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:10)

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

首先启动服务前台。

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);
}

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

@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_ADJUST_WITH_ACTIVITY标志,否则该服务不会自动启动。

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

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

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

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

答案 1 :(得分:2)

使用以下步骤:

1.使用ActivityManager获取当前包名称(即活动在顶部运行)。

2.检查您的申请是否未显示通知

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

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
}