안드로이드 운영체제에서 하나 이상의 NexacroActivity 사용하기

이전 버전에서는 NexacroActivity를 종료하는 경우 앱이 종료되는 제약을 가지고 있습니다. 이를 보완하기 위해 2개 이상의 NexacroActivity를 관리할 수 있도록 기능을 보완했습니다.

간략하게 기능 설명을 위해 넥사크로 Form에서 Application 생성을 요청하는 방식을 사용했습니다. 아래 내용에서는 4가지 내용을 다룹니다.

MainActivity.java

NexacroUpdatorActivity 파생 클래스인 MainActivity.java 코드 작성 시 아래와 같이 추가 인터페이스를 작성해주어야 합니다.

기존 방식처럼 createInstance 를 사용하는 방법과 Application에서 Resource Manager를 가져와서 처리하는 방법 2가지 모두 사용할 수 있습니다.

...
@Override
public void onCreate(Bundle savedInstanceState) {
	NexacroResourceManager resourceManager = NexacroResourceManager.createInstance(this);
	resourceManager.setBootstrapURL("http://[URL]/start_android.json");
	resourceManager.setProjectURL("http://[URL]/");
	//resourceManager.setContentMode(true);
	//resourceManager.setFDL("FrameBase::Form_Work.xfdl");
	...
}
...
@Override
public void onCreate(Bundle savedInstanceState) {
	// naxacro 초기화
	Nexacro nexacro = Nexacro.getInstance(this);
	if (!nexacro.isInitialized())
		nexacro.initialize();

	// Application 생성
	NexacroApplication application = nexacro.newApplication();
	// Resource Manager 설정
	NexacroResourceManager resourceManager = application.getResourceManager();
	resourceManager.setBootstrapURL("http://[URL]/start_android.json");
	resourceManager.setProjectURL("http://[URL]/");
	//resourceManager.setContentMode(true);
	//resourceManager.setFDL("FrameBase::Form_Work.xfdl");
	...
}

MainActivity 실행 시 특정 폼을 실행하고자 한다면 아래와 같이 setContentMode 함수에서 true 값을 설정하고 setFDL 함수에 form 파일명을 지정합니다.

public void onCreate(Bundle savedInstanceState) {
	...
	resourceManager.setContentMode(true);
	resourceManager.setFDL("FrameBase::Form_Work.xfdl");
	...

ExampleActivity.java

NexacroActivity 파생 클래스인 ExampleActivity.java 코드는 아래와 같이 작성할 수 있습니다. 아래 예제는 넥사크로 Form에서 system.execBrowser 메소드를 사용해 특정 Form 이름을 넘겨주고 이를 받아서 Application을 생성합니다.

public class ExampleActivity extends NexacroActivity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// Intent로 부터 호출할 FDL 이름을 확인
		Uri data = getIntent().getData();
		String formName = data.getHost();
        
		// 설정한 이름(key)으로 nexacro application을 생성
		createNexacroApplication(formName);
		
		// Resource Manager 설정
		NexacroResourceManager resourceManager = getNexacroApplication().getResourceManager();
		resourceManager.setBootstrapURL("http://[URL]/start_android.json");
		resourceManager.setProjectURL("http://[URL]/");

        resourceManager.setContentMode(true);
        resourceManager.setFDL("FrameBase::" + formName + ".xfdl");

        super.onCreate(savedInstanceState);
    }
}

AndroidManifest.xml

기존에는 NexacroUpdatorActivity 파생 클래스(nexacro.launcher.MainActivity)만 설정했으나 아래와 같이 NexacroActivity 파생 클래스(nexacro.launcher.ExampleActivity)를 설정할 수 있습니다.

...
	<activity android:name="nexacro.launcher.ExampleActivity"
		android:windowSoftInputMode="adjustResize"
		android:theme="@style/Theme.AppCompat.Light.NoActionBar"
		android:configChanges="orientation|keyboardHidden|screenSize">
		<intent-filter>
			<action android:name="android.intent.action.VIEW"/>
			<category android:name="android.intent.category.DEFAULT"/>
			<category android:name="android.intent.category.BROWSABLE"/>
			<data android:scheme="nexacro"/>
		</intent-filter>
	</activity>
...

Form.xfdl

넥사크로 Form에서는 아래와 같이 system.execBrowser 메소드를 사용해 폼 이름을 넘겨주고 NexacroActivity에서 특정 폼을 실행할 수 있도록 합니다. "nexacro"라는 스키마명은 AndroidManifest.xml에서 설정한 이름입니다.

this.Button01_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
	system.execBrowser("nexacro://Sample");
};

NexacroActivity에서 실행된 폼은 독립된 Application으로 동작하기 때문에 exit 메소드를 실행하면 해당 Activity만 종료합니다.

this.Button01_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
	nexacro.getApplication().exit();
};