敬酒服务

时间:2011-09-04 08:23:27

标签: java android android-service toast

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

1 个答案:

答案 0 :(得分:3)

您无法从服务中调用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