- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有以下 Go 脚本 (testapp.go),我想将其作为后台服务继续运行:
package main
import(
"net/http"
"time"
"log"
"golang.org/x/mobile/app"
)
func main() {
app.Main(func(a app.App) {
for {
req, err := http.NewRequest( "GET", "http://0.0.0.0:88/fetch_news", strings.NewReader("topic.title") )
if err != nil {
log.Print(err)
}
cli := &http.Client{}
res, err := cli.Do(req)
if err != nil {
log.Print(err)
} else {
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
returnStr := string(body)
// Do something with returnStr
}
time.Sleep(8 * time.Second)
}
})
}
我的 GoNativeActivity.java 如下所示:
package org.golang.app;
import android.app.Activity;
import android.app.NativeActivity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyCharacterMap;
public class GoNativeActivity extends NativeActivity {
private static GoNativeActivity goNativeActivity;
public GoNativeActivity() {
super();
goNativeActivity = this;
}
String getTmpdir() {
return getCacheDir().getAbsolutePath();
}
int getRune(int deviceId, int keyCode, int metaState) {
try {
int rune = KeyCharacterMap.load(deviceId).get(keyCode, metaState);
if (rune == 0) {
return -1;
}
return rune;
} catch (KeyCharacterMap.UnavailableException e) {
return -1;
} catch (Exception e) {
Log.e("Go", "exception reading KeyCharacterMap", e);
return -1;
}
}
private void load() {
// Interestingly, NativeActivity uses a different method
// to find native code to execute, avoiding
// System.loadLibrary. The result is Java methods
// implemented in C with JNIEXPORT (and JNI_OnLoad) are not
// available unless an explicit call to System.loadLibrary
// is done. So we do it here, borrowing the name of the
// library from the same AndroidManifest.xml metadata used
// by NativeActivity.
try {
ActivityInfo ai = getPackageManager().getActivityInfo(
getIntent().getComponent(), PackageManager.GET_META_DATA);
if (ai.metaData == null) {
Log.e("Go", "loadLibrary: no manifest metadata found");
return;
}
String libName = ai.metaData.getString("android.app.lib_name");
System.loadLibrary(libName);
} catch (Exception e) {
Log.e("Go", "loadLibrary failed", e);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
load();
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, org.golang.app.GoNativeService.class);
startService(intent);
}
}
我的 GoNativeService.java 如下所示:
package org.golang.app;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class GoNativeService extends IntentService {
@Override
public void onStart(Intent intent, int startId) {
Toast.makeText(this,"Service started. onStart()", Toast.LENGTH_SHORT).show();
handleCommand(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this,"Service started. onStartCommand()", Toast.LENGTH_SHORT).show();
handleCommand(intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
}
我的 AndroidManifest.xml 文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="org.golang.todo.testapp"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" />
<application android:label="Testapp" android:debuggable="true">
<activity android:name="org.golang.app.GoNativeActivity"
android:label="Testactivity"
android:configChanges="orientation|keyboardHidden">
<meta-data android:name="android.app.lib_name" android:value="testapp" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="org.golang.app.GoNativeService"
android:enabled="true"
android:exported="true" />
</application>
</manifest>
这是我的工作环境:
GOARCH="amd64"
GOBIN="/root/go/bin"
GOCACHE="/root/.cache/go-build"
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/root/go"
GOROOT="/usr/lib/go-1.10"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go-1.10/pkg/tool/linux_amd64"
这是我的 $GOPATH/src/testapp 目录的样子:
testapp/
assets/
icon.png
AndroidManifest.xml
testapp.go
这是我的 $GOPATH/src/golang.org/x/mobile/app 目录的样子:
app/
android.c
app_test.go
darwin_armx.go
GoNativeActivity.java
GoNativeService.java
internal/
x11.go
android.go
darwin_amd64.go
darwin_armx.m
shiny.go
app.go
darwin_amd64.m
doc.go
x11.c
如何在 Android 上将我的 Go 脚本作为后台服务运行,以便在应用程序退出(MainActivity 关闭)时,后台服务将继续获取新闻消息?
注意:我在我的网络服务器上的端口 88 上监视请求。我可以在 GoNativeActivity
处于 Activity 状态时正常运行脚本,但我想知道如何构建一个启动后台服务。
任何能为我指明正确方向的答案或尝试,我们将不胜感激!
最佳答案
首先,有一个普遍的看法,即您真的不应该按照您的要求去做。正确的方法是使用 AlarmManager 发送一个广播来唤醒单个请求的服务。这样系统可以更好地优化功耗。为此,让您的 go 代码只处理一个请求,并在进行广播时从 Java 端调用它。
但是,要真正持久地运行该服务,您需要启动“前台服务”,如所述https://developer.android.com/guide/components/services .这又需要在您的服务运行时显示的通知。在这种情况下,您可能会发现设备也会自行关闭,在这种情况下,您需要考虑获取 https://developer.android.com/reference/android/os/PowerManager.WakeLock。 .除非您非常小心,否则执行此类操作会大大缩短电池生命周期。
我发现以这种方式启动 go 代码对于在 Android 本身上长时间运行的网络服务器(包括使用 websockets)来说已经足够了。
关于android - 如何将一个简单的 Go 脚本作为 Android 服务运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49461141/
我正在使用 go 图表库 https://github.com/wcharczuk/go-chart制作条形图。我面临的问题是标签值很长,我想将文本旋转 45 度以显示完整文本 我喜欢显示的日期格式是
我在构建一个非常简单的通过 cgo 调用 c 代码的 go 程序时遇到了问题。我的设置: $: echo $GOPATH /go $: pwd /go/src/main $: ls ctest.c
没有 C 的背景,只有 Go 的“初学者”经验,我正在尝试弄清楚 main.go 是实际需要的还是只是一个约定。 我想创建一个简单的网络 API,但有人可以为我澄清一下吗? 最佳答案 main.go
我read从 Go 1.4 开始,Go 运行时是用 Go 本身编写的(而不是用 C)。 这怎么可能?如果 Go 程序在运行时之上运行,并且运行时是 Go 程序,那么运行时是否在自身之上运行? 最佳答案
这是“Go 之旅”中的代码示例 Range and Close : package main import ( "fmt" ) func fibonacci(n int, c chan int
给定以下 go.mod 文件: module foo go 1.12 require ( github.com/bar/baz v1.0.0 github.com/rat/cat v1
我有一个 CI/CD 管道,它需要跨平台并与几个不同的管理程序一起工作。为了不必更改 Windows 和 Linux 的构建任务,我认为 Go 将是编写一次代码并在任何地方运行的好方法。然而,考虑到
我有一个 Dockerfile,用于使用 go build 编译 Go 应用程序。我进行了研究,确实建议将 go build 用于生产。 但是我找不到正确的答案来解释为什么。 我了解 go run 创
我尝试在命令提示符#Go lang 中运行该程序-但是当我键入运行“go run hello.go”命令时,我开始了 CreateFile hello.go:The system cannot fin
我正在使用“Go 编程语言”一书学习 Go。第一章介绍os.Open用于读取文件的模块。我尝试打开如下所示的 go 文件。 f, err = os.Open("helloworld.go") 我收
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 2年前关闭。 Improve this
为了解决我对 goroutine 的一些误解,我去了 Go 操场跑了 this code : package main import ( "fmt" ) func other(done cha
这个问题在这里已经有了答案: Evaluate/Execute Golang code/expressions like js' eval() (5 个回答) 1年前关闭。 对于任何 go 程序,我想
这是我基本上试图从路径打印基准的代码。 这意味着,如果用户输入“/some/random/path.java”,则输出将为“path”。同样,如果用户arg为“/another/myapp.c”,则输
$ go version 1.13.3 我的文件夹结构如下: GOPATH +---src +--- my-api-server +--- my-auth-server
这个问题在这里已经有了答案: How to embed file for later parsing execution use (4 个答案) What's the best way to bun
我觉得这有点奇怪,为什么这段代码不起作用? package main import "fmt" func main() { var i, j int = 1, 2 k
go编译器执行完如下命令后的可执行文件存放在哪里? $> go run file.go 最佳答案 在 /tmp 文件夹中,如果您使用的是 unix 机器。 如果您使用的是 Windows,则在 \Us
我目前正在开始使用 Go,并且已经深入研究了有关包命名和工作区文件夹结构的注意事项。 不过,我不太确定如何根据 Go 范式正确组织我的代码。 这是我当前的结构示例,它位于 $GOPATH/src 中:
假设我有一个接受用户输入的 Lua 程序,而该输入恰好是有效的 Lua 源代码。这是在程序仍在运行时进行清理、编译和执行的。 Go 是否(或将)实现这样的事情? 最佳答案 我认为以下两个项目之间有足够
我是一名优秀的程序员,十分优秀!