簡體   English   中英

在Android的后台服務中運行監聽器

[英]Running listener in a background service in android

每當有人在上面寫入數據時,我都需要從USB串行端口接收數據。

為此,我創建了一個具有onread偵聽器的服務,該偵聽器會在數據可用時從串行端口讀取數據。

我將在活動中添加接收到的數據的textview。 但是我什么也看不到。

我的服務正在運行,但無法接收任何數據。

下面是我的服務類代碼。

public class BroadcastService extends Service {
    private static final String TAG = "BroadcastService";
    public static final String BROADCAST_ACTION = "com.example.flowtest.displayevent";
    private final Handler handler = new Handler();
    // DatabaseHandle db = new DatabaseHandle(this);
    Intent intent;
    int counter = 0;
    int i = 0, flag = 0;
    String d = "a";
    byte[] buf = new byte[5];
    byte[] start = new byte[21];
    byte[] rbuf;// updated
    String str;
    Physicaloid mPhysicaloid = new Physicaloid(this);

    @Override
    public void onCreate() {
        super.onCreate();

        intent = new Intent(BROADCAST_ACTION);
        // mPhysicaloid.open();

    }

    @Override
    public void onStart(Intent intent, int startId) {

        mPhysicaloid.open();

        handler.removeCallbacks(getdata);
        handler.post(getdata);
    }

    private Runnable getdata = new Runnable() {
        public void run() {
            Log.d("service", "in service");
            mPhysicaloid.addReadListener(new ReadLisener() {

                @Override
                public void onRead(int size) {
                    // TODO Auto-generated method stub
                    byte[] rbuf = new byte[size];
                    mPhysicaloid.read(rbuf, size);
                    try {
                        str = new String(rbuf, "UTF-8");

                        if (str.equals(null)) {
                            flag = 0;
                            intent.putExtra("inputString", "no luck");
                            sendBroadcast(intent);
                        } else {
                            flag = 1;
                            intent.putExtra("inputString", str);
                            sendBroadcast(intent);
                        }

                        // sendBroadcast(intent);

                    } catch (UnsupportedEncodingException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }

            });

        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        // handler.removeCallbacks(sendUpdatesToUI);
        super.onDestroy();
    }
}

現在我的活動,

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
     public void onReceive(Context context, Intent intent) {
        updateUI(intent);       
    }

    private void updateUI(Intent intent) {
        // TODO Auto-generated method stub
        String data = intent.getStringExtra("inputString").toString();
        if(data.equals("NORMAL")){
            i = new Intent(MainActivity.this,ModeScreenActivity.class);
              startActivity(i);
              finish();
        }
        else{

        }
        tvAppend(tv1,data);
    }
}; 

您可以在可運行的getData中設置讀取偵聽器。 這意味着偵聽器僅在getData運行時才有效。 由於getData立即終止,因此偵聽器將永遠不會有執行的機會。

將偵聽器移出getData,或者讓getData是與您的服務壽命相同的長時間運行的線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM