Herkese selamlar,
Bu makalemde sizlere Java ile uygulamanızı nasıl tetikleyeceğinizi anlatacağım. Rus bir eleman sağolsun(Rusçada olsa resimlerden falan anlamaya çalıştım) makalesinden yapmış olduğu aşamaları sizinle de paylaşmak istedim.
İlk olarak mantığını anlamak gerekirse bir Java dosyası derlemesi yapacağız ve Delphi IDE'si aracılığı ile library bölümüne ekleyeceğiz. Sonrasında bu dosyayı tetikleyerek, uygulamamızın açılmasını sağlayacağız.
1. Aşama: Java Derleme
Bu aşamada bir klasör oluşturarak daha rahat çalışmanızı tavsiye ediyorum. Notepad uygulamasını(veya başka bir düzenleme programı. Ben EditPlus3 kullanıyorum.) açararak aşağıda ki Java derleme kodlarınız yazıyoruz.
Önemli Not: Belirtilmiş olan olan SDK ve Java yollarını kendinize göre ayarlamanız gerekmektedir. Şu anda benim standart olarak kullanmış olduğum yerler mevcut.
İpucu: Kısayoldan "Delphi IDE> Tools> Options> SDK Manager" bölümünden tanımlı yolları bulabilirsiniz.
Önemli Not: Java derlemesi için gerekli komutları tanımlamanız gerekmektedir. "Bilgisayar> Özellikler> Gelişmiş> Ortam Değişkenleri" yolunu takip ederek, "Path" bölümünü düzenlemeniz gerekmektedir. Aşağıdaki resimde göründüğü gibi Java/bin klasörünü tanımlıyorsunuz. Unutmayın ki; her yol belirtilişinde ";" kullanılmaktadır.
Önemli Not: Belirtlien Class ismine dikkat etmeniz gerekmekte şu anda "ServisExample" olarak tanımlı. Bu tanımı Delphi'de çağırma işleminde kullanacağız.
Bu işlemlerin ardından artık "Build.bat" dosyamızı çalıştırmamız da bir sorun yok. Dosya çalıştıktan sonra; otomatik oluşan "output\jar" yolunda Delphi'de kullanacağımız Java kütüphanesi oluşmuş olarak görmeniz gerekmektedir.
Java kısmı biter
2. Aşama: Delphi Kısmı
Delphi'yi açarak işlemlerimize başlayalım. Hemen bir Android uygulama oluşturup, formumuzun içine bir tane buton ekleyelim.

"Project Manager> TargetPlatforms> Android - Android SDK xx> Libraries" yolunu izleyerek, oluşturmuş olduğumuz ".jar" dosyasını projemize ekliyoruz. Bu aşamalardan sonra yapmamız gereken küçük bir değişiklik olacak. Projemizi bir "Build" edelim. Proje klasörüne gittiğimizde bir dosya göreceksiniz; "AndroidManifest.template.xml" adlı dosyayı editör ile açıp gerekli düzenlemeleri yapın.

Önemli Not: Resim göründüğü bölümde Java kodumuzu yazarken kullanmış olduğum(ilk satırda ki koddan bahsediyorum) "package com.ServiceExample" kodu ile Class olarak tanımladığımız "ServisExample" isimlerini birleştirerek Class yapımızı tanımlıyoruz.
bkz. (Birleşimi; com.ServiceExample.ServisExample).
Devam edelim...
Şimdi ise Android sistemin takvim metodunu kullanarak, fonksiyonumuzu oluşturuyoruz ki mili saniyeyi, saniyeye çevirebilelim.
Bu fonksiyonumuzu ekledikten sonra artık rahatça kodumuzu yazabiliriz.
Prosedürü açıklayacak olursam; bu prosedür ile biz yazmış olduğumuz Java dosyamızda ki kodu time ile tetikleyip, RTC_WAKEUP ile çalıştırıyoruz. Java dosyamızda "Intent" ile işlem yaptığımız için Delphi ile de "Intent" yapısını kullanarak bir nevi iletişime geçmesini sağlıyoruz. StringToJString ile Class ismini alıyor ve işimize bakıyoruz. "getTimeAfterInSecs(10)" kodu ile 10 saniye sonra programımızın açılmasını istediğimizi bildiriyoruz. Sonrasında ise işlemlerimiz tamam...
Bu makale bir servis niteliği taşımaz. Sadece tetikleme niteliği taşır ve bu işlemler ile programınızı "RECEIVE_BOOT_COMPLETED" iznini ve "BOOT_COMPLETED" eylemini yakalayarak işleminizi gerçekleştirebilirsiniz.
Bu araştırma için yaklaşık 5 günlük bir zaman harcadım. Bu araştırmalarımda bana yardımcı olan;
Uğur PARLAYAN (Çeviri için)
Fesih ARSLAN (İpin ucunu elime verdiği için)
gonulali (Kaynak yardımı için)
Teşekkür ederim...
Şimdi biraz bu olay hakkında konuşmaya gelirsek. Delphi'nin bu konu hakkında biraz yetersiz kaldığını düşünüyorum çünkü herhangi bir dilden yardım almadan bağımsız olarak (en azından bu kadar uğraştırmadan) olayı halletmesi gerekirdi. Yani birkaç sürüme artık bu olaya el atması gerek çünkü önemli konulardan bir tanesi.
Umarım bu makale ile umarım yardımcı olabilmişimdir. Ben aşağıya yine de incelemeniz bakımından bırakayım.
Kaynak Dosyalar | GitHub
Destek için GitHub üzerinden projeyi yıldızlayabilir ve REP puanı ile süsleyebilirsiniz.

