플러그인에서 네이티브 화면을 추가해야 할 경우가 있는데
이때는 다음과 같이 하면 쉽다.
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라는 메소드가 있으니 요걸 쓰는게 가장 평한 방법이다. ^^