在android中重新启动后Kivy服务未启动

我创建了 Kivy android 应用程序,并希望通过点击此处此处的链接创建提醒服务以在特定时间显示通知当我启动我的应用程序时该服务成功运行,也可以在从最近的应用程序清除后自动重新启动。但是有一些问题我无法解决,希望这里的任何人都可以提供帮助。

  1. 重启手机后我的服务无法加载。logcat 中有错误。
E AndroidRuntime: java.lang.RuntimeException: Unable to start service com.example.test.ServiceMyservice@18ea0a6 with Intent { flg=0x10000000 cmp=com.example.test/.ServiceMyservice (has extras) }: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
  1. 目前我正在使用计划模块每 5 秒使用一次plyer通知进行测试,服务在 2~3 小时后停止,没有错误。如果我安排服务每天或每 6 小时显示一次通知,为什么会被杀死?

这是我的代码。/service/myservice.py 中的服务文件

import datetime
from plyer import notification
import schedule
import time
def noti():
    notification.notify(title=datetime.datetime.now(), message="test", app_name='test',  timeout=3600, ticker='', toast=False)

class KivyService:
    def __init__(self):
        pass

    def start(self):
        while True:
            schedule.run_pending()
            time.sleep(1)
            runjob = schedule.get_jobs('reminder')
            if not runjob:
                schedule.every(5).seconds.do(noti).tag("reminder")


if __name__ == '__main__':
    service = KivyService()
    service.start()

以下条目添加到 AndroidManifest.tmpl.xml

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

另外,在下面添加之前

<receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

和 MyBroadcastReceiver.java

package com.example.test;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import com.example.test.ServiceMyservice;

public class MyBroadcastReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        String package_root = context.getFilesDir().getAbsolutePath();
        String app_root =  package_root + "/app";
        Intent ix = new Intent(context, ServiceMyservice.class);
        ix.putExtra("androidPrivate", package_root);
        ix.putExtra("androidArgument", app_root);
        ix.putExtra("serviceEntrypoint", "./service/myservice.py");
        ix.putExtra("pythonName", "myservice");
        ix.putExtra("pythonHome", app_root);
        ix.putExtra("pythonPath", package_root);
        ix.putExtra("pythonServiceArgument", app_root+":"+app_root+"/lib");
        ix.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startService(ix);
    }
}

该示例使用 ix.putExtra("serviceEntrypoint", "./service/main.py"); 我不确定它是否应该指向我的服务 python 文件,但我遇到了同样的错误。

还有我的 buildozer.spec 权限部分

android.permissions = INTERNET, ACCESS_NETWORK_STATE, RECEIVE_BOOT_COMPLETED, FOREGROUND_SERVICE

服务

services=myservice:service/myservice.py

谢谢。

如果有人遇到同样的问题,请回答我自己的问题。参考 PythonService.java 第 77 行,它需要一个参数 serviceStartAsForeground 但在我的参考链接中缺失,可能是由于版本差异。

boolean serviceStartAsForeground = (
            extras.getString("serviceStartAsForeground").equals("true")
        );

所以我需要在 Java 中添加以下行,无论是 true 还是 false,然后服务才能在重新启动后启动。

ix.putExtra("serviceStartAsForeground", "false");

但是,后台服务将在数小时后被系统终止以释放资源。仍在寻找一种方法使其注册到android警报管理器以重复任务,例如调用plyer通知并能够在重新启动后再次重新注册。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android服务未重新启动

重新启动后Amazon Cloud中的服务器未启动

“清除内存” + appWidget崩溃后,服务未重新启动

通知重新启动后,停止Chef中的服务

uWSGI闲置后未重新启动

重新启动后未保存SharedPreferences

在Android Studio中重新启动系统后,项目视图未显示

Postgresql查询未终止,重新启动服务后postgresql无法启动

如何以编程方式重新启动android中的服务?

Android服务未在Lollipop中重新启动

我可以在Android中完全重新启动服务吗?

Windows重新启动后,自动服务不会自动启动

重新启动服务器后无法启动mysql

Android:服务自动重新启动

当Android重新启动服务时,在Android服务中启动的线程会如何处理?

在pygame中重新启动游戏后,计时器无法正确启动且未重置

系统修复后,快照服务未运行/无法重新启动

Microsoft文件服务器升级后,Azure App Service未重新启动

重新启动后,图标从启动器中消失

在Red Hat 6.7中服务崩溃后inittab不会重新启动服务

bash 中的 Nagios 事件处理程序脚本以重新启动服务,如果未启动,则在满足条件之前不要重新启动下一个

更新后重新启动

重新启动RPC服务

重新启动游戏后,GameObject属性值未重置

重新启动OSX后未保存ssh密钥

重新启动后,电报桌面快照包未运行

重新启动后未检测到蓝牙鼠标

暂停后Iphone OpenAL循环声音未重新启动

重新启动后Linux RAID阵列未组装