Yaralandığım Kaynaklar:
DelphiFMAndroid
Blog.Blong
Saygılarımla,
İyi çalışmalar.
Bu makalemde sizlere Java ile uygulamanızı nasıl tetikleyeceğinizi anlatacağım. Rus bir eleman sağolsun(Rusçada olsa resimlerden falan anlamaya çalıştım) makalesinden yapmış olduğu aşamaları sizinle de paylaşmak istedim.
İlk olarak mantığını anlamak gerekirse bir Java dosyası derlemesi yapacağız ve Delphi IDE'si aracılığı ile library bölümüne ekleyeceğiz. Sonrasında bu dosyayı tetikleyerek, uygulamamızın açılmasını sağlayacağız.
1. Aşama: Java DerlemeBu aşamada bir klasör oluşturarak daha rahat çalışmanızı tavsiye ediyorum. Notepad uygulamasını(veya başka bir düzenleme programı. Ben EditPlus3 kullanıyorum.) açararak aşağıda ki Java derleme kodlarınız yazıyoruz.
@echo off setlocal if x%ANDROID% == x set ANDROID=E:\Program Files (x86)\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows set ANDROID_PLATFORM=%ANDROID%\platforms\android-27 set PROJ_DIR=%CD% set VERBOSE=0 echo. echo Compiling the Java service activity source files echo. mkdir output 2> nul mkdir output\classes 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose javac -source 1.7 -target 1.7 %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\ServiceExample\ServisExample.java echo. echo Creating jar containing the new classes echo. mkdir output\jar 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=v jar c%VERBOSE_FLAG%f output\jar\ServisExample.jar -C output\classes com echo. echo Now we have the end result, which is output\jar\ServisExample.jar :Exit pause endlocal
Önemli Not: Belirtilmiş olan olan SDK ve Java yollarını kendinize göre ayarlamanız gerekmektedir. Şu anda benim standart olarak kullanmış olduğum yerler mevcut.
İpucu: Kısayoldan "Delphi IDE> Tools> Options> SDK Manager" bölümünden tanımlı yolları bulabilirsiniz.
Önemli Not: Java derlemesi için gerekli komutları tanımlamanız gerekmektedir. "Bilgisayar> Özellikler> Gelişmiş> Ortam Değişkenleri" yolunu takip ederek, "Path" bölümünü düzenlemeniz gerekmektedir. Aşağıdaki resimde göründüğü gibi Java/bin klasörünü tanımlıyorsunuz. Unutmayın ki; her yol belirtilişinde ";" kullanılmaktadır.
"Build" olayını hallettiğimize göre artık gerekli dosyaları oluşturabiliriz. "Build" kodunda belirtlien "src\com\ServiceExample\ServisExample.java" yoluna göre klasör açalım(İsteğe bağlı olarak kısaltılıp, değiştirilebilir.). En son klasörün içine ".java" uzantılı bir dosya ekleyelim(Herhangi bir editör ile). Java dosyamızın içeriği aşağıda bulunmaktadır.
package com.ServiceExample;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class ServisExample extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Intent TestLauncher = new Intent();
TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");
TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(TestLauncher);
}
} Burada bir "Intent" oluşturulup TestLauncher olarak tanımlanıyor. Sonrasında FLAG_ACTIVITY_NEW_TASK ile yeni bir işlem(uygulamamızın açılması için) oluşturup. Context.StartActivity komutu ile TestLauncher tanımlı uygulamayı tetikliyor.
Önemli Not: Belirtlien Class ismine dikkat etmeniz gerekmekte şu anda "ServisExample" olarak tanımlı. Bu tanımı Delphi'de çağırma işleminde kullanacağız.Bu işlemlerin ardından artık "Build.bat" dosyamızı çalıştırmamız da bir sorun yok. Dosya çalıştıktan sonra; otomatik oluşan "output\jar" yolunda Delphi'de kullanacağımız Java kütüphanesi oluşmuş olarak görmeniz gerekmektedir.
Java kısmı biter
2. Aşama: Delphi KısmıDelphi'yi açarak işlemlerimize başlayalım. Hemen bir Android uygulama oluşturup, formumuzun içine bir tane buton ekleyelim.

