#android #android-fragments #android-activity #android-service #android-service-binding
#Android #android-фрагменты #android-активность #android-сервис #android-service-binding
Вопрос:
Мой вопрос точно такой, как указано в названии. Почему службы, привязанные к Android, всегда загружаются после завершения всего жизненного цикла фрагмента? Связанные службы предназначены для загрузки в действие, содержащее фрагмент, так почему же служба доступна только после создания фрагмента? Иногда я хочу использовать сервис для заполнения данных во фрагменте, и мне нужно было вернуться к «взломам», чтобы получить доступ к сервису.
Я загружаю подключения к службам в методе onCreate() в activity и запускаю службу в OnStart(), как описано в документации https://developer.android.com/guide/components/bound-services но затем я должен создать метод «загрузки» во фрагменте, чтобы загружать материал после завершения загрузки сервиса.
private void loadServiceConnections()
{
metronomeConnection = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
MetronomeService.LocalBinder localBinder = (MetronomeService.LocalBinder) service;
metronomeService = localBinder.getService();
metronomeService.setLinkManager(notificationsMetronomeLinkManager);
metronomeService.setListener(myFragment);
metronomeFragment.onServiceLoading(); //this is the method that executes inside the fragment once the service is available.
metronomeServiceIsBound = true;
if (loaded amp;amp; metronomeService.isMetronomePlaying())
metronomeRunning = true;
}
@Override
public void onServiceDisconnected(ComponentName name)
{
metronomeServiceIsBound = false;
}
};
}
Комментарии:
1. «связанные службы всегда загружаются после завершения всего жизненного цикла фрагмента?» — Обратные вызовы в
ServiceConnection
происходят независимо отActivity
Fragment
перехватов жизненного цикла or.2.
onServiceConnected
обратный вызов размещен в главном цикле, поэтому, к сожалению, он не блокируется и не будет выполняться до тех пор, пока методы жизненного цикла фрагментов, которые уже поставлены в очередь в главном цикле, не завершат выполнение.3. Спасибо, Павел! Итак, есть ли лучший способ вызвать метод внутри фрагмента, который зависит от службы?