小编典典

自助式吐司

java

我有一个运行远程服务然后退出的android活动。该服务本身在设备节点上进行轮询并检查更改,我想使用Toast来提醒用户,但是我没有让它起作用。Toast没有显示,过一会儿,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");
    }
}

阅读 209

收藏
2020-11-23

共1个答案

小编典典

您无法通过服务呼叫Toast消息。除了UI线程之外,您不能对UI进行任何操作。您将需要研究从服务中与UI线程进行通信的多种方式之一-
BroadcastReciever,Messenger,AIDL等。

对于您想做的事情,您可能不需要走到AIDL路线。签出这个Messenger实施示例,然后从sdk-samples签出完整示例:

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

2020-11-23