Android:服务'尚未绑定'但是调用onBind()?

时间:2016-01-06 03:13:44

标签: android android-activity android-service

我正在尝试制作一个按钮,用于更改Android Lollipop中的中断过​​滤器(无,优先,全部)。当我按下按钮时,日志显示W/NotificationListenerService[NotificationService]: Notification listener service not yet bound.并且不会更改中断过滤器。我收到"NLS Started""NLS Bound"日志。为什么它会给我这个警告?这是我的代码:

MainActivity.java

public class MainActivity extends Activity {
    private NotificationService notifs;
    private ServiceConnection connection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        notifs = new NotificationService();
        connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.d("NOTIF", "NLS Started");
                NotificationService.ServiceBinder binder = (NotificationService.ServiceBinder)service;
                notifs = binder.getService();
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.d("NOTIF", "NLS Stopped");
            }
        };
        Intent intent = new Intent(this, NotificationService.class);
        startService(intent);
        bindService(intent, connection, Context.BIND_AUTO_CREATE);

        final Button b = (Button) findViewById(R.id.b);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (notifs.getCurrentInterruptionFilter() == NotificationService.INTERRUPTION_FILTER_NONE) {
                    //set all
                    b.setBackground(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_ring_volume));
                    notifs.requestInterruptionFilter(NotificationService.INTERRUPTION_FILTER_ALL);
                } else if (notifs.getCurrentInterruptionFilter() == NotificationListenerService.INTERRUPTION_FILTER_PRIORITY) {
                    //set none
                    b.setBackground(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_ring_off));
                    notifs.requestInterruptionFilter(NotificationService.INTERRUPTION_FILTER_NONE);
                } else {
                    //set priority
                    b.setBackground(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_ring_priority));
                    notifs.requestInterruptionFilter(NotificationService.INTERRUPTION_FILTER_PRIORITY);
                }
            }
        });
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unbindService(connection);
        connection = null;
    }
}

NotificationService.java

public class NotificationService extends NotificationListenerService {
    private final IBinder binder = new ServiceBinder();
    private boolean isBound = false;

    public NotificationService() {
    }

    public class ServiceBinder extends Binder {
        NotificationService getService() {
            return NotificationService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        isBound = true;
        Log.d("NOTIF", "NLS Bound");
        return binder;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startid) {
        return START_STICKY;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("NOTIF", "Started");
        Toast.makeText(NotificationService.this, "NLS Started", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    public boolean isBound() {
        return isBound;
    }
}

1 个答案:

答案 0 :(得分:3)

使用以下方法替换服务中的onBind()方法:

@Override
public IBinder onBind(Intent intent) {
    isBound = true;
    String action = intent.getAction();
    Log.d("NOTIF", "onBind: " + action);

    if (SERVICE_INTERFACE.equals(action)) {
        Log.d("NOTIF", "Bound by system");
        return super.onBind(intent);
    } else {
        Log.d("NOTIF", "Bound by application");
        return binder;
    }
}

同时检查您的服务是否已在清单中声明,如documentation的概述所示。

如果您在清单中正确声明了您的服务,并且在Security / Sound& amp;通知,系统将使用操作NotificationListenerService.SERVICE_INTERFACE绑定到服务。对于此绑定请求,服务必须返回NotificationListenerService的绑定,即super.onBind(intent)