启动时启动Kivy服务(Android)

sab*_*and 9 python java android kivy

我正试图在启动时启动我的kivy应用程序服务.

我确信我的服务还可以,因为它可以在我启动应用程序时运行.但是在启动时我遇到了问题.

我已经阅读了这篇文章并尝试制作它:

package net.saband.myapp;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import org.kivy.android.PythonActivity;

public class MyBroadcastReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Intent ix = new Intent(context, PythonActivity.class);
        ix.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(ix);
    }
}
Run Code Online (Sandbox Code Playgroud)

它可以工作,但启动应用程序,但不启动服务.所以我在StackOverflow上研究了一些问题并改变了我的代码:

package net.saband.myapp;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import net.saband.myapp.ServiceMyservice;

public class MyBroadcastReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Intent ix = new Intent(context, ServiceMyservice.class);
        ix.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startService(ix);
    }
}
Run Code Online (Sandbox Code Playgroud)

......并收到错误:

10-21 19:16:44.784  1513  1569 I ActivityManager: Start proc 6334:net.saband.myapp:service_myservice/u0a116 for service net.saband.myapp/.ServiceMyservice
10-21 19:16:44.786  6334  6334 I art     : Late-enabling -Xcheck:jni
10-21 19:16:44.885  6334  6334 D AndroidRuntime: Shutting down VM
10-21 19:16:44.888  6334  6334 E AndroidRuntime: FATAL EXCEPTION: main
10-21 19:16:44.888  6334  6334 E AndroidRuntime: Process: net.saband.myapp:service_myservice, PID: 6334
10-21 19:16:44.888  6334  6334 E AndroidRuntime: Theme: themes:{}
10-21 19:16:44.888  6334  6334 E AndroidRuntime: java.lang.RuntimeException: Unable to start service net.saband.myapp.ServiceMyservice@8c96929 with Intent { cmp=net.saband.myapp/.ServiceMyservice }: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
Run Code Online (Sandbox Code Playgroud)

能否请您解释一下我的错误以及如何开始服务?谢谢!

更新

根据@Juggernaut的要求,我添加了我的服务代码:

from time import sleep

if __name__ == '__main__':
    while True:
        print "myapp service"
        sleep(5)
Run Code Online (Sandbox Code Playgroud)

它在我运行app时有效,因为app会调用该服务:

def __start_service(self):
    if platform == 'android':
        service = autoclass('net.saband.myapp.ServiceMyservice')
        mActivity = autoclass('org.kivy.android.PythonActivity').mActivity
        argument = ''
        service.start(mActivity, argument)
Run Code Online (Sandbox Code Playgroud)

更新(AndroidManifest)

这是我的AndroidManifest.xml中的一些字符串.

  1. 我有RECEIVE_BOOT_COMPLETED权限:

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

  2. 我有接收器:

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

  3. 我有服务注册:

    <service android:name="net.saband.myapp.ServiceMyservice" android:process=":service_myservice" />

根据@mariachi的建议,我试图更改android:enabled="true" to android:enabled="false"接收器并添加android:exported="false"到服务中.在这种情况下,当设备启动时没有发生任何事情:没有错误,没有服务.

sab*_*and 2

我的天啊!我通过解决kivy service 的另一个问题找到了解决方案。只需添加一些额外的内容就足够了。这是工作代码:

package net.saband.myapp;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import net.saband.myapp.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/main.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);
    }
}
Run Code Online (Sandbox Code Playgroud)