Delphi XE5 for Android 啓動無黑屏等待總結

Delphi XE5 for Android 啓動無黑屏等待總結

 從embarcadero官方技術論壇找了下參考資料,對黑屏處理應該來講有了相應的辦法,而且這種辦法具備很好的應用價值,所以作了個總結,Delphi XE5 無黑屏從本質上講是使用Android 原生開發語言java ,編寫的程序啓動時首先加載java編寫的SplashScreen的activity,而後在splashScreenActivity中啓動delphi FireMonkey中的com.embarcadero.firemonkey.FMXNativeActivity;java

首先新創建一個移動端項目,啓動Rad studio xe5,File -> New ->FireMonkey Mobile Application,拖上一個TLabel 控件做爲演示,保存項目android

clip_image002[1]

設置Android SDK 我使用的Android SDK 22.0.5 32bit 版本,對應平臺爲2.35,若是你是其它SDK版本,能夠右鍵點擊 SDK,選擇 Edit SDK進行配置數據庫

clip_image004[1]

Build一下當前項目,而後打開當前項目下AndroidManifest.template.xml文件app

clip_image006[1]

將其中android:largeHeap="%largeHeap%" 去掉,不然發佈會報錯(我不太清楚是不是特色Android版本問題,或者有無其它參數進行設置,反正我就是這樣解決的),好了,Demo先放在這裏,咱們接着要創建一個java for android 下的啓動Activity項目,這裏得用eclipse + ADT進行開發eclipse

創建Android Application Project,創建Android Activity ,命名爲SplashActivity,注意包 命名空間,個人命名空間是com.cikk.splashsceen,簡單的設置一下Viewide

clip_image008[1]

clip_image010[1]

接下來編寫SplashActivity的代碼,咱們要作的是SplashActivity啓動後延時3秒,3秒結束後啓動com.embarcadero.firemonkey.FMXNativeActivity 這個Delphi Xe5 for android 下的這個特定Activity,代碼以下工具

package com.cikk.splashsceen;ui

import android.os.Bundle;this

import android.app.Activity;spa

import android.content.Intent;

import android.util.Log;

import android.view.Window;

import android.view.WindowManager;

public class SplashActivity extendsActivity {

private boolean active = true;

private static int SPLASH_TIME_OUT = 3000;

private static int SPLASH_INTERVAL = 100;

int get_resource_id(String resourceName, String resourceType)

{

returnthis.getResources().getIdentifier(resourceName, resourceType,

this.getPackageName()) ;

}

int get_string_id(String resourceName)

{

return get_resource_id(resourceName, "string");

}

int get_drawable_id(String resourceName)

{

return get_resource_id(resourceName, "drawable");

}

int get_layout_id(String resourceName)

{

return get_resource_id(resourceName, "layout");

}

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(get_layout_id("splash_activity"));

new Thread(new Runnable()

{

@Override

public void run() {

try

{

int elapsed = 0;

while (SplashActivity.this.active && (elapsed <SPLASH_TIME_OUT))

{

Thread.sleep(SPLASH_INTERVAL);

if (SplashActivity.this.active)

elapsed += SPLASH_INTERVAL;

}

}

catch (InterruptedException e)

{

}

finally

{

finish();

if (SplashActivity.this.active)

{

Intent launchIntent = new Intent();

Log.d("Splash", "Launching the main activity now");

launchIntent.setClassName(SplashActivity.this, "com.embarcadero.firemonkey.FMXNativeActivity");

startActivity(launchIntent);

}

}

}

}).start();

}

}

啓動調試一下,三秒鐘就自動退出了

clip_image012[1]

回到Delphi XE5,咱們將SplashScreen 工程Build一次,而後點擊Project ->Deployment 進入發佈管理模塊

clip_image014[1]

點擊Deploy發佈一次,而後打開項目目錄進入Android\Debug\splashScreen\classes 子目錄,能夠看到classes.dex 文件,這個就是delphi firemonkey在 android 在Dalvik中的基礎支撐庫了,接下來,我要使用一些工具來幫助我將java編寫的activity合併到classes.dex中了;

