Intereting Posts
Как включить функцию (2 пальца) увеличения / уменьшения изображения для android Android. Получение размера изображения из его идентификатора ресурса Тест-объявления AdMob отображаются только на английских устройствах Уничтожьте и перезапустите Activity с помощью библиотеки поддержки тестирования SENSOR_DELAY_GAME: сколько это? Белый цвет переднего плана TabWidget? Как создать «скрытое» приложение Android? IONIC Framework Проблема производительности мобильных приложений Ошибка медиаплеер (-38,0), остановка, вызываемая в состоянии 4 Не может конвертировать из android.app.FragmentManager в android.support.v4.app.FragmentManager Сбой телефонной камеры при извлечении данных В Android, можно ли перехватить ключевые события во всем мире, прежде чем они достигнут вид ребенка, который имеет фокус? GCM / FCM: не принимать события, трансляция вызова вызова: result = CANCELED Android: Имитировать Wi-Fi в эмуляторе? Класс cast Exception в Android string.xml

Служба Android расширяет ResultReceiver для IntentService, как реализовать CREATOR?

Мое приложение использует Service который синхронизируется с внешним оборудованием в фоновом режиме. Поскольку служба работает в основном потоке, она делает любую тяжелую работу асинхронно с помощью IntentService. Ниже приведен минимальный пример кода для объяснения потока управления:

 public class MyService extends Service { private final Handler handler = new Handler(); void someMethodDoesCallBarAsynchronously(){ Intent i = new Intent(this, MyIntentService.class); i.putAction(ACTION_FOO); i.putExtra(EXTRA_RECEIVER, new MyResultReceiver(handler)); startService(toGetScannerStatus); } void receivedFooResult(String bar){ //... } public class MyResultReceiver extends ResultReceiver{ public MyResultReceiver(Handler handler){ super(handler); } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); switch(resultCode){ case RESULT_CODE_FOO: receivedFooResult(resultData.getString(FOO_RESULT)); break; } } } } public class MyIntentService extends IntentService { public MyIntentService(){super("MyIntentService");} @Override protected void onHandleIntent(Intent intent) { switch (intent.getAction()) { case ACTION_FOO: ResultReceiver receiver = intent.getParcelableExtra(EXTRA_RECEIVER); Bundle bundle = new Bundle() bundle.putString(FOO_RESULT, foo()); receiver.send(RESULT_CODE_FOO, b); break; } } 

Теперь, спустя полгода и некоторые обновления, Android Studio жалуется, что MyResultReceiver реализует Parcelable, но не предоставляет поля CREATOR . Проблема одна, MyResultReceiver – это внутренний класс, поэтому я должен поместить его в собственный класс. Я не могу сделать его static потому что он должен содержать ссылку на MyService. Это все еще довольно просто:

 public class MyService extends Service { private final Handler handler = new Handler(); void someMethodDoesCallBarAsynchronously(){ Intent i = new Intent(this, MyIntentService.class); i.putAction(ACTION_FOO); i.putExtra(EXTRA_RECEIVER, new MyResultReceiver(this, handler)); startService(toGetScannerStatus); } void receivedFooResult(String bar){ //... } } public class MyResultReceiver extends ResultReceiver{ private final MyService myService; public MyResultReceiver(MyService s, Handler handler){ super(handler); this.myService = myService; } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); switch(resultCode){ case RESULT_CODE_FOO: myService.receivedFooResult(resultData.getString(FOO_RESULT)); break; } } } 

Теперь я могу добавить публичное статическое поле. Но как правильно использовать CREATOR?

 public class MyResultReceiver extends ResultReceiver { public static final Parcelable.Creator<MyResultReceiver> CREATOR = new Parcelable.Creator<MyResultReceiver>() { public MyResultReceiver[] newArray(int size) { return new MyResultReceiver[size]; } public MyResultReceiver createFromParcel(Parcel in) { // ??? } }; 

Если вы хотите: зачем это необходимо? Для чего он будет использоваться?

Solutions Collecting From Web of "Служба Android расширяет ResultReceiver для IntentService, как реализовать CREATOR?"

Ваша текущая архитектура слишком сложна imho: вы можете легко сделать это в одной Service но это зависит от вас, когда дело доходит до вашей проблемы: вам не нужно создавать какой-либо CREATOR поскольку то, что вы получили, является предупреждением lint, просто добавьте Аннотации SuppressLint следующим образом:

 @SuppressLint("ParcelCreator") public class MyResultReceiver extends ResultReceiver {