溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Android如何通過(guò)接收UDP消息改寫(xiě)程序配置

發(fā)布時(shí)間:2021-11-26 17:11:23 來(lái)源:億速云 閱讀:128 作者:柒染 欄目:移動(dòng)開(kāi)發(fā)

今天就跟大家聊聊有關(guān)Android如何通過(guò)接收UDP消息改寫(xiě)程序配置,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

Android程序打包成APK發(fā)布后,如果有參數(shù)需要根據(jù)不同應(yīng)用環(huán)境作修改,該如何實(shí)現(xiàn)呢?

比如這里有個(gè)應(yīng)用場(chǎng)景,Android程序需要調(diào)用服務(wù)器端的WebService服務(wù)來(lái)進(jìn)行后臺(tái)數(shù)據(jù)庫(kù)操作,而WebService的IP地址隨各個(gè)生產(chǎn)環(huán)境有所不同,如果每次都因?yàn)榈刂返淖兏匦戮幾g打包程序,明顯不便。如果我們能找到一種方式,在不對(duì)APK程序做任何改動(dòng)的情況下,動(dòng)態(tài)修改這個(gè)地址參數(shù)配置,將是多么靈活。

還有其它一些場(chǎng)景也需要APK應(yīng)用程序能隨時(shí)改變并且記住我們的設(shè)置,如一個(gè)安卓電視機(jī)大屏,需要實(shí)時(shí)展示一個(gè)HTML網(wǎng)頁(yè)報(bào)表,那么我們的Web頁(yè)面地址就需要發(fā)送給這個(gè)APK應(yīng)用,讓其記住我們的設(shè)置,下次程序打開(kāi)后就可以自動(dòng)顯示到我們的報(bào)表頁(yè)面了。

要實(shí)現(xiàn)這些需求,一個(gè)比較簡(jiǎn)單的方法就是通過(guò)向APP應(yīng)用程序發(fā)送UDP消息,將APP需要的一些配置參數(shù)發(fā)送給它,APP接收到消息取到參數(shù)后,將其保存在手機(jī)系統(tǒng)特定的位置,以后程序再打開(kāi)后就可以讀取到這些設(shè)置。

在Android系統(tǒng)中,每當(dāng)APP應(yīng)用程序安裝后,都會(huì)在系統(tǒng)的data/data目錄下新建一個(gè)以應(yīng)用程序包名稱(chēng)命名的文件夾,該文件夾包含了應(yīng)用程序的文件資源,稱(chēng)之為內(nèi)部存儲(chǔ)文件。雖然沒(méi)有ROOT的手機(jī)看不到該文件夾,但其實(shí)質(zhì)存在。我們可以在該文件夾中建立自己的存儲(chǔ)文件,比如建立一個(gè)配置文本,存放應(yīng)用的一些參數(shù)配置數(shù)據(jù)。應(yīng)用卸載后,這些文件內(nèi)容自然消失。因此,我們可以在這個(gè)路徑下創(chuàng)建自己的配置文件,將通過(guò)UDP接收到的參數(shù)保存在該文件中。

接收UDP消息是阻塞式的,也就是說(shuō)直到收到UDP消息后才會(huì)繼續(xù)下一步,因此我們把這個(gè)過(guò)程放在一個(gè)獨(dú)立的線(xiàn)程中。以下創(chuàng)建一個(gè)線(xiàn)程類(lèi)專(zhuān)門(mén)用于接收固定端口的UDP消息,并將接收到的消息文本寫(xiě)入data/data下指定的文本文件中。

public class UdpReceiveThread extends Thread {
    private final String TAG = "UdpReceiveThread";
    private Context context;
 
    // 該構(gòu)造函數(shù)用于將主活動(dòng)線(xiàn)程的上下文環(huán)境傳遞進(jìn)來(lái)
    public UdpReceiveThread(Context c)
    {
        context = c;
    }
 
    @Override
    public void run() {
        while (isAlive()) try {
            sleep(1000);
            DatagramSocket socket = new DatagramSocket(8808); // 端口固定為8808
            byte data[] = new byte[1024];
            DatagramPacket packet = new DatagramPacket(data, data.length);
            socket.receive(packet); // 阻塞式,接收發(fā)送方的packet
            String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
 
            // 將從UDP端口接收到的消息寫(xiě)入Android內(nèi)部存儲(chǔ)文件中做為程序配置參數(shù)
            try {
                FileOutputStream fos = context.openFileOutput("MyScan.txt", Context.MODE_PRIVATE);
                OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
                osw.write(result);
                osw.flush();
                fos.flush();
                osw.close();
                fos.close();
            } catch (Exception e) {
                Log.d(TAG, "run: " + e.getMessage());
                break;
            }
        } catch (Exception e) {
            Log.d(TAG, "run: " + e.getMessage());
            break;
        }
    }
}

在主Activity活動(dòng)的onCreate函數(shù)中添加以下代碼,從手機(jī)系統(tǒng)的data/data路徑中讀取程序配置,調(diào)用接收UDP消息的子線(xiàn)程,并將活動(dòng)的上下文環(huán)境傳遞給子線(xiàn)程。

public void onCreate(Bundle savedInstanceState) {
    ...
    // 從Android內(nèi)部存儲(chǔ)文件中讀取配置
    try {
        FileInputStream fis = openFileInput("MyScan.txt");
        InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
        char[] input = new char[fis.available()];  // available()用于獲取文件內(nèi)容的長(zhǎng)度
        isr.read(input);
        isr.close();
        fis.close();
        String str = new String(input);
        ws_url = str;
    } catch (Exception e){
        Log.d(TAG, "onCreate: " + e.getMessage());
    }
    ...
    // 調(diào)用UDP接收線(xiàn)程循環(huán)監(jiān)聽(tīng)端口消息
    UdpReceiveThread udpThread = new UdpReceiveThread(getApplicationContext());
    udpThread.start();
    ...
}

由此,程序在運(yùn)行過(guò)程中,一旦接收到固定端口發(fā)來(lái)的UDP消息后,將改寫(xiě)配置,并在下次啟動(dòng)時(shí),以新的配置參數(shù)運(yùn)行。

看完上述內(nèi)容,你們對(duì)Android如何通過(guò)接收UDP消息改寫(xiě)程序配置有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI