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 iş 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, IntentFilterAttribute
amaç 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:
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.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 BroadcastReceiverAttribute
donatması 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 true
varsayar. Yayın alıcısıyla ilişkilendirilmiş amaç filtresi yoksa, Android değerinin olduğunu false
varsayar.
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.
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ğineSendBroadcast
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);
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ı LocalBroadcastManager
bir 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 LocalBroadcastManager
kaydedilen yayın alıcılarına ileti yayımlar. Bu kod parçacığı, ile LocalBroadcastManager
bir 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 LocalBroadcastManager
yayımlanan iletileri alamaz. Bu kod parçacığı, kullanarak bir Intent'in nasıl gönderildiğini LocalBroadcastManager
gö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);