Aracılığıyla paylaş


Xamarin.Android'de Yayın Alıcıları

Bu bölümde Yayın Alıcısı'nın nasıl kullanılacağı açıklanmıştır.

Yayın Alıcıya Genel Bakış

Yayın alıcısı , bir uygulamanın Android işletim sistemi veya bir uygulama tarafından yayınlanan iletilere (Android Intent) yanıt vermesini sağlayan bir Android bileşenidir. Yayınlar bir yayımlama-abone olma modelini izler; olay, bir yayının olayla ilgilenen bileşenler tarafından yayımlanmasına ve alınmasına neden olur.

Android iki tür yayını tanımlar:

  • Açık yayın : Bu tür yayınlar belirli bir uygulamayı hedefler. Açık yayının en yaygın kullanımı bir Etkinlik başlatmaktır. Bir uygulamanın telefon numarasını çevirmesi gerektiğinde açık yayın örneği; Android'de Telefon uygulamasını hedefleyen bir Intent gönderecektir ve aranacak telefon numarasını iletecektir. Ardından Android amacı Telefon uygulamasına yönlendirir.
  • Örtük yayın – Bu yayınlar cihazdaki tüm uygulamalara gönderilir. Örtük yayına örnek olarak amaç verilmiştir ACTION_POWER_CONNECTED . Bu amaç, Android cihazdaki pilin şarj olduğunu her algılandığında yayımlanır. Android bu amacı bu etkinlik için kayıtlı olan tüm uygulamalara yönlendirir.

Yayın alıcısı türün BroadcastReceiver bir alt sınıfıdır ve yöntemini geçersiz kılmalıdır OnReceive . Android ana iş parçacığında yürütüleceğinden OnReceive , bu yöntem hızlı bir şekilde yürütülecek şekilde tasarlanmalıdır. Android, yöntem tamamlandığında işlemi sonlandırabileceğinden, içinde iş parçacığı OnReceive oluştururken dikkatli olunmalıdır. Yayın alıcısının uzun süre çalışan bir iş yapması gerekiyorsa, veya Firebase İş Dağıtıcısı'nıJobScheduler kullanarak bir zamanlanması önerilir. bir iş ile çalışma zamanlama ayrı bir kılavuzda ele alınacaktır.

Android'in iletileri düzgün şekilde yönlendirebilmesi için yayın alıcısını kaydetmek için amaç filtresi kullanılır. Amaç filtresi çalışma zamanında belirtilebilir (bu bazen bağlama kayıtlı alıcı veya dinamik kayıt olarak adlandırılır) veya Android Bildirimi'nde (bildirim kayıtlı bir alıcı) statik olarak tanımlanabilir. Xamarin.Android, IntentFilterAttributeamaç filtresini statik olarak kaydedecek bir C# özniteliği sağlar (bu, bu kılavuzun ilerleyen bölümlerinde daha ayrıntılı olarak ele alınacaktır). Android 8.0'dan başlayarak, bir uygulamanın örtük bir yayına statik olarak kaydolması mümkün değildir.

Bildirim kayıtlı alıcı ile bağlam kayıtlı alıcı arasındaki birincil fark, bağlam kayıtlı bir alıcının yalnızca uygulama çalışırken yayınlara yanıt vermesi, bildirime kayıtlı bir alıcının ise uygulama çalışmamış olsa bile yayınlara yanıt verebiliyor olmasıdır.

Yayın alıcısını yönetmek ve yayın göndermek için iki API kümesi vardır:

  1. Context – Sınıfı, Android.Content.Context sistem genelindeki olaylara yanıt verecek bir yayın alıcısını kaydetmek için kullanılabilir. Context, sistem genelinde yayınları yayımlamak için de kullanılır.
  2. LocalBroadcastManager– Bu, Xamarin Destek Kitaplığı v4 NuGet paketi aracılığıyla kullanılabilen bir API'dir. Bu sınıf, yayınları ve yayın alıcılarını kullanan uygulama bağlamında yalıtılmış tutmak için kullanılır. Bu sınıf, diğer uygulamaların yalnızca uygulama yayınlarına yanıt vermesini veya özel alıcılara ileti göndermesini önlemek için yararlı olabilir.

Yayın alıcısı iletişim kutularını görüntüleyemeyebilir ve bir yayın alıcısından etkinlik başlatması kesinlikle önerilmez. Yayın alıcısının kullanıcıya bildirmesi gerekiyorsa bir bildirim yayımlaması gerekir.

