Лучшим подходом было бы использовать LocalBroadcastManager
для уведомления Activity
от Service
.
Шаг 1: Отправка местной трансляции из вашего сервиса
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// do your operation here(create worker thread for blocking operations)
sendLocalBroadCast() //call this method as soon as above operations completes
return Service.START_NOT_STICKY;
}
}
private void sendLocalBroadCast() {
Intent intent = new Intent("MY_SERVICE_NOTIFICATION");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
Обратите внимание, что система вызывает onStartCommand (Intent intent, int flags, int startId) в главном потоке вашей службы. Основной поток службы - это тот же поток, в котором выполняются операции пользовательского интерфейса для операций, выполняющихся в том же процессе. Вы всегда должны избегать остановки цикла событий основного потока. При выполнении длительных операций, сетевых вызовов или интенсивного дискового ввода-вывода вы должны запустить новый поток или использовать AsyncTask
Step2: Заставьте свою активность слушатьэта трансляция
public class MyActivity extends Activity{
BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// you can dismiss your progress dialog here. This method will be called when we receive broadcast from service after the service operation is completed
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
//register for listening to "MY_SERVICE_NOTIFICATION" event
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver,
new IntentFilter("MY_SERVICE_NOTIFICATION"));
}
@Override
protected void onDestroy() {
super.onDestroy();
// remove the receiver
LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
}
}