2014-06-27 174 views
0

我是Android新手,但熟悉web編程。目前我正在使用phonegap編寫應用程序。android應用程序與phonegap在後臺運行websocket服務

我的應用程序通過websockets接收新聞並將它們顯示給用戶。

我的問題是,當我的應用程序被用戶關閉時,我無法使用WebView接收新聞。搜索了一段時間後,我找到了一個可以使用Java運行後臺服務的Phonegap插件:https://github.com/Red-Folder/bgs-core

但我是新來的Java,我不知道如何在後臺服務中運行websockets(autoban.ws for Android)來接收新聞並在通知欄中顯示它。

回答

5

我認爲你應該使用不同的方法。你想要做的是在Android上不可能實現的。但是,您可以使用Google Cloud Messaging將數據推送到安裝了應用程序的設備上。這有點是這樣的:

enter image description here

只要你有一些服務器,例如Google App Engine項目,可以將任何數據推送到您的應用程序,你也可以針對特定的設備。大多數應用程序使用Google Cloud Messaging,因爲它非常高效且電池友好,但速度也非常快。如果沒有Google Cloud Messaging或類似的東西,您必須定期輪詢服務器並檢查更新。這會喚醒設備並消耗電池 - 尤其是當您需要頻繁更新時。 Google Cloud Messaging解決了所有這些問題,但如果您以前從未做過類似的工作,它也將會有更多的工作。但既然你是一個Web開發人員,我認爲你應該能夠處理它。


關於你的問題

我的問題是,當我的應用程序被用戶關閉,我不能使用 的WebView用於接收消息。搜索後,我發現了一個可以運行Java後臺服務的PhoneGap: 。

通常這是一個壞主意。它不適用於Android。你永遠不能擁有在後臺運行的任何東西。即使你可以,這樣一個Service會耗盡電池非常快,因爲設備永遠不會睡覺。即使您只是按照上面所述進行輪詢,您仍需要每隔x分鐘喚醒設備並檢查更新。所以我可以重申一下:使用Google雲消息傳遞。

不過也有關於如何使用bgs-core插件非常詳細的教程:

您還可以在Github上找到一個sample project

但我是新來的Java,不知道如何運行websockets(autoban。ws for Android)在後臺服務中接收新聞並在 中顯示通知欄。

Android沒有websocket的本地解決方案,所以我建議您使用websocket庫。您可以選擇這三個庫之一:

在下面的例子,我將使用AutobahnAndroid


首先,你應該通過Build your own plugin教程!本教程假定您已經知道如何創建插件的基礎知識,但是由於您對這一切都比較陌生,因此您可以查看this answer。它詳細介紹瞭如何創建一個基本的插件,並且應該涵蓋大部分(如果不是所有其他教程中缺少的信息)。

當你與創建插件是很簡單的建立與AutobahnAndroid一個連接來完成:

final WebSocketConnection connection = new WebSocketConnection(); 
try { 
    connection.connect(url, new WebSocketHandler() { 

     @Override 
     public void onOpen() { 
      // Web socket connection has been opened 
     } 

     @Override 
     public void onTextMessage(String payload) { 
      // Received text message 
     } 

     @Override 
     public void onClose(int code, String reason) { 
      // Web socket connection was closed 
     } 
    }); 
} catch (WebSocketException e) { 
    Log.d(LOG_TAG, "Could not connect!", e); 
} 

您也可以將數據發回這樣的:

connection.sendTextMessage(someMessage); 
+0

Wow優秀的答案! –

0

這很簡單,根據文檔https://github.com/Red-Folder/bgs-core/wiki/Using-the-MyService-Sample

該類提供後臺服務邏輯doWork。請注意,doWork不僅執行所需的邏輯(在這種情況下,它只是向logcat輸出Hello World消息),它還產生結果JSONObject。這一結果是通過返回的JSON提供給HTML/JavaScript的前端:

@Override 
protected JSONObject doWork() { 
    JSONObject result = new JSONObject(); 

    try { 
     SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     String now = df.format(new Date(System.currentTimeMillis())); 

     String msg = "Hello " + this.mHelloTo + " - its currently " + now; 
     result.put("Message", msg); 

     Log.d(TAG, msg); 
    } catch (JSONException e) { 
    } 

    return result; 

並根據此鏈接:http://autobahn.ws/android/gettingstarted.html

package de.tavendo.test1; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import de.tavendo.autobahn.WebSocketConnection; 
import de.tavendo.autobahn.WebSocketException; 
import de.tavendo.autobahn.WebSocketHandler; 

public class Test1Activity extends Activity { 

    private static final String TAG = "de.tavendo.test1"; 

    private final WebSocketConnection mConnection = new WebSocketConnection(); 

    private void start() { 

     final String wsuri = "ws://192.168.1.132:9000"; 

     try { 
     mConnection.connect(wsuri, new WebSocketHandler() { 

      @Override 
      public void onOpen() { 
       Log.d(TAG, "Status: Connected to " + wsuri); 
       mConnection.sendTextMessage("Hello, world!"); 
      } 

      @Override 
      public void onTextMessage(String payload) { 
       Log.d(TAG, "Got echo: " + payload); 
      } 

      @Override 
      public void onClose(int code, String reason) { 
       Log.d(TAG, "Connection lost."); 
      } 
     }); 
     } catch (WebSocketException e) { 

     Log.d(TAG, e.toString()); 
     } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     start(); 
    } 
} 

最後結合這些例子中,你有你自己的目標(運行WebSocket在後臺服務):

@Override 
    protected JSONObject doWork() { 

     try { 

      final String wsuri = "ws://echo.websocket.org/"; 


     try { 

      mConnection.connect(wsuri, new WebSocketHandler() { 

      @Override 
      public void onOpen() { 
       Log.d(TAG, "Status: Connected to " + wsuri); 
       mConnection.sendTextMessage("Hello, world!"); 
      } 

      @Override 
      public void onTextMessage(String payload) { 
       Log.d(TAG, "Got echo: " + payload); 
       try { 
        result.put("wsMessage",payload); 
       } catch (JSONException e) { 
       } 
      } 

      @Override 
      public void onClose(int code, String reason) { 
       Log.d(TAG, "Connection lost."); 
      } 
      }); 
     } catch (WebSocketException e) { 

     Log.d(TAG, e.toString()); 
     } 
    } catch (JSONException e) { 
    } 
    Log.d(TAG, result.toString()); 
    return result; 
} 
相關問題