2016-12-06 2 views
0

Я начинаю новый Service, чтобы загрузить файл базы данных в Activity, а также у меня есть Fragment внутри Activity, который использует данные из загруженного файла базы данных для настройки его макета. Итак, есть ли способ или способ узнать, что IntentService закончил загрузку, а затем я могу прикрепить Fragment к Activity.Обновление макета после загрузки

Intent intent = new Intent(StartActivity.this, DownloadService.class); 
startService(intent); 
getSupportFragmentManager().beginTransaction().replace(R.id.startContainer,new ChartFragment()).commit(); 

ответ

0

Использовать BroadcastReceiver. Как сказал в своем ответе @HendraWD, есть много других способов получить уведомление о завершении загрузки, вы можете попробовать BroadcastReceiver в вашем случае.

Итак, внутри вашего Activity создайте BroadcastReceiver вот так.

private BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     // Launch your Fragment here 
    } 
}; 

onReceive Проверьте функции вашего BroadcastReceiver. Функция onReceive будет вызываться, когда загрузка завершится, если вы зарегистрируете BroadcastReceiver, а затем правильно сообщите об этом. Я добавляю здесь пример кода.

В функции onCreate вашего Activity зарегистрируйтесь BroadcastReceiver.

registerReceiver(mReceiver, new IntentFilter("DOWNLOAD_COMPLETE")); 

Теперь в функции onDestroy в вашем Activity разрегистрировать приемник.

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

Теперь из Service вы начали, когда загрузка будет завершена, вы, возможно, потребуется уведомить обратно в Activity об этом. Итак, вам нужно отправить трансляцию с вашего Service следующим образом.

sendBroadcast(new Intent("DOWNLOAD_COMPLETE")); 

Надеюсь, что это поможет.

+0

Спасибо, что решил проблему, но она все еще не понимает, что я должен делать. – Nsnik

+0

Это просто. Вам необходимо иметь приемник для продолжения прослушивания, когда загрузка будет завершена, и когда загрузка будет закончена, вам просто нужно отправить широковещательную передачу в приемник. Как только приемник получает широковещательную передачу, вызывается функция 'onReceive'. –

+0

Никогда не регистрируйтеReceiver на 'onDestroy'! Это никогда не будет называться – HendraWD

0

Есть несколько способов уведомить пользовательский интерфейс из службы.

  1. BroadcastReceiver

  2. Публикация/подписка автобус события (Otto, EventBus)

  3. Observable Pattern (RxJava, RxAndroid)

Если вы не уверены в том, что каждый из то есть вы можете начать с просто BroadcastReceiver. Это стандартный способ, предоставляемый Android.

Вот простой пример, как это сделать. Ваша служба будет выглядеть следующим образом:

public class YourService extends IntentService { 

    public YourService() { 
     super("YourService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     //your process.. 

     //process done 
     Intent broadcastIntent = new Intent("Your filter"); 
     broadcastIntent.putExtra("param you want to pass", "value"); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent); 
    } 
} 

Вот ваша деятельность выглядит как

public class YourActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Intent intent = new Intent(YourActivity.this, YourService.class); 
     startService(intent); 
    } 

    BroadcastReceiver yourBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      //do something 
      Log.d(YourActivity.class.getSimpleName(), "broadcast receiver called"); 
     } 
    }; 

    @Override 
    protected void onStart() { 
     LocalBroadcastManager.getInstance(this).registerReceiver(yourBroadcastReceiver, new IntentFilter("Your filter")); 
     super.onStart(); 
    } 

    @Override 
    protected void onStop() { 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(yourBroadcastReceiver); 
     super.onStop(); 
    } 
} 

Я использую LocalBroadcastManager здесь, потому что это более эффективно и надежно

1

Зарегистрируйте BroadcastReceiver в вашей деятельности что-то вроде:

BroadcastReceiver myReceiver = new BroadcastReceiver() { 
    @Override 
public void onReceive(Context context, Intent intent) { 
    // do my stuff 
} 
}; 

registerReceiver(myReceiver , new IntentFilter("com.myapp.DOWNLOADCOMPLETE")); 

Тогда в службе отправить радиопередачу:

// use intent to send broadcast 
Intent i = new Intent("com.myapp.DOWNLOADCOMPLETE"); 
sendBroadcast(i); 

Вы также можете putExtras на ваши намерения, если вам нужно передать несколько значений.

Учебник по поиску в Google Android и обработка фоновых изображений можно найти here.

+0

Спасибо за ссылку на учебное пособие – Nsnik

+0

Добро пожаловать в Nsnik. –

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