Я посмотрел в Интернете, но не смог найти пример, охватывающий мой сценарий. То, что я пытаюсь сделать, это:Как вести опрос связанного сервиса?
1) Для того, чтобы начать и подключаться к службе, как только моя деятельность начинается (сделано)
2) Служба затем связывает себя с другим сервисом ищет пользователя вход с подключенного устройства, и сохраняет строку, строку в переменной (сделано)
3) Я хотел бы, чтобы послать эту строку в деятельности, так что я могу проверить, что это это на основе которого выполняется сетевой вызов.
Теперь номер 3) является моей задачей. Мне удалось сделать это с помощью таймера, который работает в течение одной секунды, а затем проверяет значение, записанное в службе, но почему-то это не кажется правильным, и я думаю, что может быть более зрелое решение. Однако я не могу понять это.
Я взял код из документации и добавил только таймер. Это всего лишь одна услуга в этом примере, которая просто генерирует случайное число (это, как правило, будет заменено моей второй службой). Это код для службы:
public class LocalService extends Service {
private final IBinder mBinder = new LocalBinder();
private final Random mGenerator = new Random();
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public int getRandomNumber() {
return mGenerator.nextInt(100);
}
}
И это код в моей деятельности:
public class MainActivity extends AppCompatActivity {
LocalService mService;
boolean mBound = false;
Timer timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = new Timer();
}
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, LocalService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
timer.schedule(new MyTimerTask(new Handler(), this), 1000, 1000); // run on every second
}
@Override
protected void onStop() {
super.onStop();
if (mBound) {
unbindService(mConnection);
mBound = false;
}
timer.cancel();
timer.purge();
}
private class MyTimerTask extends TimerTask {
Handler handler;
MainActivity ref;
public MyTimerTask(Handler handler, MainActivity ref) {
super();
this.handler = handler;
this.ref = ref;
}
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
if (mBound) {
int num = ref.mService.getRandomNumber();
// just as an example, raise a toast to see if it works
// but otherwise the value will be handled
Toast.makeText(ref, "number: " + num, Toast.LENGTH_SHORT).show();
}
}
});
}
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
LocalService.LocalBinder binder = (LocalService.LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
}
Мой вопрос: является ли это хороший подход (он работает) или это плохо, и Какая альтернатива?
у вас есть связанное обслуживание так Не используйте широковещательные приемники: у вас есть связанное соединение, просто передайте объект интерфейса в свою службу и позвольте службе позвонить ему где-нибудь – pskink
@pskink Я не уверен, что w Вы хотите сказать, позвольте службе вызвать объект интерфейса? – Apostrofix
в вашем 'LocalService' создать метод' register (ISomeInterface) ', и когда ваша активность связывается с вашей службой (внутри' onServiceConnected'), вызовите 'mService.register (MainActivity.this)', конечно, 'MainActivity' должен реализовать' ISomeInterface', таким образом, если вы вызываете 'register', ваша служба может хранить' ISomeInterface' в приватном поле и позже вызывать некоторые из его методов, если есть несколько клиентов, ваша служба может использовать 'List' из них или' android. класс os.RemoteCallbackList', который предназначен для такого случая – pskink