Start android service from Unity3D code

前端 未结 1 857
感动是毒
感动是毒 2020-12-01 19:38

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()

相关标签:
1条回答
  • 2020-12-01 19:42

    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<AndroidJavaObject>("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<AndroidJavaObject>("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.

    0 讨论(0)
提交回复
热议问题