onStartCommand() вызывается только один раз, даже когда служба запускается несколько раз
Приведенный ниже сервис активируется нажатием кнопки в каком-либо другом приложении (с помощью функции Intent). OnStartCommand() создает сообщения и отправляет с помощью метода send(). В идеале я ожидаю, что onStartCommand будет вызываться каждый раз, когда нажимается кнопка, так как ожидающее намерение используется для запуска службы на buttonClick.
Но onstartCommand() вызывается только один раз, при первом нажатии кнопки. Последующие нажатия кнопок не вызывают onStartCommand().
Интересно, если я прокомментирую строку replyTo.send(msg); onStartCommand вызывается каждый раз, когда нажимается кнопка из другого приложения.
Поэтому отправка сообщения с помощью Android IPC Messenger из службы может быть причиной проблемы. Я подтвердил, что сообщение успешно достигло целевого приложения. Я что-то упускаю из сообщений, например, блокировка отправки?
Я возвращаю START_STICKY из onStartCommand(), что также может быть причиной.
Любое понимание происходящего будет приветствоваться.
//MyService.java
@Override
public void onCreate() {
// create RemoteViews -> rView
Intent intent = new Intent(getBaseContext(), MyService.class);
PendingIntent pendingIntent = PendingIntent.getService(getBaseContext(), 0, intent, 0);
rView.setOnClickPendingIntent(buttonId, pendingIntent);
//On click of the above button, this MyService will be started usingthe given pendingintent
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("debug","Service onStartCommand");
Message msg = Message.obtain(null, UPDATE_REMOTE_VIEW, rView);
try {
replyTo.send(msg);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return START_STICKY;
}
Детали бонуса: pendingIntent для кнопки (из другого приложения) устанавливается с помощью setOnclickPendingIntent() (класс RemoteViews).
2 ответа
Что я сделал в моем подобном случае, чтобы реализовать onStartCommand
следующим образом:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//
// ... HERE support for intent sent by setOnClickPendingIntent ...
//
return super.onStartCommand(intent, flags, startId);
}
И это похоже на работу. onStartCommand
называется несколько раз (столько, сколько количество кликов на моем RemoteViews
).
Из Документов:
Клиенты также могут использовать Context.bindService() для получения постоянного соединения со службой. Это также создает службу, если она еще не запущена (вызывая при этом onCreate()), но не вызывает onStartCommand(). Клиент получит объект IBinder, который служба возвращает из своего метода onBind(Intent), позволяя клиенту затем выполнить обратные вызовы службе. Служба будет работать до тех пор, пока соединение установлено (независимо от того, сохраняет ли клиент ссылку на IBinder службы). Обычно IBinder возвращается для сложного интерфейса, который был написан на aidl.
Таким образом, это может быть из-за использования bindService