Запустите службу намерений из одного действия и отправьте результат другому

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

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

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

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

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


person Hamidreza Salehi    schedule 20.02.2015    source источник
comment
следуйте этому ..stackoverflow.com/questions/10334901/   -  person Radhey    schedule 20.02.2015


Ответы (1)


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

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

Затем в действии 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 для выборки данных -----------

    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);
    }

}

person JodiMiddleton    schedule 20.02.2015
comment
Что, если действие B успешно создано, но служба все еще работает? Я хочу что-то вроде ResultReceiver в действии B, поэтому всякий раз, когда служба завершает работу, приемник автоматически срабатывает. - person Hamidreza Salehi; 20.02.2015
comment
Вам нужно будет реализовать интерфейс, который имеет гарантированную функцию. Передайте действие B в качестве эталона. Новый класс будет вызывать вашу функцию, когда данные будут доступны. Если данные уже доступны, вы получите обратный вызов экземпляра, а если нет, он сделает это, когда станет доступным. Если хотите, я могу набросать небольшой код, чтобы показать вам? - person JodiMiddleton; 20.02.2015
comment
да, я ценю это. - person Hamidreza Salehi; 20.02.2015
comment
Код добавлен. Я не тестировал его, но показывает идею наличия общего обработчика модели/данных между классами. Вы можете вызвать тот же DataFetcher.fetchData из Activity A и просто проигнорировать там результаты. - person JodiMiddleton; 20.02.2015
comment
Спасибо. Я буду смотреть в него. и дайте вам знать - person Hamidreza Salehi; 21.02.2015