【问题标题】:Start android service from Unity3D code从 Unity3D 代码启动 android 服务
【发布时间】:2016-07-14 08:07:09
【问题描述】:

在我的 Android Unity3D 应用程序中,我需要启动一个服务,该服务将在后台运行。我无法弄清楚我该怎么做。 startService() 方法必须在活动上调用,但我不知道如何将当前的统一活动从统一脚本传递到我的 android 插件。而且我还没有找到任何方法来获取静态方法中的活动并在其中运行 startService()

据我了解的顺序,我需要获取主要的 Unity3D 活动并从中启动服务。

我的班级应该调用该服务。

public final class StatusCheckStarter {

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

此代码不起作用,因为“无法解析方法 startService”并且我没有任何东西可以传入 this 参数。我需要获取当前活动。

【问题讨论】:

    标签: c# android unity3d plugins service


    【解决方案1】:

    以下是向使用onCreate函数或从UnityPlayerActivity扩展的Java插件发送Activity实例/引用的两种方法。

    方法一:发送Activity引用一次,然后将其存储在Java中的静态变量中以供重复使用:

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

    方法二:在每个函数调用中发送Activity引用。

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

    注意您必须将com.example.StatusCheckStarter 替换为您的StatusCheckStarter 类的完整包。

    【讨论】:

    • 第一种方法有效,我什至不必尝试第二种方法。谢谢。
    • @TengkuFathullah 使用 Android Studio。将其编译成 jaraar 插件扩展并将其放置在 Unity Assets/Plugins/Android 路径中。这不是这个答案的范围,您可以从字面上搜索如何为 Unity 制作 Java 插件。
    • @Programmer 我浏览了很多网站,但偶然发现了 android studio 我不知道是否需要扩展服务类或活动。我添加了新的 android 模块。
    • 我真的很喜欢简单的第二种方法。它不依赖于静态成员
    猜你喜欢
    • 1970-01-01
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多