자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey 델파이 파이어몽키 안드로이드 앱 내에 스플래시 스크린추가
2013.12.02 09:21
델파이로 만드는 안드로이드앱 플래시 화면 생성
델파이로 안드로이드앱을 만들면 어플의 메인 화면이 나타나기까지 약 4~5초의 시간이 소요됩니다.
어플을 프로페셔널하게 보이게 하기위해서는 순수안드로이드 개발툴(이클립스)로개발한 어플처럼 짧은 시간내에 메인화면이 나타나거나,스플래시 화면을 먼저보여주고 메인폼을 불러옴으로써 어색함을 없앨 수 있는데,델파이는 기본적으로 이 부분을 지원하지 않습니다.(다음번 업데이트시 개선되길 기대해 봅니다)
위에 적시 했드시 델파이에서 이 기능을 자체적으로 지원하지 않기때문에이 문제를 해결하기 위해서는 약간의 노력이 필요합니다.
절차는 아래와 같습니다.
1. 안드로이드 스플래시화면 기능을 가진 자바 클래스를 만든다. 반드시 Activity로 부터 상속되어야합니다. (Intent파일)
2. javac로 컴파일한다
3. jar로 묶어준다
4. dex로 변환한다. dex란 Dalvik Executable format을 의미합니다.
5. 델파이에서 사용될수 있도록 com.android.dx.merge.DexMerger 로 머징 시킨다.
6. 1번에서 만든 Intent(java)가 먼저로딩 될 수 있게 AndroidManifest.xml을 수정한다.
7. 델파이 Project:Deploment를 5에서 머징시킨 dex파일이 배포될 수 있게 수정한다.
8. 컴파일.
이상의 과정을 거치게 됩니다.안드로이드 네이티브 프로그래밍을 해보신 분은 1~6번 과정이 어렵지 않겠지만델파이 개발자는 위 부분이 어려움으로아래에 절차를 자세히 설명하도록 하겠습니다.
폴더구조 C:\Project\DelphiFMSplashScreen <-- 예제 프로젝트 루트C:\Project\DelphiFMSplashScreen\res\layout <-- java소스가 사용하는 리소스 위치C:\Project\DelphiFMSplashScreen\res\layout\delphisplash.xml <-- java리스소 파일.C:\Project\DelphiFMSplashScreen\java\src\com\chanwooapp\delphisplash <-- splashscreen java 소스파일이 있는 위치
=============================1번과정.
1.1 java파일은 아무 에디터에서나 작성할 수 있지만 문법이 맞는지 알기 어려움으로 eclipse를 깔아서 사용하거나1.2 인터넷에서 "Android Splash" 등의 키워드를 입력하면 데모소스가 아주 많습니다. (그중에서 자신의 마음에 드는 소스를 이용 하면됩니다.)
아래 제가 사용한 소스입니다.(DelphiSplashActivity.java)대충 어떤내용인지 델파이만 하신분도 짐작하실것입니다.
package com.chanwooapp.delphisplash;
import android.app.Activity;import android.content.Intent;import android.os.Bundle;
public class DelphiSplashActivity extends Activity { private int getSplash(String resourceName, String resourceType) { return this.getResources().getIdentifier(resourceName, resourceType, this.getPackageName()) ; } private void loadMainIntent() { Intent launchIntent = new Intent(); // 델파이 메인 Intent 클래스를 로딩합니다. launchIntent.setClassName(DelphiSplashActivity.this, "com.embarcadero.firemonkey.FMXNativeActivity"); startActivity(launchIntent); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
// 리소스 파일에서 뷰형태를 읽어서 화면을 불러옵니다. setContentView(getSplash("delphisplash", "layout")); final int welcomeScreenDisplay = 1000; Thread welcomeThread = new Thread() { int wait = 0;
@Override public void run() { try { super.run(); // 약1초대기후 while (wait < welcomeScreenDisplay) { sleep(100); wait += 100; } } catch (Exception e) { System.out.println("EXc=" + e); } finally { // 델파이메인화면 (intent)을 불러옵니다. loadMainIntent(); // 쓰래드를 종료합니다. finish(); } } }; welcomeThread.start(); }}
소스에서 ---------- // 약1초대기후 while (wait < welcomeScreenDisplay) { sleep(100); wait += 100; }위 부분을 보면 welcomeScreenDisplay 정의에 의해서 약1초 후쓰레드가 종료되면서 델파이 메인화면을 불러오게 되어 있습니다.
정확한시간(5초)을 설정해도 됩니다만델파이 실행화일(메인폼)이 뜨는데 4~5초 걸리기 때문에 1초대기후(사실 1초를 지정하지 않아도됩니다.) 델파이 메인폼을 불러오게 하였습니다(이부분이 4~5초걸리기 때문에총 4~5초 후에 델파이 메인폼이 나타납니다.)
델파이는 순수 안드로이드 처럼 각폼을 별개의 의도(Intent)로 관리하지 않고실행파일 전체가 하나의 의도(Intent)로 되어 있어서메모리에 로딩하는데 시간이 걸립니다.
안드로이드는 각각의 폼을 Intent로 관리하고그것을 OS레벨에서 관리하기때문에intent를 정확히 알면 다른 어플의 Intent라도 로딩할 수 있는 구조입니다.그런데 델파이에서는 이부분이 하나로 되어 있고, 기본크기가 너무 크서로딩하는 시간이 걸리고, 안드로이드에서 실행되기 위해 준비하는 작업도 많은것 같습니다.
C:\Project\DelphiFMSplashScreen\java\src\com\chanwooapp\delphisplash\DelphiSplashActivity.java 로 저장합니다.
===============================2. javac로 컴파일한다(javac 사용법은 javac 도움말을 참고하세요)
C:\Project\DelphiFMSplashScreen\java <-- 위치로 이동한 후.
javac -verbose -Xlint:deprecation -cp C:\adt-bundle\sdk\platforms\android-19\android.jar -d output\classes src\com\chanwooapp\delphisplash\DelphiSplashActivity.java
* output\classes <-- 결과물(\DelphiSplashActivity.class) 이 저장될위치 * src\com\chanwooapp\delphisplash\DelphiSplashActivity.java <-- 자바파일 위치
결과물이 아래와 같이 생성됩니다.
C:\Project\DelphiFMSplashScreen\java\output\classes\com\chanwooapp\delphisplash\DelphiSplashActivity.class
===============================3. jar로 묶어준다jar cvf output\jar\test_classes.jar -C output\classes com
===============================4. dex로 변환한다.
C:\adt-bundle\sdk\build-tools\android-4.4\dx --dex --verbose --output=C:\Project\DelphiFMSplashScreen\java\output\dex\test_classes.dex --positions=lines C:\Project\DelphiFMSplashScreen\java\output\jar\test_classes.jar
* C:\adt-bundle\sdk\build-tools\android-4.4 <-- 설치된 안드로이드 버전
===============================5. 델파이에서 사용될수 있도록 com.android.dx.merge.DexMerger 로 머징 시킨다.
java -cp C:\adt-bundle\sdk\build-tools\android-4.4\lib\dx.jar com.android.dx.merge.DexMerger C:\Project\DelphiFMSplashScreen\java\output\dex\classes.dex C:\Project\DelphiFMSplashScreen\java\output\dex\test_classes.dex "C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\lib\android\debug\classes.dex"
* "C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\lib\android\debug\classes.dex" <-- 델파이용 dex도 같이 머징시킴.
===============================6. 1번에서 만든 Intent(java)가 먼저로딩 될 수 있게 AndroidManifest.xml을 수정한다. 기본파일을 아래와 같이 수정합니다.
<?xml version="1.0" encoding="utf-8"?><!-- BEGIN_INCLUDE(manifest) --><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%">
<!-- This is the platform API where NativeActivity was introduced. --> <uses-sdk android:minSdkVersion="%minSdkVersion%" /><%uses-permission%> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:installLocation="%installLocation%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%"> <activity android:name="com.chanwooapp.delphisplash.DelphiSplashActivity" <----- 스플래시 인텐트 android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <----- 안드로이드OS에서 로딩 <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
<!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboardHidden"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" />
</activity> <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" /> </application></manifest> <!-- END_INCLUDE(manifest) -->
===============================7. 델파이 Project:Deploment를 5에서 머징시킨 dex파일이 배포될수 있게 수정한다.
제거--> 기본 classes.dex추가--> C:\Project\DelphiFMSplashScreen\res\layout\delphisplash.xml --> res\layout\ 추가--> C:\Project\DelphiFMSplashScreen\java\output\dex\classes.dex --> classes\
===============================8. 컴파일.
위 명령어는 path에 묶여있으면 Pullpath를 적지않아도 되며,배치파일에서 설정 해주면 쉽게 사용할 수 있습니다.java\build.bat참조.
스플래시화면에서 애니메이션이나 이미지를 표시하려면그러한 기능을 하는 intent클래스를 만들어서 위의 과정을 거쳐 컴파일한 후리소스파일과, classes.dex 파일을delphi에 포함시키면 됩니다.
이상입니다.
Firemonkey 델파이 파이어몽키 안드로이드 앱 내에 스플래시 스크린추가
2013.12.02 09:21
델파이로 만드는 안드로이드앱 플래시 화면 생성
델파이로 안드로이드앱을 만들면 어플의 메인 화면이 나타나기까지 약 4~5초의 시간이
소요됩니다.
어플을 프로페셔널하게 보이게 하기위해서는 순수안드로이드 개발툴(이클립스)로
개발한 어플처럼 짧은 시간내에 메인화면이 나타나거나,
스플래시 화면을 먼저보여주고 메인폼을 불러옴으로써 어색함을 없앨 수 있는데,
델파이는 기본적으로 이 부분을 지원하지 않습니다.
(다음번 업데이트시 개선되길 기대해 봅니다)
위에 적시 했드시 델파이에서 이 기능을 자체적으로 지원하지 않기때문에
이 문제를 해결하기 위해서는 약간의 노력이 필요합니다.
절차는 아래와 같습니다.
1. 안드로이드 스플래시화면 기능을 가진 자바 클래스를 만든다. 반드시 Activity로 부터 상속되어야합니다.
(Intent파일)
2. javac로 컴파일한다
3. jar로 묶어준다
4. dex로 변환한다. dex란 Dalvik Executable format을 의미합니다.
5. 델파이에서 사용될수 있도록 com.android.dx.merge.DexMerger 로 머징 시킨다.
6. 1번에서 만든 Intent(java)가 먼저로딩 될 수 있게 AndroidManifest.xml을 수정한다.
7. 델파이 Project:Deploment를 5에서 머징시킨 dex파일이 배포될 수 있게 수정한다.
8. 컴파일.
이상의 과정을 거치게 됩니다.
안드로이드 네이티브 프로그래밍을 해보신 분은 1~6번 과정이 어렵지 않겠지만
델파이 개발자는 위 부분이 어려움으로
아래에 절차를 자세히 설명하도록 하겠습니다.
폴더구조
C:\Project\DelphiFMSplashScreen <-- 예제 프로젝트 루트
C:\Project\DelphiFMSplashScreen\res\layout <-- java소스가 사용하는 리소스 위치
C:\Project\DelphiFMSplashScreen\res\layout\delphisplash.xml <-- java리스소 파일.
C:\Project\DelphiFMSplashScreen\java\src\com\chanwooapp\delphisplash <-- splashscreen java 소스파일이 있는 위치
=============================
1번과정.
1.1 java파일은 아무 에디터에서나 작성할 수 있지만 문법이 맞는지 알기 어려움으로 eclipse를 깔아서 사용하거나
1.2 인터넷에서 "Android Splash" 등의 키워드를 입력하면 데모소스가 아주 많습니다.
(그중에서 자신의 마음에 드는 소스를 이용 하면됩니다.)
아래 제가 사용한 소스입니다.(DelphiSplashActivity.java)
대충 어떤내용인지 델파이만 하신분도 짐작하실것입니다.
package com.chanwooapp.delphisplash;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class DelphiSplashActivity extends Activity {
private int getSplash(String resourceName, String resourceType)
{
return this.getResources().getIdentifier(resourceName, resourceType, this.getPackageName()) ;
}
private void loadMainIntent()
{
Intent launchIntent = new Intent();
// 델파이 메인 Intent 클래스를 로딩합니다.
launchIntent.setClassName(DelphiSplashActivity.this, "com.embarcadero.firemonkey.FMXNativeActivity");
startActivity(launchIntent);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 리소스 파일에서 뷰형태를 읽어서 화면을 불러옵니다.
setContentView(getSplash("delphisplash", "layout"));
final int welcomeScreenDisplay = 1000;
Thread welcomeThread = new Thread() {
int wait = 0;
@Override
public void run() {
try {
super.run();
// 약1초대기후
while (wait < welcomeScreenDisplay) {
sleep(100);
wait += 100;
}
} catch (Exception e) {
System.out.println("EXc=" + e);
} finally {
// 델파이메인화면 (intent)을 불러옵니다.
loadMainIntent();
// 쓰래드를 종료합니다.
finish();
}
}
};
welcomeThread.start();
}
}
소스에서 ----------
// 약1초대기후
while (wait < welcomeScreenDisplay) {
sleep(100);
wait += 100;
}
위 부분을 보면 welcomeScreenDisplay 정의에 의해서 약1초 후
쓰레드가 종료되면서 델파이 메인화면을 불러오게 되어 있습니다.
정확한시간(5초)을 설정해도 됩니다만
델파이 실행화일(메인폼)이 뜨는데 4~5초 걸리기 때문에
1초대기후(사실 1초를 지정하지 않아도됩니다.)
델파이 메인폼을 불러오게 하였습니다(이부분이 4~5초걸리기 때문에
총 4~5초 후에 델파이 메인폼이 나타납니다.)
델파이는 순수 안드로이드 처럼 각폼을 별개의 의도(Intent)로 관리하지 않고
실행파일 전체가 하나의 의도(Intent)로 되어 있어서
메모리에 로딩하는데 시간이 걸립니다.
안드로이드는 각각의 폼을 Intent로 관리하고
그것을 OS레벨에서 관리하기때문에
intent를 정확히 알면 다른 어플의 Intent라도 로딩할 수 있는 구조입니다.
그런데 델파이에서는 이부분이 하나로 되어 있고, 기본크기가 너무 크서
로딩하는 시간이 걸리고, 안드로이드에서 실행되기 위해 준비하는 작업도 많은것 같습니다.
C:\Project\DelphiFMSplashScreen\java\src\com\chanwooapp\delphisplash\DelphiSplashActivity.java 로 저장합니다.
===============================
2. javac로 컴파일한다
(javac 사용법은 javac 도움말을 참고하세요)
C:\Project\DelphiFMSplashScreen\java <-- 위치로 이동한 후.
javac -verbose -Xlint:deprecation -cp C:\adt-bundle\sdk\platforms\android-19\android.jar -d output\classes src\com\chanwooapp\delphisplash\DelphiSplashActivity.java
* output\classes <-- 결과물(\DelphiSplashActivity.class) 이 저장될위치
* src\com\chanwooapp\delphisplash\DelphiSplashActivity.java <-- 자바파일 위치
결과물이 아래와 같이 생성됩니다.
C:\Project\DelphiFMSplashScreen\java\output\classes\com\chanwooapp\delphisplash\DelphiSplashActivity.class
===============================
3. jar로 묶어준다
jar cvf output\jar\test_classes.jar -C output\classes com
===============================
4. dex로 변환한다.
C:\adt-bundle\sdk\build-tools\android-4.4\dx --dex --verbose --output=C:\Project\DelphiFMSplashScreen\java\output\dex\test_classes.dex --positions=lines C:\Project
\DelphiFMSplashScreen\java\output\jar\test_classes.jar
* C:\adt-bundle\sdk\build-tools\android-4.4 <-- 설치된 안드로이드 버전
===============================
5. 델파이에서 사용될수 있도록 com.android.dx.merge.DexMerger 로 머징 시킨다.
java -cp C:\adt-bundle\sdk\build-tools\android-4.4\lib\dx.jar com.android.dx.merge.DexMerger C:\Project\DelphiFMSplashScreen\java\output\dex\classes.dex C:\Project
\DelphiFMSplashScreen\java\output\dex\test_classes.dex "C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\lib\android\debug\classes.dex"
* "C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\lib\android\debug\classes.dex" <-- 델파이용 dex도 같이 머징시킴.
===============================
6. 1번에서 만든 Intent(java)가 먼저로딩 될 수 있게 AndroidManifest.xml을 수정한다.
기본파일을 아래와 같이 수정합니다.
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="%package%"
android:versionCode="%versionCode%"
android:versionName="%versionName%">
<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="%minSdkVersion%" />
<%uses-permission%>
<application android:persistent="%persistent%"
android:restoreAnyVersion="%restoreAnyVersion%"
android:label="%label%"
android:installLocation="%installLocation%"
android:debuggable="%debuggable%"
android:largeHeap="%largeHeap%"
android:icon="%icon%"
android:theme="%theme%">
<activity android:name="com.chanwooapp.delphisplash.DelphiSplashActivity" <----- 스플래시 인텐트
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <----- 안드로이드OS에서 로딩
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:label="%activityLabel%"
android:configChanges="orientation|keyboardHidden">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name"
android:value="%libNameValue%" />
</activity>
<receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->
===============================
7. 델파이 Project:Deploment를 5에서 머징시킨 dex파일이 배포될수 있게 수정한다.
제거--> 기본 classes.dex
추가--> C:\Project\DelphiFMSplashScreen\res\layout\delphisplash.xml --> res\layout\
추가--> C:\Project\DelphiFMSplashScreen\java\output\dex\classes.dex --> classes\
===============================
8. 컴파일.
위 명령어는 path에 묶여있으면 Pullpath를 적지않아도 되며,
배치파일에서 설정 해주면 쉽게 사용할 수 있습니다.
java\build.bat참조.
스플래시화면에서 애니메이션이나 이미지를 표시하려면
그러한 기능을 하는 intent클래스를 만들어서 위의 과정을 거쳐 컴파일한 후
리소스파일과, classes.dex 파일을
delphi에 포함시키면 됩니다.
이상입니다.
자료 드디어 올려 주셨군요...감사 드립니다..많은 델파이 개발자들에게 도움이 되리라 생각 됩니다.
좀더 많은 분들이 보실수 있도록 파이어몽키 카페에도 글 올리도록 하겠습니다.
감사합니다.