Как создать сервис Android с помощью конструктора? - PullRequest
12 голосов
/ 03 апреля 2012

У меня есть служба со следующим конструктором:

public ShimmerService(Context context, Handler handler) {
    mHandler = handler;
}

Я хочу создать экземпляр этого класса обслуживания.У меня есть следующий код, но я не уверен, где передать параметр:

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder binder) {
        mShimmerService = ((ShimmerService.ShimmerConfigureBinder) binder)
                .getService();
        Toast.makeText(ConfigureShimmer.this,
                "Shimmer service has succesfully started.",
                Toast.LENGTH_SHORT).show();
    }

    public void onServiceDisconnected(ComponentName className) {
        mShimmerService = null;
    }
};

У меня есть все остальное, включая привязку, при запуске и так далее.Но я получаю сообщение об ошибке в приведенном выше коде:

04-03 19:06:10.285: E/AndroidRuntime(16837): java.lang.RuntimeException: Unable to instantiate service com.milanix.androidecg.services.ShimmerService: java.lang.InstantiationException: can't instantiate class com.milanix.androidecg.services.ShimmerService; no empty constructor

Как мне решить эту проблему?Где мне нужно будет передать параметр?Следующий код работает, но он скорее использует класс обслуживания как класс, а не как сервис:

mShimmerService = new ShimmerService(this, mHandler);

Ответы [ 6 ]

16 голосов
/ 03 апреля 2012

Вы не должны создавать сервисы (или действия, или широковещательные приемники) явно. Система Android делает это внутренне. Правильный способ построения сервиса - через startService() с намерением; не стесняйтесь добавлять дополнительные параметры к этому намерению.

РЕДАКТИРОВАТЬ: или bindService(). Тогда у вас есть варианты - либо создайте пользовательский интерфейс с AIDL, либо используйте raw transact().

1 голос
/ 03 апреля 2012

Сервис расширяет контекст, поэтому вам не нужно использовать его в качестве параметра в конструкторе, поскольку вы можете использовать тот же экземпляр.

Если у вас есть другие параметры, которые вы хотите передатьслужбу, я бы порекомендовал добавить их в намерение startService в качестве дополнений и получить их в методе service.onStartCommand.

0 голосов
/ 18 марта 2019
intent service = new Intent(current context, your service name.class);
`service.putExtra(key,value);`// put your sightly variable type
`service.setAction("StartDownload");`// action that will detect it onStartCommand

 current context.startService(service);

в службе, в onStartCommand:

if (intent.getAction().equals("StartDownload")) {
`intent.getExtras().getString(key)`;// string in this sample should be your variable type as you used in your code
//do what you want
    }`
0 голосов
/ 27 января 2017

Вместо передачи Handler (или любого другого объекта) в службу (что, кстати, невозможно), вы создаете и регистрируете BroadcastReceiver в своем классе Activity. Когда вам нужно вызвать функции-обработчики (или любые другие функции в другом объекте), отправьте широковещательную рассылку на зарегистрированный получатель (sendBroadcast). Вы также можете добавить дополнительные дополнительные параметры в намерение и обработать весь необходимый код напрямую из Activity в соответствии с параметрами.

Возможно, в этом случае ваш обработчик будет полностью удален (зависит от того, что вам на самом деле нужно). С широковещательными приемниками я не знаю, чтобы представить ситуацию, когда вам нужно будет передать какой-либо объект в службу. С другой стороны, вы делаете что-то нехорошее, и вам следует пересмотреть дизайн приложения.

Если мы хотим что-то передать в Сервис, мы можем запустить Сервис только с дополнительными параметрами в Намерении. Сервис обрабатывает состояние согласно этим параметрам внутри.

Идея заключается в том, что Сервис может работать независимо от других частей приложений, например, от Активности. Мы можем контролировать его с помощью дополнительных параметров при запуске Сервиса или при отправке широковещательных сообщений для вызова внешнего кода.

0 голосов
/ 29 июля 2012

Для вашего класса Service вам нужен конструктор без аргументов, в противном случае системы не знают, как его создать.

0 голосов
/ 03 апреля 2012

Не передавайте обработчик в службу, обработчик не реализует Parcelable или Serializable, поэтому я не думаю, что это возможно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...