Это мой первый вопрос о SO, я надеюсь, что этот вопрос не будет плохим.
У меня есть служба, она начинает работать, когда пользователь запускает приложение и работает до тех пор, пока пользователь не убьет его с помощью убийцы задач или выключит его устройство.
Эта служба имеет фоновый поток, который выполняет некоторую работу с данными. Мне нужно связать действия (от действий, а не от службы), а иногда (1-2 раза в 30 секунд) отправлять данные в связанные операции.
Структура моего сервиса:
public class myserv extends Service {
public static boolean started=false;
public class workwithdata extends Thread {
@Override
public synchronized void start() {
super.start();
//.. Not important.
}
@Override
public void run() {
if (running) return;
while (true) {
if(condition) mythread.sleep(30000);
else {
Object data = recieveMyData();
if (!data.isEmpty()) {
//.. Some work with recieved data, not important.
sendDataToBindedActivities(data); //This is what I need.
}
mythread.sleep(10000);
}
}
}
}
@Override
public void onCreate() {
super.onCreate();
this.started=true;
mythread = new workwithdata();
mythread.start();
}
}
Ну, я нашел один вопрос, но моя проблема имеет небольшие отличия: мне не нужно отправлять какие-либо данные в службу, мне нужно просто отправить некоторые данные во все связанные действия (какая служба вообще не знает).
Структура, которую я ищу:
public class myact extends Activity {
@Override
public void onCreate(Bundle bun) {
super.onCreate(bun);
if(!myserv.started) {
Intent service = new Intent(getApplicationContext(), myserv.class);
getApplicationContext().startService(service);
}
bindToService(this);
}
@Override
public void onRecievedData(Object data) {
//work with recieved data from service "myserv".
}
}
Я также пытался найти некоторые решения в документации по Android, но я не нашел то, что мне нужно.
Итак, главный вопрос: возможно ли работать с сообщениями от службы к действиям? , Если нет: что я должен использовать для этой цели? Если да, просто, извините, я могу попросить некоторые имена кода или класса, потому что я пытался найти и не...
Спасибо.
Вам необходимо использовать RemoteCallbackList
Когда ваши клиенты свяжутся с сервисом, вам необходимо зарегистрировать их с помощью RemoteCallbackList.register()
.
Когда вы хотите отправлять данные связанным клиентам, вы делаете что-то вроде этого:
int count = callbackList.beginBroadcast();
for (int i = 0; i < count; i++) {
try {
IMyServiceCallback client = callbackList.getBroadcastItem(i);
client.onRecievedData(theData); // Here you callback the bound client method
// onRecievedData() and pass "theData" back
} catch (RemoteException e) {
// We can safely ignore this exception. The RemoteCallbackList will take care
// of removing the dead object for us.
} catch (Exception e) {
// Not much we can do here except log it
Log.e("while calling back remote client", e);
}
}
callbackList.finishBroadcast();
Пример можно найти здесь. Это довольно сложно, но, возможно, вам не нужно все, что это предлагает. В любом случае, посмотрите.