2017-10-21 184 views
10

我试图在启动时启动我的kivy应用服务。在启动时启动Kivy服务(Android)

我确定我的服务没问题,因为它在我启动我的应用程序时起作用。但是在启动时我有一个问题。

我读过this article并试图使它:

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); 
    } 
} 

它的工作原理,但启动应用程序,但不是服务。所以,我研究了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); 
    } 
} 

...并得到了一个错误:

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 [email protected] 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 

能否请您给我解释一下什么是错的,我该怎么办开始服务?谢谢!

修订

通过@Juggernaut请求添加我的服务代码:

from time import sleep 

if __name__ == '__main__': 
    while True: 
     print "myapp service" 
     sleep(5) 

它,当我运行的应用程序的工作原理,因为应用程序调用该服务:

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) 

已更新(AndroidManifest)

以下是我的AndroidManifest.xml中的一些字符串。

  1. 我有项值权限:

    <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"的服务。在这种情况下,设备启动时什么也不发生:没有错误,没有服务。

+0

https://stackoverflow.com/a/32033021/6764079 – Juggernaut

+0

@Juggernaut感谢你的意见,但我不明白它是如何能帮助我。我试图检查ix.getExtras(),是的它是空的,但我不明白为什么,不明白我应该在这里做什么? – saband

+0

也许你应该与我们分享你的服务代码 – Juggernaut

回答

0

OMG!我通过解决my another issue with 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); 
    } 
} 
1

您似乎尝试启动的服务或活动未初始化。 你没有粘贴你的AndroidManifest,所以我会写它应该有的。

的第一件事是,你应该有权限添加到开机运行:

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

第二件事是,你应该在清单定义你的接收器:

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

的第三件事是您应该定义您尝试启动的服务或活动,例如:

<activity android:name=".PythonActivity" /> 
    <service android:name=".ServiceMyservice" android:exported="false"/> 
+0

谢谢你的答案,但它没有帮助。我已经更新了我的AndroidManifest问题,我已经尝试在接收器中将'android:enabled =“true”'更改为'android:enabled =“false”'并添加'android:exported =“虚假“的服务。但在这种情况下,当设备启动时不会发生任何事情:没有错误,没有服务。 – saband

+0

启动时没有错误是您的应用的好兆头。你可以在你的活动/服务起点放一个记录器来检查你是否收到来自BroadcastReceiver的任何东西? – mariachi

+0

当然。看起来像BroadcastReceiver没有被调用或没有收到任何东西,因为我没有看到我的Log.d消息,如果我使用我的版本('android:enabled =“true”',没有'android:exported =“false”')我可以看到我的Log.d消息。 – saband