2015-02-20 2 views
0

У меня есть андроид приложение с активностью (Activity A), который показывает изображение в течение 3 секунд (экран-заставки) и после этого основной деятельности (активности B) начнет.Начало намерения услуги от одного вида деятельности и отправить результат на другие

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

То, что я хочу, чтобы запустить службу от Activity A и отправить результат на активность B показать некоторые результаты пользователю. Проблема в том, что у меня нет экземпляра Деятельность B в Деятельность A для отправки ResultReceiver экземпляра в IntentService.

Как я могу это сделать?

У меня есть вложенный класс в Деятельность B, которая распространяется ResultReceiver.

+0

следовать этому ..http: //stackoverflow.com/questions/10334901/how-to-get-results-from-an-intentservice-back-into-an-activity – Radhey

ответ

0

Похоже, вам нужна модель данных для хранения данных между действиями.

Одним из решений было бы создание статического класса или использование шаблона одноэлементного дизайна. Это может привести к результату службы. Вы инициализируете это в действии А и запускаете сервис перед запуском цели для действия B

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

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

// ----------- класс для хранения ваших данных Пункт -----------

public class DataItem { 

     private Integer id = -1; 

     // My Data stuff 
     public Integer getId() { 
      return this.id; 
     } 
    } 

// ------- ---- Интерфейс присоединиться все вместе -----------

import java.util.ArrayList; 

    public interface NotifiyDataInterface { 

     public void completedDataLoad(ArrayList data, String status); 

    } 

// ----------- Singleton класс для datafetching ---- -------

public class DataFetcher { 

     static DataFetcher _instance = null; 

     ArrayList<NotifiyDataInterface> _callBackList = null; 
     ArrayList<DataItem> _cachedData = null; 
     String _dataStatus = ""; 

     public DataFetcher() { 
      _callBackList = new ArrayList<NotifiyDataInterface>(); 
     } 

     public static DataFetcher getInstance() { 

      if (DataFetcher._instance == null) { 
       DataFetcher._instance = new DataFetcher(); 
      } 

      return _instance; 
     } 


     public void fetchData(NotifiyDataInterface _callBack) { 

      if (_cachedData != null) { 
       _callBack.completedDataLoad(this._cachedData, this._dataStatus); 
       return; 
      } 

      // Add to the call back list 
      this._callBackList.add(_callBack); 

      // Code to call your service to get data 
      //TODO: Add code to call your service 

     } 


     public void dataLoadComplete(ArrayList<DataItem> _newItems, String _fetchStatus) { 
      // Called from the service on a completed data load 

      this._cachedData = _newItems; 
      this._dataStatus = _fetchStatus; 

      NotifiyDataInterface _item = null; 

      for (int i = 0; i < _callBackList.size(); i++) { 
       _item = _callBackList.get(i); 
       _item.completedDataLoad(this._cachedData, this._dataStatus); 
      } 

      // Clear out the call back list 
      _callBackList.clear(); 
     } 

    } 

// ----------- Класс для деятельности B -----------

public class ActivityB extends ActionBarActivity implements NotifiyDataInterface { 

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

     // Get the single instance from the singleton pattern 
     DataFetcher dataFetcher = DataFetcher.getInstance(); 
     dataFetcher.fetchData(this); 
    } 

    // Here is where you call back is fired 
    public void completedDataLoad(ArrayList data, String status) { 
     //TODO: Your Code to call on data load here 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.layout.activity_b, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

}

+0

Что если активность B была успешно создана, но служба все еще работает? Я хочу что-то вроде ResultReceiver в действии B, поэтому всякий раз, когда служба завершается, получатель автоматически срабатывает. –

+0

Вам необходимо реализовать интерфейс, который имеет гарантированную функцию. Перейдите в Activity B в качестве справки. Новый класс вызовет функцию, когда данные будут доступны. Если данные уже доступны, вы получаете обратный вызов экземпляра, и если он не будет делать это, когда он станет доступен. Если вам нравится, я могу выбить маленький код, чтобы показать вам? – JodiMiddleton

+0

Да, я ценю это. –