Тост в самостоятельной службе

У меня есть активность 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:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerService.html

Другие вопросы по тегам