"Project Manager> TargetPlatforms> Android - Android SDK xx> Libraries" yolunu izleyerek, oluşturmuş olduğumuz ".jar" dosyasını projemize ekliyoruz. Bu aşamalardan sonra yapmamız gereken küçük bir değişiklik olacak. Projemizi bir "Build" edelim. Proje klasörüne gittiğimizde bir dosya göreceksiniz; "AndroidManifest.template.xml" adlı dosyayı editör ile açıp gerekli düzenlemeleri yapın.

Önemli Not: Resim göründüğü bölümde Java kodumuzu yazarken kullanmış olduğum(ilk satırda ki koddan bahsediyorum) "package com.ServiceExample" kodu ile Class olarak tanımladığımız "ServisExample" isimlerini birleştirerek Class yapımızı tanımlıyoruz. bkz. (Birleşimi; com.ServiceExample.ServisExample).
Devam edelim...
Şimdi ise Android sistemin takvim metodunu kullanarak, fonksiyonumuzu oluşturuyoruz ki mili saniyeyi, saniyeye çevirebilelim.
function getTimeAfterInSecs(Seconds: Integer): Int64; var Calendar: JCalendar; begin Calendar := TJCalendar.JavaClass.getInstance; Calendar.add(TJCalendar.JavaClass.SECOND, Seconds); Result := Calendar.getTimeInMillis; end;
Bu fonksiyonumuzu ekledikten sonra artık rahatça kodumuzu yazabiliriz.
procedure TfrmMain.Button1Click(Sender: TObject);
var
Intent: JIntent;
PendingIntent: JPendingIntent;
begin
Intent := TJIntent.Create;
Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.firemonkey.FMXNativeActivity'));
PendingIntent := TJPendingIntent.JavaClass.getActivity(TAndroidHelper.Context, 1, Intent, 0);
TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(10),
PendingIntent);
end;
Prosedürü açıklayacak olursam; bu prosedür ile biz yazmış olduğumuz Java dosyamızda ki kodu time ile tetikleyip, RTC_WAKEUP ile çalıştırıyoruz. Java dosyamızda "Intent" ile işlem yaptığımız için Delphi ile de "Intent" yapısını kullanarak bir nevi iletişime geçmesini sağlıyoruz. StringToJString ile Class ismini alıyor ve işimize bakıyoruz. "getTimeAfterInSecs(10)" kodu ile 10 saniye sonra programımızın açılmasını istediğimizi bildiriyoruz. Sonrasında ise işlemlerimiz tamam...
Bu makale bir servis niteliği taşımaz. Sadece tetikleme niteliği taşır ve bu işlemler ile programınızı "RECEIVE_BOOT_COMPLETED" iznini ve "BOOT_COMPLETED" eylemini yakalayarak işleminizi gerçekleştirebilirsiniz.
Bu araştırma için yaklaşık 5 günlük bir zaman harcadım. Bu araştırmalarımda bana yardımcı olan;
Uğur PARLAYAN (Çeviri için)
Fesih ARSLAN (İpin ucunu elime verdiği için)

gonulali (Kaynak yardımı için)
Teşekkür ederim...
Şimdi biraz bu olay hakkında konuşmaya gelirsek. Delphi'nin bu konu hakkında biraz yetersiz kaldığını düşünüyorum çünkü herhangi bir dilden yardım almadan bağımsız olarak (en azından bu kadar uğraştırmadan) olayı halletmesi gerekirdi. Yani birkaç sürüme artık bu olaya el atması gerek çünkü önemli konulardan bir tanesi.
Umarım bu makale ile umarım yardımcı olabilmişimdir. Ben aşağıya yine de incelemeniz bakımından bırakayım.
Kaynak Dosyalar | GitHub
Destek için GitHub üzerinden projeyi yıldızlayabilir ve REP puanı ile süsleyebilirsiniz. 
Yaralandığım Kaynaklar:
DelphiFMAndroid
Blog.Blong
Saygılarımla,
İyi çalışmalar.


