您現在的位置:首頁 >> 其它平臺 >> Andriod >> 內容

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

時間:2013/12/4 11:38:28 點擊:

  核心提示:Delphi XE5 for Android 啟動無黑屏等待總結從embarcadero官方技術論壇找了下參考資料,對黑屏處理應該來說有了相應的辦法,并且這種辦法具有很好的應用價值,因此做了個總結,Delphi XE5 無黑屏從本質上講是使用Android 原生開發語言java ,編寫的程序啟動時首...

 

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

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

  首先新建立一個移動端項目,啟動Rad studio xe5,File -> New ->FireMonkey Mobile Application,拖上一個TLabel 控件作為演示,保存項目

   設置Android SDK 我使用的Android SDK 22.0.5 32bit 版本,對應平臺為2.35,如果你是其它SDK版本,可以右鍵點擊 SDK,選擇 Edit SDK進行配置

  Build一下當前項目,然后打開當前項目下AndroidManifest.template.xml文件

 

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

  建立Android Application Project,建立Android Activity ,命名為SplashActivity,注意包 命名空間,我的命名空間是com.cikk.splashsceen,簡單的設置一下View

 

 

  接下來編寫SplashActivity的代碼,我們要做的是SplashActivity啟動后延時3,3秒結束后啟動com.embarcadero.firemonkey.FMXNativeActivity 這個Delphi Xe5 for android 下的這個特定Activity,代碼如下

  package com.cikk.splashsceen;

 

import android.os.Bundle;

import android.app.Activity;

import android.content.Intent;

import android.util.Log;

import android.view.Window;

import android.view.WindowManager;

 

public class SplashActivity extends Activity {

 

      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)

      {

        return this.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(); 

 

    }

}

 

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

 

 

回到Delphi XE5,我們將SplashScreen 工程Build一次,然后點擊Project ->Deployment 進入發布管理模塊

 

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

 

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

 

先配置下系統環境變量

1.       Android 我的是 C:\Users\cikk\android-sdks

 

2.       配置System Path

Build-tools: 我的是 %ANDROID%\build-tools\19.0.0

 

3.       檢查JDK bin 目錄是否在System Path ,建議使用jdk1.6,我曾經使用1.7,但由于版本問題,無法成功合并到classes.dex;

 

 

經過配置,打開命令提示窗口運行javac;jar;dx 確保命令能夠正確執行;

 

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

 

批處理內容如下

 

@echo on

 

setlocal

 

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

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

set PROJ_DIR="%CD%"

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 中找到包含我們定義splashscreenclasses.dex

 

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

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

 

將其它資源也納入到發布路徑中去

Res\layout\splash_activity.xml

Res\values\strings.xml

Res\drawable\splash.png

 

點擊保存,接下來我們要修改下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="%debuggable%"

        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="%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) -->

 

選好調試平臺,調試運行一下吧,由于我是使用真機調試的,所以不好截圖,我成功了,你們呢?

最后,通過這幾天使用delphi平臺,感覺做傳統型數據庫應用,應該夠了,但相關資源相比較java來說太缺乏,如果要調用java的三方代碼太繁瑣,比如這個閃屏界面,不如直接使用java開發;我們選擇開發平臺時,應該多考慮下!

Cikk

2013/12/4

作者:cikk 錄入:cikk 來源:原創
共有評論 2相關評論
發表我的評論
  • 大名:
  • 內容:
  • 盒子文章(www.srtxuk.icu) © 2019 版權所有 All Rights Reserved.
  • 滬ICP備05001939號
  • 快乐10分助手官网