Component hali için aşağıdaki linki ziyaret edin.
http://brsatalay.blogspot.com.tr/2014/10/delphi-android-broadcast-receiver.html
Öncelikle şimdiden iyi bayramlar dilerim herkese :)
Bu yazımda android dünyasından yine bişiler kurcalarken, benim pek işime yarıyacak yer bulamadım ama bir dostun işine yarayabileceği birşeyi paylaşmak isterim.
Nedir bu Broadcast Receiver Buraya Tıklayınız!
İnsan bu konunun devamını okuyorsa ve kullanmak istiyorsa yeteri kadar bilgisi ve fikrinin olduğunu varsayarak devam ediyorum.
Bu örnek projede kendimiz uygulama içerisinden bir yayın yapacağız ve bu yaptığımız yayını aynı uygulama içerisinde yakalayacağız.
Projeyi XE6 üzerinde yapmış bulunmaktayım.
Hali hazırda http://brsatalay.blogspot.com.tr/2014/08/delphi-android-foreground.html linkindeki anlattığım olayları yapmışsanız classes.dex dosyası aynı dosyadır.
Aşağıdaki linklerden eksik olan dosyalarını tedarik edebilirsiniz
Toast.pas ve ActivityReceiverU.pas : http://s3.dosya.tc/server28/JRMhZO/Units.rar.html
Gerekli java dosyaları :http://s3.dosya.tc/server28/cBusGJ/java.rar.html
Projemize java dosyası içerisindeki output klasöründeki classes.dex dosyasını deploy ediyoruz.
Deploy işlemi hakkında bilgisi olmayanlar linki incelesinler: http://brsatalay.blogspot.com.tr/2014/08/delphi-classesdex-deploy.html
Sabit değişken olarak yayınlayacağımız bazı Yayın kodlarını ekleyelim
Const (* EXAMPLES *) PERMISSION = 'com.DynamicBroadcastReceiver.intent.action.deneme'; //Manuel BATTERY = 'android.intent.action.BATTERY_CHANGED'; INTERNET = 'WIFI_STATE_CHANGED_ACTION'; CALL = 'android.intent.action.PHONE_STATE'; //Gelen aramalar için
Eksik kütüphaneleri uses bloğuna ekleyin.
Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android ,AndroidApi.Helpers ,FMX.Platform.Android ,FMX.Platform
,ToastAndroid
,ActivityReceiverU
Formun OnKeyUp eventine aşağıdaki kodu yazarak geri tusuna basıldığında uygulamamızı arka planda calısması için ayarlayalım
if Key = vkHardwareBack then begin Key := 0; MainActivity.moveTaskToBack(True); Toast('Arka plan',TToastLength.ShortToast); end;
Formun var bloğuna aşağıdaki değişkenleri ekleyiniz.
ServiceReceiver: TJBroadcastReceiver; FReceiver: JBroadcastReceiver;
Formumuzun private tanım alanına aşağıdaki değişkenleri ekleyin.
AppEvents: IFMXApplicationEventService; function ApplicationEventHandler(AAppEvent: TApplicationEvent;AContext: TObject): Boolean;
"ApplicationEventHandler" proceduresinin içerisi aynı aşağıdaki gibi olmalıdır.
case AAppEvent of TApplicationEvent.BecameActive: begin ReceiverAta; end; TApplicationEvent.WillTerminate: begin ReceiverKaldir; end; TApplicationEvent.EnteredBackground: MainActivity.moveTaskToBack(True); end; Result := True;
Formun onCreate eventine aşağıdaki kodları yazınız.
if TPlatformServices.Current.SupportsPlatformService (IFMXApplicationEventService, IInterface(AppEvents)) then AppEvents.SetApplicationEventHandler(ApplicationEventHandler);
Şimdid gelelim "ApplicationEventHandler" proceduresinin içerisindeki 2 olaya. BecameActive devreye girdiğinde yani uygulamamız Active olduğu anda ReceiverAta proceduresi calısacak ki buda yayın alıcıları aktif yaparak cihazdaki o an yayınlanan şeyleri dinlemek için.
WillTerminate ise tersi durumda yayın dinleyicileri kaldırmak için.
//ReceiverKaldir içerisi if FReceiver <> nil then SharedActivity.UnregisterReceiver(FReceiver); //ReceiverAta içerisi var Filter: JIntentFilter; begin FReceiver := TJActivityReceiver.Create; Filter := TJIntentFilter.Create; Filter.addAction(StringToJString(PERMISSION)); Filter.addAction(StringToJString(CALL));//YAKALAMAK İSTEDİĞİNİZ YAYINLAR BURAYA EKLENİR. SharedActivity.RegisterReceiver(FReceiver, Filter);
Formun onDestroy eventine program sonlandırıldıgında yaratılan nesneyi serbest bırakmak için gerekli kodu yazalım. Android ortamda otomatik serbest bırakıldıgını varsayıyorum ama ne olur ne olmaz işi şansa bırakmamak gerek.
ServiceReceiver.Free;
Ve şimdi sıra geldi son işlemimize bunun için Forma 1 tane buton yerleştirin ve içerisine aşağıdaki kodları ekleyiniz. Aşağıdaki kodlarda göreceğiniz üzere Const olarak tanımladığımız PERMISSION değişkenini yayına gönderdik ve butona bastığımızda en üsteki gibi yakalanan yayın toast olarak gösterilecektir.
var Inx: JIntent; begin Inx := TJIntent.Create; Inx.setAction(StringToJString(PERMISSION)); SharedActivityContext.sendBroadcast(Inx);
Hiç yorum yok:
Yorum Gönder