Тост в самостоятельной службе
У меня есть активность Android, которая запускает удаленный сервис, а затем выходит. Сам сервис, опрашивает узел устройства и проверяет изменения. Я хочу использовать тост, чтобы предупредить пользователя, но мне не удалось заставить его работать. Тост не отображается, и через некоторое время Android кричит, что мое приложение не отвечает. Кстати, я не хочу начинать упражнение снова и отображать тост оттуда, я просто хочу, чтобы оно появилось на текущем экране, показанном пользователю.
Вот код сервиса:
public class MainService extends Service {
// Native methods
public native static int GetWiegandCode();
public native static void openWiegand();
public native static void closeWiegand();
static int code = 0;
// Other
private static final String TAG = MainService.class.getSimpleName();
private Handler handler;
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void run() {
Handler h;
while (true) {
code = GetWiegandCode();
if (code > 0) {
h = new Handler(this.getMainLooper());
h.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getBaseContext(),
"ID " + Integer.toString(code) +
"Just entered", Toast.LENGTH_LONG).show();
}
});
}
}
}
@Override
public void onCreate() {
super.onCreate();
openWiegand();
Log.i(TAG, "Service Starting");
this.run();
}
@Override
public void onDestroy() {
super.onDestroy();
closeWiegand();
Log.i(TAG, "Service destroying");
}
static {
System.loadLibrary("wiegand-toast");
}
}
1 ответ
Вы не можете вызвать тостовое сообщение от Сервиса. Вы ничего не можете сделать с пользовательским интерфейсом, кроме как из потока пользовательского интерфейса. Вам нужно будет исследовать один из многих способов связи с вашим потоком пользовательского интерфейса из вашего сервиса - BroadcastReciever, Messenger, AIDL и т. Д.
Для того, что вы пытаетесь сделать, вам, вероятно, не нужно заходить так далеко, как маршрут AIDL. Посмотрите этот пример реализации Messenger, а затем посмотрите полный пример из sdk-samples: