我是Android的新手,但熟悉网络编程。目前我正在使用phonegap编写应用程序。
我的应用程序通过websockets接收新闻并将其显示给用户。
我的问题是,当我的应用程序被用户关闭时,我无法使用WebView
来接收新闻。经过一段时间的搜索,我找到了一个可以用Java运行后台服务的Phonegap插件:https://github.com/Red-Folder/bgs-core。
但我是Java的新手,我不知道如何在后台服务中运行websockets(autoban.ws for Android)来接收新闻并在通知栏中显示它。
答案 0 :(得分:5)
我认为你应该采用不同的方法。您尝试做的事情在Android上是不可能实现的。但您可以使用Google Cloud Messaging将数据推送到安装了应用的设备。有点像这样:
只要您有一些服务器,例如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;
}