У меня есть расширенный класс службы, который отвечает за работу в фоновом режиме.ну, в моих случаях, каждый раз, когда служба получает обновление, она должна передать сообщение действующему действию, чтобы пользовательский интерфейс действия также обновлялся.
Итак, я использую TabActivity, например: Main.java, и на вкладке Main.java есть действие с именем Contact.java.
Я следую за примерами сервисов переднего плана от Google, чтобы создать сервис, а на Main.java я связываю сервис:
// Reference to the service
public static EmasService serviceBinder;
// Handles the connection between the service and activity
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// Called when the connection is made.
serviceBinder = ((EmasService.EmasBinder)service).getService();
Log.v("Main", "onServiceConnected");
// Toast.makeText(getApplicationContext(), "Service connected!", Toast.LENGTH_LONG).show();
}
public void onServiceDisconnected(ComponentName className) {
// Received when the service unexpectedly disconnects.
serviceBinder = null;
Main.this.stopService(serviceIntent);
Toast.makeText(getApplicationContext(), "Service disconnected!", Toast.LENGTH_LONG).show();
}
};
и я определяю Contact.java следующим образом:
intent = new Intent().setClass(this, Contacts.class);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("").setIndicator(createTabView(this,"Contact",
res.getDrawable(R.drawable.contact_icon)))
.setContent(intent);
tabHost.addTab(spec);
хорошо, теперь для обновления интерфейса я использую интерфейс (проблемы новичка не упоминают, я знаю, что должениспользовать широковещательное намерение) под названием ServiceListener.java:
public interface ServiceListener {
public void invocation(Message message);
}
, а затем в Contact.java я инициализировал слушателя, когда достигнутое состояние onResume:
protected void bindInterface() {
// call bind service instance to setListener this activity
Main.serviceBinder.setListener(this);
}
и в службе он будет инициализирован:
public void setListener(ServiceListener sListener) {
Log.v(TAG, "setListener");
//if(listener == null) {
//this.listener = null;
this.listener = sListener;
//}
}
и затем каждый раз, когда ему нужно обновить интерфейс, он устанавливает новую очередь для вектора:
lMessage.setData(bundle);
interfaceMessage.add(lMessage);
, после этого поток отправляет сообщениеинтерфейс один за другим:
while(listenerIsRun) {
try {
Thread.sleep(300);
//Log.v(TAG, "InterfaceQueue: "+interfaceMessage.size());
if(interfaceMessage.size() > 0) {
if(listener != null) {
//if(listener instanceof Contacts)
listener.invocation(interfaceMessage.get(0));// invoke the message
interfaceMessage.remove(0);// don't forget to remove invoked msg
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
и в Contact.java он поймает сообщение вот так:
public void invocation(Message message) {
contactHandler.sendMessage(message);
}
// TODO handler which handle ui message from service
private Handler contactHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// all updating process goes here...
}
};
хорошо, я предполагаю, что этот способ заставил бы его работать легко, но на самом деле это не так!иногда он обновляет пользовательский интерфейс, но иногда он просто не отвечает, ПОЧЕМУ?
Пожалуйста, скажите мне, если я что-то пропустил или нужно что-то добавить ...
Спасибо