Yayın alıcısından bir hizmete bağlanmak veya hizmeti başlatmak mümkün değildir.

Bu kılavuzda yayın alıcısı oluşturma ve yayınları alabilmesi için nasıl kaydedileceği ele alınacaktır.

Yayın Alıcısı Oluşturma

Xamarin.Android'de yayın alıcısı oluşturmak için bir uygulamanın sınıfı alt sınıfına alması BroadcastReceiver , ile BroadcastReceiverAttributedonatması ve yöntemini geçersiz kılması OnReceive gerekir:

[BroadcastReceiver(Enabled = true, Exported = false)]
public class SampleReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        // Do stuff here.

        String value = intent.GetStringExtra("key");
    }
}

Xamarin.Android sınıfını derlediğinde, AndroidManifest'i de alıcıyı kaydetmek için gerekli meta verilerle güncelleştirir. Statik olarak kaydedilmiş bir yayın alıcısı Enabled için, doğru şekilde olarak ayarlanmalıdır true, aksi takdirde Android alıcının bir örneğini oluşturamaz.

özelliği, Exported yayın alıcısının uygulama dışından ileti alıp alamayacağını denetler. Özellik açıkça ayarlanmadıysa, özelliğin varsayılan değeri, yayın alıcısıyla ilişkili amaç filtreleri olup olmadığına bağlı olarak Android tarafından belirlenir. Yayın alıcısı için en az bir amaç filtresi varsa Android, özelliğinin Exported olduğunu truevarsayar. Yayın alıcısıyla ilişkilendirilmiş amaç filtresi yoksa, Android değerinin olduğunu falsevarsayar.

yöntemi, OnReceive yayın alıcısına Intent dağıtılan öğesine bir başvuru alır. Bu, amacı gönderenin yayın alıcısına değer geçirmesini mümkün kılar.

Yayın Alıcısını Amaç Filtresi ile statik olarak kaydetme

ile BroadcastReceiver donatıldığında IntentFilterAttribute, Xamarin.Android derleme zamanında Android bildirimine gerekli <intent-filter> öğeyi ekler. Aşağıdaki kod parçacığı, bir cihazın önyüklemesi tamamlandığında (kullanıcı tarafından uygun Android izinleri verildiyse) çalışacak bir yayın alıcısı örneğidir:

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { Android.Content.Intent.ActionBootCompleted })]
public class MyBootReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        // Work that should be done when the device boots.     
    }
}

Not

Android 8.0'da (API 26 ve üzeri) Google, kullanıcılar doğrudan etkileşime girmediği sırada uygulamaların yapabilecekleri konusunda sınırlamalar getirmektedir. Bu sınırlamalar arka plan hizmetlerini ve gibi Android.Content.Intent.ActionBootCompletedörtük yayın alıcılarını etkiler. Bu sınırlamalar nedeniyle, Android'in daha yeni sürümlerinde bir Boot Completed yayın alıcısını kaydederken sorun yaşayabilirsiniz. Bu durumda, bu kısıtlamaların yayın alıcınızdan çağrılabilen ön plan hizmetleri için geçerli olmadığını unutmayın.

Özel amaçlara yanıt verecek bir amaç filtresi oluşturmak da mümkündür. Aşağıdaki örneği inceleyin:

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { "com.xamarin.example.TEST" })]
public class MySampleBroadcastReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        // Do stuff here
    }
}

Android 8.0 (API düzeyi 26) veya üzerini hedefleyen uygulamalar, örtük bir yayına statik olarak kaydolmayabilir. Uygulamalar yine de statik olarak açık bir yayına kaydolabilir. Bu kısıtlamadan muaf tutulan örtük yayınların küçük bir listesi vardır. Bu özel durumlar, Android belgelerindeki Örtük Yayın Özel Durumları kılavuzunda açıklanmıştır. Örtük yayınlarla ilgilenen uygulamaların bunu yöntemini kullanarak RegisterReceiver dinamik olarak yapması gerekir. Bundan sonra bu açıklanmıştır.

Yayın Alıcısını Bağlama Kaydetme

