3 Ekim 2014 Cuma

Delphi Android Dinamik Broadcast Receiver oluşturma ve Servis kullanımı

Merhabalar,

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