2016-01-05 3 views
1

Я пытаюсь создать кнопку, которая изменит фильтр прерывания (None, Priority, All) в Android Lollipop. Когда я нажимаю кнопку, журнал говорит Notification listener service not yet bound.. Служба начинается, поэтому я предполагаю, что я пытаюсь связать ее неправильно? Я получаю журнал "NLS Started", но не "NLS Bound". Вот мой код:Android-сервис еще не связан

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); 
     if(notifs.isBound()) { 
      Log.d("NOTIFS", "NLS Bound"); 
     } 

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

подключение Сервис работает с bindService() только метод. Поэтому, если вы получаете «NLS Started», это значит, что был выполнен код из метода onServiceConnected() для подключения к службе, который указывает, что ваша служба была успешно связана с вашей соответствующей деятельностью.

Что касается «NLS Bound», иногда соединение службы занимает второе или два, чтобы связать службу с активностью. Эта задержка не остановит работу вашего кода, т. Е. Оператор if ниже метода bindService() будет выполнен даже до того, как служба будет связана с вашей деятельностью. По этой причине мы используем сервисное соединение. Сервисное соединение получает объект службы при его создании и также информируется, если служба уничтожена. См. Следующую ссылку для получения более подробной информации: -

http://developer.android.com/reference/android/content/Context.html#bindService(android.content.Intent,android.content.ServiceConnection,int)

Смежные вопросы