Mobile-하이브리드앱

전자정부 모바일 하이브리드(Cordova/폰갭) Plugin에서 MainActivity호출하기, 다른액티비티 화면 띄우기 - 안드로이드 (수정)

무한열정 2016. 9. 4. 15:43

플러그인에서 네이티브 화면을 추가해야 할 경우가 있는데

이때는 다음과 같이 하면 쉽다.


public class MainActivity extends CordovaActivity

{


public void callMainAcitivity() {

Toast.makeText(getApplicationContext(), "Response MainActivity from CordovaPlugin ^^", Toast.LENGTH_SHORT).show();

}

우선 다음과 같이 되어 있다고 하면

이걸 코도바(폰갭) 프러그인에서 호출해야 할 필요가 있을수 있다.


이경우는 다음과 같이 Plugin에서 다음과 같이 초기화한다.

public class CustomPlugin extends CordovaPlugin  {


    private final String ACTION_ECHO = "echo";

    private MainActivity activity = null;


    /** 

     * Override the plugin initialise method and set the Activity as an 

     * instance variable.

     */

    @Override

    public void initialize(CordovaInterface cordova, CordovaWebView webView

    {

        super.initialize(cordova, webView);


        // Set the Activity.

        this.activity = (MainActivity) cordova.getActivity();

    }

.......... ~~ 생략


MainActivity를 호출할때는 플러그인클래스에 다음과 같이 추가하면 호출이 가능하다.

        // 메인 액티비티 호출 테스트 

        activity.callMainAcitivity();


* 플러그인에서 새로운 액티비티호출

위에서 이미 actvity의 인스턴스를 얻었으므로 아주 쉽다.

다음과 같이 일반적으로 네이티브에서 액티비티 호출하는 방식으로 하면 되서 아주 쉽다. ^___^

Intent intent = new Intent(activity,

ContactListActivity.class)

.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP

| Intent.FLAG_ACTIVITY_SINGLE_TOP);


activity.startActivityForResult(intent, 10001);


* 위와 같이 하는경우 안드로이드 ICS이상에서 UI제어의 경우 Main Thread에서 처리해야 한다.

  그 이유는 사용자의 사용성이 나빠질수 있기 때문이다..

  예를 들면 네트워크 통신중이라거나 할때 UI를 제어하면 먹통처럼 보일수 있기때문에 그렇다. 이 부분은 iOS도 동일한 사항이다. ^^

  만약 이 규칙을 지키지 않으면 이런 메시지가 날수 있다..

09-08 13:59:55.836: W/System.err(12501): android.view.ViewRootImpl$CalledFromWrongThreadException: only the original thread that created a view hierarchy can touch its views.

09-08 13:59:55.836: W/System.err(12501): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6556)

09-08 13:59:55.836: W/System.err(12501): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:942)

09-08 13:59:55.836: W/System.err(12501): at android.view.ViewGroup.invalidateChild(ViewGroup.java:5081)


* 다음과 같이 추가 수정을 한다.

    activity.runOnUiThread(new Runnable() {

            public void run() {

        Intent intent = new Intent(activity,

        ContactListActivity.class)

        .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP

        | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        

            activity.startActivityForResult(intent, 10001);

            }


     });

Activity 클래스에 보면 runOnUIThread라는 메소드가 있으니 요걸 쓰는게 가장 평한 방법이다. ^^