android应用程序与phonegap在后台服务中运行websocket

时间:2014-06-27 10:18:24

标签: java android cordova websocket

我是Android的新手,但熟悉网络编程。目前我正在使用phonegap编写应用程序。

我的应用程序通过websockets接收新闻并将其显示给用户。

我的问题是,当我的应用程序被用户关闭时,我无法使用WebView来接收新闻。经过一段时间的搜索,我找到了一个可以用Java运行后台服务的Phonegap插件:https://github.com/Red-Folder/bgs-core

但我是Java的新手,我不知道如何在后台服务中运行websockets(autoban.ws for Android)来接收新闻并在通知栏中显示它。

2 个答案:

答案 0 :(得分: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:   https://github.com/Red-Folder/bgs-core

一般来说,这是一个坏主意。它不会在Android上运行。你不能永久地在后台运行任何东西。即使你可以,这样的Service也会很快耗尽电池,因为设备永远无法入睡。即使你只是像我上面所描述的那样进行轮询,你仍然需要每隔x分钟唤醒设备并检查更新。所以我可以重申:使用Google Cloud Messaging。

尽管如此,有关于如何使用bgs-core插件的非常详细的教程:

您还可以在GitHub上找到sample project

  

但我是Java的新手并且不知道如何运行websockets(autoban.ws   for Android)在后台服务中接收新闻并将其显示出来   通知栏。

Android没有针对websockets的原生解决方案,因此我建议您使用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);

答案 1 :(得分: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;   
}