拷貝java 工程中的src和res 到delphi xe5 的SplashScreen項目目錄中,對照下圖,別拷貝錯位置了

clip_image016[1]

先配置下系統環境變量

1. Android 個人是 C:\Users\cikk\android-sdks

clip_image018[1]

2. 配置System Path

Build-tools: 個人是 %ANDROID%\build-tools\19.0.0

clip_image020[1]

3. 檢查JDK 的 bin 目錄是否在System Path 中,建議使用jdk1.6,我曾經使用1.7,但因爲版本問題,沒法成功合併到classes.dex中;

clip_image022[1]

clip_image024[1]

通過配置,打開命令提示窗口運行javac;jar;dx 確保命令可以正確執行;

clip_image026[1]

在delphi xe5 的SplashScreen項目目錄中編寫Build.bat 批處理

clip_image028[1]

批處理內容以下

@echo on

setlocal

set ANDROID_PLATFORM="%ANDROID%\platforms\android-10"

set DX_LIB="%ANDROID%\build-tools\19.0.0\lib"

set PROJ_DIR="�%"

set EMBO_DEX="D:\Program Files\Embarcadero\RAD Studio\12.0\lib\android\debug\classes.dex"

set VERBOSE=0

mkdir output\classes 2> nul

mkdir output\jar 2> nul

mkdir output\dex 2> nul

echo.

echo 編譯 Java SplashActivity.java 源文件

echo.

SET VERBOSE_FLAG=-verbose

javac %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\cikk\splashsceen\SplashActivity.java

echo.

echo 建立jar包

echo.

SET VERBOSE_FLAG=v

jar c%VERBOSE_FLAG%f output\jar\test_classes.jar -C output\classes com

echo.

echo 轉換爲dex格式

echo.

SET VERBOSE_FLAG=--verbose

call dx --dex %VERBOSE_FLAG% --output=%PROJ_DIR%\output\dex\test_classes.dex --positions=lines %PROJ_DIR%\output\jar\test_classes.jar

echo.

echo 合併dex 文件

echo.

java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\test_classes.dex %EMBO_DEX%

echo 刪除臨時文件

echo.

del output\dex\test_classes.dex

del output\jar\test_classes.jar

rmdir output\jar

echo.

echo 輸出爲 output\dex\classes.dex

:Exit

endlocal

若是批處理出現問題,請檢測下環境變量的設置,還有注意EMBO_DEX的設置,對照你的xe5 安裝路徑從新設置下(前面咱們發佈管理中能夠找到classes.dex的路徑),成功執行批處理後,咱們能夠從項目目錄\ output\dex 中找到包含咱們定義splashscreen的classes.dex

再次進入delphi 發佈管理Project ->Deployment

確保缺省的classes.dex未被選中,點擊Add Files 選擇經過build生成的classes.dex,添加成功後選中新增項,點擊Change Remote Path,更改發佈後的路徑

clip_image030[1]

將其它資源也歸入到發佈路徑中去

Res\layout\splash_activity.xml

Res\values\strings.xml

Res\drawable\splash.png

clip_image032[1]

點擊保存,接下來咱們要修改下delphi xe5 splashscreen 工程的配置文件

打開 splashscreen 工程目錄下的AndroidManifest.template.xml 配置文件模板,加入java編寫的activity 配置項;

<activity android:name="com.cikk.splashsceen.SplashActivity"

android:screenOrientation="portrait">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

將<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"> 中的

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

刪除,最後的個人配置文件以下

<?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="�buggable%"

android:icon="%icon%"

android:theme="%theme%">

<activity android:name="com.cikk.splashsceen.SplashActivity"

android:screenOrientation="portrait">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<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="�tivityLabel%"

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) -->

選好調試平臺,調試運行一下吧,因爲我是使用真機調試的,因此很差截圖,我成功了,大家呢?

最後,經過這幾天使用delphi平臺,感受作傳統型數據庫應用,應該夠了,但相關資源相比較java來講太缺少,若是要調用java的三方代碼太繁瑣,好比這個閃屏界面,不如直接使用java開發;咱們選擇開發平臺時,應該多考慮下!

Cikk

2013/12/4

相關文章
相關標籤/搜索