c# - 从Unity3D代码启动android服务

标签 c# android unity3d plugins service

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

据我所知,我需要获取主要的 Unity3D Activity 并从中启动服务。

我的类应该调用该服务。

public final class StatusCheckStarter {

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

此代码不起作用,因为“无法解析方法 startService”并且我没有任何内容可以传递给 this 参数。我需要获取当前 Activity 。

最佳答案

以下是将 Activity 实例/引用发送到 使用 onCreate 函数或从 UnityPlayerActivity.

方法1:发送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");
}

方法 2:在每个 函数调用中发送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 类的完整包。

关于c# - 从Unity3D代码启动android服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38368762/

相关文章:

Android L(5.0)在eclipse中不搜索 “armeabi”或 "armeabi-v7a"文件夹(UnsatisfiedLinkError)中的原生库

android - 如何检查Content Provider中是否有数据

android - 发送彩信确实包含 "sms_body"

android - 找不到 manifest-merger.jar (com.android.tools.build :manifest-merger:26. 0.1)

c# - ASP.NET Core 2.1 不引人注目的 Ajax 验证不适用于部分 View 表单交换

c# - 如何使 PayPal Agreement start_date 在 ASP.NET 的 PayPal SDK 中有效

C# 7 如何对本地函数进行单元测试

c# - wp7 列表框元素点击 'sender' 对象唯一性

c# - 在 Unity 编辑器中使用 AddComponent 脚本撤消移除游戏对象(播放模式)

unity3d - 检查对象是否完全通过另一个对象 Unity3d