6

Я пытаюсь связать службу, но onBind() всегда возвращает false.OnBind() on service всегда возвращает False - Android

Это код ServiceConnection -

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     // This is called when the connection with our service has been established, 
     // giving us the service object we can use to interact with our service. 
     mBoundService = ((ScheduleService.ServiceBinder) service).getService(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mBoundService = null; 
    } 
}; 

Это вызов bindService() -

boolean test = getApplicationContext().bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE); 

Это заявление службы в манифесте -

<service android:name=".Notifications.ScheduleService" android:enabled="true"/> 

Я прочитал предыдущие вопросы по теме и не смог найти ans wer (попробовал переключение контекста Activity с контекстом приложения, но это не помогло).

Я использую Frgments и ActionBarSherlock, а моя активность расширяет SlidingFragmentActivity (Вот почему я использую контекст приложения, что не помогает).

Edit - Это код службы я пытаюсь начать -

public class ScheduleService extends Service { 

    /** 
    * Class for clients to access 
    */ 
    public class ServiceBinder extends Binder { 
     public ScheduleService getService() { 
      return ScheduleService.this; 
     } 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i("ScheduleService", "Received start id " + startId + ": " + intent); 

     // We want this service to continue running until it is explicitly stopped, so return sticky. 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 

    // This is the object that receives interactions from clients. See 
    private final IBinder mBinder = new ServiceBinder(); 

    /** 
    * Show an alarm for a certain date when the alarm is called it will pop up a notification 
    */ 
    public void setAlarm(Calendar c) { 
     // This starts a new thread to set the alarm 
     // You want to push off your tasks onto a new thread to free up the UI to carry on responding 
     new AlarmTask(this, c).run(); 
    } 
} 

Любая помощь будет оценена. Благодарю.

+0

Я думаю, вы должны удалить .Notifications в манифесте. –

+0

Опубликуйте свой код реализации службы. – yorkw

+0

Я редактировал вопрос с реализацией. – Tofira

ответ

1

Что такое полное имя класса ScheduleService (т. Е. Включая полное имя пакета)?

Я спрашиваю, потому что в вашем файле AndroidManifest.xml, имя вашего сервиса является .Notifications.ScheduleService, что кажется немного странным:

Это говорит мне, что либо

  • (последнюю часть the) имя пакета содержит верхний регистр знак ... не очень хорошо.
    Я бы ожидал .notifications.ScheduleService, если это так.
  • ScheduleService определен в файле с именем Notifications.java. Я ожидал бы .Notifications$ScheduleService, если это так (знак доллара вместо периода).
1

Возможно, вы хотите отметить bindService() false? onBind() возвращение товара IBinder type.

Имейте в виду, что привязка к услуге занимает некоторое время. Если вы хотите выполнить какое-либо действие после завершения привязки, вы можете выполнить его в методе onServiceConnected().

public void onServiceConnected(ComponentName className, IBinder service) { 

    mBoundService = ((ScheduleService.ServiceBinder) service).getService(); 
    Calendar c = new Calendar(); 
    mBoundService.setAlarm(c); 
} 

Если вам нужно больше рекомендаций по этому вопросу, вам необходимо показать нам свой код операции.

0

Почему вы используете контекст приложения для связывания службы? Метод bindService вызывается через ContextWrapper. Возможно, это не проблема, но я бы обменивался контекстами через место, где вы связываете службу и где у вас есть соединение.

В вашем случае вместо

boolean test = getApplicationContext().bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE); 

Я бы сделать следующее

boolean test = bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE); 

Или, если вы хотите сохранить глобальный контекст, в рамках приложения, переместите все в файл приложения и вызова аналогично тому, как это было предложено выше.

Проблема может также быть в имени пакета вашего приложения и объявлении вашей службы в вашем манифесте. Если вы не уверены, что хотите предоставить глобальный маршрут своей службе в манифесте.

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