Start android service from Unity3D code

匿名 (未验证) 提交于 2019-12-03 07:50:05

问题:

In my Unity3D application for android I need to start a service, which will run in background. I can't figure it out how can I do it. The method startService() has to be invoked on an activity, but I do not know how to pass the current unity activity from unity script to my android plugin. And I haven't found any way to get the activity in a static method and run startService() in it.

As far as I understand the sequence, I need to get main Unity3D activity and start the service from it.

My class which is supposed to call the service.

public final class StatusCheckStarter {      public static void StartCheckerService()     {         startService(new Intent(this, CheckService.class));     } } 

This code does not work, because "Cannot resolve method startService" and I have nothing to pass in this argument. I need to get the current activity.

回答1:

Below are two ways to send Activity instance/reference to Java plugin that doesn't use the onCreate function or extend from UnityPlayerActivity.

Method 1: Send Activity reference once then store it in a static variable in Java for re-usual:

Java:

public final class StatusCheckStarter {      static Activity myActivity;      // Called From C# to get the Activity Instance     public static void receiveActivityInstance(Activity tempActivity) {         myActivity = tempActivity;     }      public static void StartCheckerService() {         myActivity.startService(new Intent(myActivity, CheckService.class));     } } 

C#:

AndroidJavaClass unityClass; AndroidJavaObject unityActivity; AndroidJavaClass customClass;  void Start() {     //Replace with your full package name     sendActivityReference("com.example.StatusCheckStarter");     //Now, start service    startService(); }  void sendActivityReference(string packageName) {     unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");     unityActivity = unityClass.GetStatic("currentActivity");     customClass = new AndroidJavaClass(packageName);     customClass.CallStatic("receiveActivityInstance", unityActivity); }  void startService() {     customClass.CallStatic("StartCheckerService"); } 

Method 2: Send Activity reference in each function call.

Java:

public final class StatusCheckStarter {      public static void StartCheckerService(Activity tempActivity) {         tempActivity.startService(new Intent(tempActivity, CheckService.class));     } } 

C#:

void Start() {     //Replace with your full package name     startService("com.example.StatusCheckStarter"); }  void startService(string packageName) {     AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");     AndroidJavaObject unityActivity = unityClass.GetStatic("currentActivity");     AndroidJavaClass customClass = new AndroidJavaClass(packageName);     customClass.CallStatic("StartCheckerService", unityActivity); } 

Note: You must replace com.example.StatusCheckStarter with the full package of your StatusCheckStarter class.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!