android-关闭应用程序时Kivy服务停止

android-关闭应用程序时Kivy服务停止,第1张

概述我正在从Kivy应用程序启动服务:service=autoclass('net.saband.myapp.ServiceMyservice')mActivity=autoclass('org.kivy.android.PythonActivity').mActivityservice.start(mActivity,'')有用.如果我使用“后退”按钮关闭应用程序,则我的服务仍然有效.但是,如果我通过从

我正在从Kivy应用程序启动服务:

service = autoclass('net.saband.myapp.ServiceMyservice')mActivity = autoclass('org.kivy.androID.PythonActivity').mActivityservice.start(mActivity, '')

有用.如果我使用“后退”按钮关闭应用程序,则我的服务仍然有效.但是,如果我通过从最近的应用程序列表中刷出应用程序来关闭我的应用程序,则该服务将终止.

我发现this issue并尝试使用this article指导的startForeground.它可以工作,但是通知不可移动,因此该解决方案不适合我.

我已经阅读了this question,使用START_STICKY似乎可以为您提供帮助…但这是一项千篇一律的服务,那么我该如何实现呢?我试图在我的python-for-androID模板中编辑Service.tmpl.java并更改它:

public class Service{{ name|cAPItalize }} extends PythonService {    {% if sticky %}    @OverrIDe    public int startType() {        return START_STICKY;    }    {% endif %}...

对此:

public class Service{{ name|cAPItalize }} extends PythonService {    @OverrIDe    public int startType() {        return START_STICKY;    }

(是的,我知道{%if sticky%}意味着我可以将其设置在某个地方,但是在official docs中对此一无所知.)

但是没有任何改变,服务仍然终止.根据日志,计划重新启动:

11-17 22:52:07.140  1496  1511 I ActivityManager: Killing 29431:net.saband.myapp/u0a122 (adj 9): remove task11-17 22:52:07.219  1496  3404 I windowstate: WIN DEATH: Window{3c605b3 u0 net.saband.myapp/org.kivy.androID.PythonActivity}11-17 22:52:07.220  1496  3404 W WindowManager: Force-removing child win Window{5ed4ff u0 SurfaceVIEw} from container Window{3c605b3 u0 net.saband.myapp/org.kivy.androID.PythonActivity}11-17 22:52:07.225  1496  2871 W WindowManager: Failed looking up window11-17 22:52:07.225  1496  2871 W WindowManager: java.lang.IllegalArgumentException: Requested window androID.os.BinderProxy@c7f2770 does not exist11-17 22:52:07.225  1496  2871 W WindowManager:     at com.androID.server.wm.WindowManagerService.windowForClIEntLocked(WindowManagerService.java:8821)11-17 22:52:07.225  1496  2871 W WindowManager:     at com.androID.server.wm.WindowManagerService.windowForClIEntLocked(WindowManagerService.java:8812)11-17 22:52:07.225  1496  2871 W WindowManager:     at com.androID.server.wm.windowstate$DeathRecipIEnt.binderDIEd(windowstate.java:1212)11-17 22:52:07.225  1496  2871 W WindowManager:     at androID.os.BinderProxy.sendDeathNotice(Binder.java:558)11-17 22:52:07.225  1496  2871 I windowstate: WIN DEATH: null11-17 22:52:07.247  1496  3311 D ActivityManager: cleanUpApplicationRecord -- 2943111-17 22:52:07.250  1496  3538 I ActivityManager: Killing 29366:net.saband.myapp:service_myservice/u0a122 (adj 8): remove task11-17 22:52:07.304  1496  3557 D ActivityManager: cleanUpApplicationRecord -- 2936611-17 22:52:07.305  1496  3557 W ActivityManager: Scheduling restart of crashed service net.saband.myapp/.ServiceMyservice in 1000ms

但是什么也没发生.

即使通过从最近的应用程序列表中将其刷出而关闭了该应用程序,我也需要该服务才能继续工作.而且我需要可移动的通知.就这样.许多应用程序都可以做到.但是有办法用Kivy和python-for-androID吗?

谢谢.

解决方法:

我做的.但这需要更改Java代码,并且解决方案是硬编码的.奇怪的是,python-for-androID开发人员没有预见到这一点.

好吧,解决方案.

打开文件.buildozer / androID / platform / build / dists / myapp / src / org / kivy / androID / PythonService.java.在函数startType()中,将START_NOT_STICKY更改为START_STICKY:

public int startType() {    return START_STICKY;}

现在,该服务将重新启动.但这还不够,因为在函数onStartCommand(Intent intent,int flags,int startID)中的intent重新启动后,intent将为null,因此我们将得到一个错误:

E AndroIDRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androID.os.Bundle androID.content.Intent.getExtras()' on a null object reference

因此,我们需要在此函数中添加if语句:

@OverrIDepublic int onStartCommand(Intent intent, int flags, int startID) {    if (pythonThread != null) {        Log.v("python service", "service exists, do not start again");        return START_NOT_STICKY;    }    if (intent != null) {         startIntent = intent;        Bundle extras = intent.getExtras();        androIDPrivate = extras.getString("androIDPrivate");        androIDArgument = extras.getString("androIDArgument");        serviceEntrypoint = extras.getString("serviceEntrypoint");        pythonname = extras.getString("pythonname");        pythonHome = extras.getString("pythonHome");        pythonPath = extras.getString("pythonPath");        pythonServiceArgument = extras.getString("pythonServiceArgument");        pythonThread = new Thread(this);        pythonThread.start();        if (candisplayNotification()) {            doStartForeground(extras);        }    } else {        pythonThread = new Thread(this);        pythonThread.start();    }    return startType();}

但这还不够,因为现在我们在nativeStart函数调用中遇到了另一个错误,因为没有多余的东西:

F DEBUG   : Abort message: 'art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPliCATION: GetStringUTFChars received NulL Jstring'

因此,我向run()函数添加了null检查和一些默认值(其中2个是硬编码的):

@OverrIDepublic voID run(){    String package_root = getfilesDir().getabsolutePath();    String app_root =  package_root + "/app";    file app_root_file = new file(app_root);    PythonUtil.loadlibrarIEs(app_root_file);    this.mService = this;    if (androIDPrivate == null) {        androIDPrivate = package_root;    }    if (androIDArgument == null) {        androIDArgument = app_root;    }    if (serviceEntrypoint == null) {        serviceEntrypoint = "./service/main.py"; // hardcoded    }    if (pythonname == null) {        pythonname = "myservice"; // hardcoded    }    if (pythonHome == null) {        pythonHome = app_root;    }    if (pythonPath == null) {        pythonPath = package_root;    }    if (pythonServiceArgument == null) {        pythonServiceArgument = app_root+":"+app_root+"/lib";    }    nativeStart(        androIDPrivate, androIDArgument,        serviceEntrypoint, pythonname,        pythonHome, pythonPath,        pythonServiceArgument);    stopSelf();}

现在可以了.

总结

以上是内存溢出为你收集整理的android-关闭应用程序时Kivy服务停止全部内容,希望文章能够帮你解决android-关闭应用程序时Kivy服务停止所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1093242.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存