2015-08-19 2 views
3

У меня возникла следующая проблема: мне нужно начать работу со службы. Очень важно, чтобы служба ожидала результата от операции до, продолжая следующий метод.Запуск действия из службы и ожидание результата

В настоящее время у меня есть что-то вроде этого:

startActivity(new Intent(this, GoogleAuthHelperActivity.class), FLAG_ACTIVITY_NEW_TASK); 
//code should wait for the result of the GoogleAuthHelperActivity before continuing 
GoogleAuthHelperActivity.apiClient.isConnected();//gives nullpointer 

у меня такая же проблема с аутентификации в API Dropbox, так что мне нужно общее решение.

Любые идеи, как это решить?

ответ

2

В Сервисе нет эквивалента startActivityForResult, поэтому вам нужно сворачивать самостоятельно.

Первый вариант:

Вы можете использовать несколько стандартных инструментов Java для этого, как Object.wait/Object.notify, которые требуют ссылку на общий объект.

Например, объявите где:

public static final Object sharedLock = new Object(); 

и в службе сделать:

startActivity(new Intent(this, GoogleAuthHelperActivity.class), FLAG_ACTIVITY_NEW_TASK); 
synchronized (sharedLock) { 
    sharedLock.wait(); 
} 

и в деятельности:

// do something upon request and when finished: 
synchronized (sharedLock) { 
    sharedLock.notify(); 
} 

Есть другие более сложные классы для этого в пакете java.util.concurrent, который вы можете использовать для этого. Однако будьте осторожны, чтобы службы выполнялись в том же потоке, что и Activity, поэтому , если вы не запустите новую тему из Сервиса, тогда это не сработает.

Другая возможная проблема заключается в том, что вы не можете предоставить ссылку на объект между ними двумя (потому что они работают в разных процессах). Затем вы должны сигнализировать о завершении другим способом.

Второй вариант:

Вы можете разделить ваш код обслуживания в двух частях (до и после деятельности). Запустите действие и отправьте новое намерение службе, когда вы закончите. После получения этой второй услуги вы продолжите вторую часть.

+0

Я реализовал свой первый вариант, так как для этого потребовался наименьший рефакторинг – user2810895

0

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

public interface MyCallBackNotifier { 
    public void notify(); 
} 

Продлить этот интерфейс из основного класса, где вы начали ваш сервис, как это ...

public class MainActivity extends Activity implements MyCallBackNotifier { 

    private YourService service; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     service = new YourService(this); 
     service.start();  // Ant method that you call like start(); 
    } 


    @Override 
    public void notify() { 
      //this is the place where you have to start other activity or do any other process 
    } 
} 

И в своем классе обслуживания вы должны сделать некоторые вещи, как это ...

public class YourService { 

    private MyCallBackNotifier myCallBackNotifier; 

    public YourService(MyCallBackNotifier myCallBackNotifier) { 
     this.myCallBackNotifier = MyCallBackNotifier; 
    } 


    public void start() { 

     // Do what so ever you want to do and its will be better to use Asynctask to do background task 

     myCallBackNotifier.notify();  // This will call that function in your MainActivty you can pass parameters as well if you want se send some data back to MainActivity 

    } 

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