Bir alıcının bağlam kaydı (dinamik kayıt olarak da adlandırılır) yöntemi çağrılarak RegisterReceiver gerçekleştirilir ve yayın alıcısının yöntemine UnregisterReceiver yapılan bir çağrıyla kaydı kaldırılmalıdır. Kaynakların sızmasını önlemek için, bağlam (Etkinlik veya hizmet) için artık uygun olmadığında alıcının kaydının silinmesi önemlidir. Örneğin, bir hizmet, bir Etkinliğe güncelleştirmelerin kullanıcıya görüntülenebileceğini bildiren bir amaç yayınlar. Etkinlik başladığında bu Amaçlar için kaydolacak. Etkinlik arka plana taşındığında ve artık kullanıcı tarafından görülemediğinde, güncelleştirmeleri görüntüleme kullanıcı arabirimi artık görünür olmadığından alıcının kaydını kaldırması gerekir. Aşağıdaki kod parçacığı, etkinlik bağlamında bir yayın alıcısının nasıl kaydedilip kaydının kaldırılmaya örnek olarak verilmiştir:

[Activity(Label = "MainActivity", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity: Activity
{
    MySampleBroadcastReceiver receiver;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        receiver = new MySampleBroadcastReceiver();

        // Code omitted for clarity
    }

    protected override void OnResume()
    {
        base.OnResume();
        RegisterReceiver(receiver, new IntentFilter("com.xamarin.example.TEST"));
        // Code omitted for clarity
    }

    protected override void OnPause()
    {
        UnregisterReceiver(receiver);
        // Code omitted for clarity
        base.OnPause();
    }
}

Önceki örnekte Etkinlik ön plana çıktığında yaşam döngüsü yöntemini kullanarak özel bir amacı dinleyecek bir yayın alıcısı OnResume kaydeder. Etkinlik arka plana taşınırken yöntemi alıcının OnPause() kaydını kaldıracaktır.

Yayın Yayımlama

Bir yayın, cihazda yüklü olan tüm uygulamalarda bir Intent nesnesi oluşturup veya SendOrderedBroadcast yöntemiyle SendBroadcast göndererek yayımlanabilir.

  1. Context.SendBroadcast yöntemleri – Bu yöntemin birkaç uygulaması vardır. Bu yöntemler amacı sistemin tamamına yayınlar. Amacı belirsiz bir sırada alacak alıcıları yayınlayın. Bu, çok fazla esneklik sağlar, ancak diğer uygulamaların amacı kaydedip almasının mümkün olduğu anlamına gelir. Bu, olası bir güvenlik riski oluşturabilir. Uygulamaların yetkisiz erişimi önlemek için ek güvenlik uygulaması gerekebilir. Olası çözümlerden biri, yalnızca uygulamanın özel alanı içinde iletilerin gönderileceği öğesini kullanmaktır LocalBroadcastManager . Bu kod parçacığı, yöntemlerden birini kullanarak bir amacın nasıl gönderildiğine SendBroadcast ilişkin bir örnektir:

    Intent message = new Intent("com.xamarin.example.TEST");
    // If desired, pass some values to the broadcast receiver.
    message.PutExtra("key", "value");
    SendBroadcast(message);
    

    Bu kod parçacığı, eylemi tanımlamak için yöntemini kullanarak Intent.SetAction yayın göndermenin başka bir örneğidir:

    Intent intent = new Intent();
    intent.SetAction("com.xamarin.example.TEST");
    intent.PutExtra("key", "value");
    SendBroadcast(intent);
    
  2. Context.SendOrderedBroadcast – Bu yöntem, yöntemine Context.SendBroadcastçok benzer; fark, amacın alıcılara, alıcıların kaydedileceği sırayla birer birer yayımlanmasıdır.

LocalBroadcastManager

Xamarin Destek Kitaplığı v4 adlı LocalBroadcastManagerbir yardımcı sınıf sağlar. LocalBroadcastManager, cihazdaki diğer uygulamalardan yayın göndermek veya almak istemeyen uygulamalara yöneliktir. LocalBroadcastManager yalnızca uygulama bağlamında ve yalnızca ile LocalBroadcastManagerkaydedilen yayın alıcılarına ileti yayımlar. Bu kod parçacığı, ile LocalBroadcastManagerbir yayın alıcısı kaydetme örneğidir:

Android.Support.V4.Content.LocalBroadcastManager.GetInstance(this). RegisterReceiver(receiver, new IntentFilter("com.xamarin.example.TEST"));

Cihazdaki diğer uygulamalar ile LocalBroadcastManageryayımlanan iletileri alamaz. Bu kod parçacığı, kullanarak bir Intent'in nasıl gönderildiğini LocalBroadcastManagergösterir:

Intent message = new Intent("com.xamarin.example.TEST");
// If desired, pass some values to the broadcast receiver.
message.PutExtra("key", "value");
Android.Support.V4.Content.LocalBroadcastManager.GetInstance(this).SendBroadcast(message);