У меня была похожая проблема, и это то, что я сделал.
MyService
и MyActivity
имеют общую часть, MyEngine
, но в этих двух случаях поведение должно быть немного другим.
Одна вещь, которая отличается от других, - это настройка, но эта настройка выполняется в классах MyService
и MyActivity
.
Еще одна вещь, которая отличается для активности, и служба выполняется через прослушиватель: MyEngine
определяет интерфейс MyEngine.Listener
, тогда как MyService
и MyActivity
предоставляют движку различные реализации этого интерфейса.
Итак, если вы хотите передать логическое значение, возможны два метода:
// Method 1: different initialization
class MyEngine {
MyEngine(boolean isService) { ... }
}
class MyActivity extends Activity {
private MyEngine = new MyEngine(false);
...
}
class MyService extends Service {
private MyEngine = new MyEngine(true);
...
}
// Method 2: callbacks
class MyEngine {
interface Listener {
boolean isService();
}
private Listener mListener;
MyEngine(Listener listener) { mListener = listener; }
}
class MyActivity extends Activity {
private mListener = new MyEngine.Listener() {
boolean isService() { return false; }
}
private MyEngine = new MyEngine(mListener);
...
}
class MyService extends Service {
private mListener = new MyEngine.Listener() {
boolean isService() { return true; }
}
private MyEngine = new MyEngine(mListener);
...
}
Примечание.
Логическое значение, используемое в приведенном выше примере, бесполезно в реальном мире: если вы хотите использовать, скажем, разные имена файлов журнала, лучше передать имя файла, а не логическое. Если вы хотите выполнить два разных действия, лучше иметь одну функцию слушателя с двумя реализациями.
Конечно, можно передать Context
и проверить, является ли он дочерним элементом Activity
или Service
, или получить имя текущего процесса, но эти вещи являются реализацией для Android. детали, и лучше не зависеть от них, если это не является абсолютно необходимым.