마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

메인 액티비티가 작동중인지를 확인하고 싶습니다.

0 추천

저는 유니티 액티비티와 연결해서 프로젝트를 만드는 중입니다.

유니티를 종료할때 안드로이드로 데이터를 보내는데 이 데이터를 메인액티비티에서 받아야합니다.

그런데 플러그인이 메인 소스에 포함되어있는게 아니라 클래스 파일로 만들어져 있어 메인 액티비에로 받을 수가 없습니다.

'플러그인 소스를 메인 소스에 포함 시키면 되는게 아니냐' 라고 생각하시는 분들이 계실텐데 제가 그렇게

해보았더니 작동이 되지않아 클래스 파일을 만들어서 작업중입니다.

플러그인 클래스 파일에서 현재 작동중인 메인 액티비티 객체를 받아 메인에 있는 메소드를 실행시키고 싶은데 방법이 있을까요??

.tb_button {padding:1px;cursor:pointer;border-right: 1px solid #8b8b8b;border-left: 1px solid #FFF;border-bottom: 1px solid #fff;}.tb_button.hover {borer:2px outset #def; background-color: #f8f8f8 !important;}.ws_toolbar {z-index:100000} .ws_toolbar .ws_tb_btn {cursor:pointer;border:1px solid #555;padding:3px} .tb_highlight{background-color:yellow} .tb_hide {visibility:hidden} .ws_toolbar img {padding:2px;margin:0px}
요리킹조리킹 (240 포인트) 님이 2020년 10월 19일 질문
질문이 명료하지 않습니다. 유니티를 모르는 저같은 개발자는 전혀 이해가 가지 않네요. 어떤 데이터를 어떤 방식으로 받으려고 하시는지 구체적으로 말씀하지 않으시면 도움주기가 곤란할 것 같다는 생각이 듭니다.
안녕하세요 spark님!
질문이 명료하지 않아 댓글로 다시 적어드립니다. ㅎㅎ
저도 유니티를 접한지 얼마되지 않아 단어 선택이 이상 할 수도 있는점 참고해주시면 감사하겠습니다.
우선 유니티에서 종료를 할 때 네이티브로 안드로이드에 있는 클래스의 메소드를 호출합니다.

아래는 유니티에서 사용중인 C#코드입니다.
void sendResultToJava3(string value)
    {
        using (AndroidJavaClass javaPlugin = new AndroidJavaClass("com.company.app.main.MyPlugin"))
        {
                AndroidJavaObject pluginInstance = javaPlugin.CallStatic<AndroidJavaObject>("instance");
                pluginInstance.CallStatic("receiveResult", value);
        }
    }

메인 엑티비티의 내부 클래스 MyPlugin에서 receiveResult를 호출하고 값을 보내줍니다.



아래는 유니티로 부터 받는 메인 엑티비티의 내부 클래스 입니다.
public class main extends AppCompatActivity implements SensorEventListener {
...

public static class MyPlugin {
        //Make class static variable so that the callback function is sent to one instance of this class.
        public static MyPlugin testInstance;

        public static MyPlugin instance() {
            if (testInstance == null) {
                testInstance = new MyPlugin();
            }
            return testInstance;
        }

        String result = "";


        public String UnitySendMessageExtension(String gameObject, String functionName, String funcParam) {
            UnityPlayer.UnitySendMessage(gameObject, functionName, funcParam);
            String tempResult = result;
            return tempResult;
        }

        //Receives result from C# and saves it to result  variable
        public static void receiveResult(String value) {
            String result = "";//Clear old data
            result = value; //Get new one
            Log.e("unityReturnValue", "static class unity value : " + result);
            tnm.ArMissionReturn(value);
        }
    }
}

이런식으로 되어있습니다.

제가 원하는 것은 receiveResult메소드가 작동되는 것입니다.
작동이 안된다는 게 receiveResult가 호출이 안되시는 건지, 아니면 tnm.ArmMissonReturn만 호출이 안되는 건지, 아니면 다른 문제인지요? 만약 receiveResult가 호출되지 않는다면, 그건, AndroidJavaObject의 사용법이 잘못된 것이겠구요. tnm.ArMissionReturn이나 그외 부분이라면, 여기에 대해서는 전혀 정보가 있어서 모르겠지만, 디버깅이 가능하시다면 값은 들어가는지, 어떤 값이 들어가는지 정확하게 먼저 확인을 하셔서 문제가 발생하는 부분에 대한 범위를 줄여나가시라고 말씀드리고 싶네요.

참고로 instance 메소드는 정확하게 동작하는 singleton 생성 방식이 아니예요. 쓰레드에 안정하지도 않고 serialization에도 문제가 있어요. 아래같이 사용하세요.

public class MyPlugin {
     private MyPlugin() {}

     public static MyPlugin getInstance() {
        return Impl.INSTANCE;
     }

     private static final class Impl {
         static final MyPlugin INSTANCE = new MyPlugin();
     }
}

한가지 더요.
String result = "";//Clear old data
result = value; //Get new one

이 부분은 좀 서프라이즈 한 코드네요. String result = value; 왜 안되는건지 의아하구요. 주석과 같은 의도라면 아래처럼 별도의 메소드로 축출할 수 있어야 하는데, 축출해 보면 이상합니다.
private String clearOldDataAndGetNewOne(String newValue) {
     String result = "";
     result = value;
     return value;
}

그냥 아래처럼 주석을 없애고 좀 더 명료한 이름으로 바꾸시면 될 것 같아요.
public static void receiveFromCSharpAndSaveResult(String value) {
            Log.e("unityReturnValue", "static class unity value : " + result);
            tnm.ArMissionReturn(value);
}

그리고 이 메소드를 사용하는 쪽에서 tnm.ArMissionReturn(value) 를 바로 호출하도록 바꾸어도 상관이 없어 보이네요.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...