Если вы не можете реализовать Parcelable
или Serializable
, остается только одна опция: пропуск объекта через глобальное состояние.
Использование статических полей
Добавление статического полявведите RandomClass
до DummyParcelableObject
, например, randomClassStatic
.Установите его непосредственно перед запуском сервиса:
// Start the service.
DummyParcelableObject mObj = new DummyParcelableObject(new RandomClass(2019));
Intent serviceIntent = new Intent(MainActivity.this, SampleService.class);
serviceIntent.putExtra("myObj", mObj);
DummyParcelableObject.randomClassStatic = mObj.getRandomClass();
startService(serviceIntent);
Затем получите его сразу после запуска сервиса в onStartCommand()
:
DummyParcelableObject obj = intent.getParcelableExtra("mObj");
obj.setRandomClass(DummyParcelableObject.randomClassStatic);
DummyParcelableObject.randomClassStatic = null;
Вам необходимо определить getRandomClass()
и setRandomClass()
соответственно для получения / настройки mRandomClass
.
Обратите внимание, что это не самое безопасное, что нужно сделать в отношении параллелизма, жизненных циклов объектов и т. д. *
Использование класса Application
Это можно использовать, только если у вас есть доступ к Activity
или Service
на обоих концах.
Подкласс Application
и добавьте к нему поле типа RandomClass
.Это будет служить реле.Определите публичные методы для получения / установки этого поля (например, getRandomClass()
и setRandomClass()
).Не забудьте указать свой подкласс Application
в манифесте, как описано здесь .Перед запуском службы:
// Start the service.
DummyParcelableObject mObj = new DummyParcelableObject(new RandomClass(2019));
Intent serviceIntent = new Intent(MainActivity.this, SampleService.class);
serviceIntent.putExtra("myObj", mObj);
((MyApplication) getApplication()).setRandomClass(mObj.getRandomClass());
startService(serviceIntent);
Затем для извлечения объекта после запуска службы, все еще в onStartCommand()
:
DummyParcelableObject obj = intent.getParcelableExtra("mObj");
obj.setRandomClass(((MyApplication) getApplication()).getRandomClass());
DummyParcelableObject.randomClassStatic = null;
Преимущество в том, что не используется статическое поле,но все равно может быть источником ошибок, если с ними плохо обращаться (безопасность потоков, никаких проверок на недействительность,…).