Xamarin.Android'de Alıcıları Yayınlama
Bu bölümde Yayın Alıcısı'nın nasıl kullanımı ele almaktadır.
Yayın Alıcısına Genel Bakış
Yayın alıcısı, bir uygulamanın Android işletim sistemi veya uygulama tarafından yayınlanan iletilere (Android ) yanıt vermesini sağlayan bir Android bileşenidir. Yayınlar yayımla-abone ol modelini takip eder. Bir olay, yayının yayımlanır ve olayla ilgilenen bileşenler tarafından alınarak yayımlanır.
Android iki yayın türü 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ı etkinlik başlatmaktır. Bir uygulamanın telefon numarasını çevirmesi gereken açık yayının örneği; Android'de Telefon hedef alan bir Amaç ve çevrilecek telefon numarasını iletir. Android daha sonra amacı Telefon yönlendirecek.
- Örtülü yayın – Bu yayınlar cihaza tüm uygulamalara sevk edilir. Amaç, örtülü yayına örnek
ACTION_POWER_CONNECTEDolarak verilsin. Bu amaç, Android cihaz pilin ücretlendirmeye devam ediyor olduğunu algıladığı her durumda yayımlanır. Android, bu amacı bu olay için kayıtlı olan tüm uygulamalara yönlendirecek.
Yayın alıcısı türün bir alt BroadcastReceiver sınıfıdır ve yöntemini geçersiz OnReceive kılması gerekir. Android ana OnReceive iş parçacığında yürütülür, bu nedenle bu yöntem hızlı bir şekilde yürütülecek şekilde tasarlanmalı. Android, yöntem sona ererken işlemi OnReceive sonlandırana kadar içinde iş parçacıkları üretildiği zaman dikkat gerekir. Bir yayın alıcısının uzun süre çalışan iş gerçekleştirmesi gerekirse, veya Firebase İş Dağıtıcısı kullanarak bir iş zamanlaması önerilir. Bir işle çalışma zamanlaması ayrı bir kılavuzda ele alınmıştır.
Android'in iletileri düzgün bir şekilde yönlendirene kadar bir 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ı alıcı) statik olarak tanımlanabilir. Xamarin.Android, amaç filtresini statik olarak kaydeden bir C# özniteliği sağlar (bu, bu kılavuzun ilerleyen adımlarında IntentFilterAttribute daha ayrıntılı olarak ele alınmaktadır). Android 8.0'dan başlayarak, bir uygulamanın örtülü yayına statik olarak kaydolması mümkün değildir.
Bildirime kayıtlı alıcı ile bağlam kayıtlı alıcı arasındaki temel 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ı ise uygulama çalışmıyor olsa bile yayınlara yanıt verene kadar 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–Android.Content.Contextsınıfı, sistem genelindeki olaylara yanıt veren bir yayın alıcısını kaydetmek için kullanılabilir. ,Contextsistem genelindeki yayınları yayımlamak için de kullanılır.LocalBroadcastManager– Bu,LocalBroadcastManagerDestek Kitaplığı v4 NuGet paketi aracılığıyla kullanılabilir. Bu sınıf, yayınları ve yayın alıcılarını kullanan uygulama bağlamında yalıtılmış olarak 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ülemeyer ve bir yayın alıcısının içinde etkinlik başlatması kesinlikle önerilmez. Yayın alıcısının kullanıcıya bildirmesi gerekirse bir bildirim yayımlaması gerekir.
Bir hizmeti yayın alıcısı içinde bağlamak veya başlatmak mümkün değildir.
Bu kılavuzda yayın alıcısının nasıl oluşturulacak ve yayın almayacak şekilde nasıl kaydedecekleri yer almaktadır.
Yayın Alıcısı Oluşturma
Xamarin.Android'de yayın alıcısı oluşturmak için, uygulamanın sınıfı alt sınıfa sınıflandırması, ile donatması ve yöntemini BroadcastReceiverBroadcastReceiverAttribute 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ı derleyene, AndroidManifest'i de alıcıyı kaydetmek için gerekli meta verilerle güncelleştirecek. Statik olarak kayıtlı bir yayın alıcısı için, doğru şekilde olarak ayarlanacak, aksi takdirde Android alıcının Enabledtrue bir örneğini oluşturamayacaktır.
özelliği, Exported yayın alıcısının uygulama dışından ileti alıp alamayıp alamayyrın. Özellik açıkça ayarlanmazsa, yayın alıcısı ile ilişkilendirilmiş amaç filtreleri olup olmadığını temel alarak özelliğin varsayılan değeri Android tarafından belirlenir. Yayın alıcısı için en az bir amaç filtresi varsa Android, özelliğinin olduğunu Exportedtrue varsayacak. Yayın alıcısı ile ilişkilendirilmiş amaç filtreleri yoksa Android değerinin olduğunu false varsayacak.
yöntemi, OnReceive yayın Intent alıcısına sevk edilen için bir başvuru alır. Bu, amacı gönderenin yayın alıcısına değer iletir.
Bir Yayın Alıcısını Amaç Filtresi ile statik olarak kaydetme
bir BroadcastReceiver ile birlikte dekore IntentFilterAttribute edilmiş olduğunda, Xamarin.Android derleme zamanında <intent-filter> Android bildirimine gerekli öğeyi ekler. Aşağıdaki kod parçacığı, bir cihazın önyüklemesi tamamlandığında (kullanıcı tarafından uygun Android izinleri verilmişse) çalıştıracak 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şim kurmazken uygulamaların neler yapalarına ilişkin sınırlamalara yer verdi. Bu sınırlamalar arka plan hizmetlerini ve gibi örtülü yayın alıcılarını Android.Content.Intent.ActionBootCompleted etkiler. Bu sınırlamalar nedeniyle, bir yayın alıcısını daha yeni Boot Completed Android sürümlerine kaydetme konusunda sorun yaşıyor olabilirsiniz. Böyle bir durumda, bu kısıtlamaların yayın alıcınız tarafından çağrılabilecek ön plan hizmetleri için geçerli olmadığını unutmayın.
Özel amaçlara yanıt veren bir amaç filtresi de oluşturabilirsiniz. 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 daha yüksek bir sürümü hedef alan uygulamalar, örtülü bir yayına statik olarak kaydolmaz. Uygulamalar yine de açık bir yayına statik olarak kaydolabilirsiniz. Bu kısıtlamadan muaf olan örtülü yayınların küçük bir listesi vardır. Bu özel durumlar, Android belgelerinde Örtülü Yayın Özel Durumları kılavuzunda açıklanmıştır. Örtülü yayınlarla ilgilenen uygulamalar, yöntemini kullanarak dinamik olarak bunu RegisterReceiver yapmaları gerekir. Sonraki adım bu şekilde açıklanmıştır.
Context-Registering Alıcısını Alma
Bir alıcının bağlam kaydı (dinamik kayıt olarak da adlandırılır) yöntemi çağrılarak gerçekleştirilir ve yayın alıcısının yöntemine yapılan bir çağrıyla RegisterReceiver kaydının UnregisterReceiver silinmiş olması gerekir. Kaynakların sızmasını önlemek için, bağlamla (Etkinlik veya hizmet) artık ilgili olmadığı zaman alıcının kaydının silinerek kaydının silinerek silinerek silinin. Örneğin, bir hizmet bir Etkinliği güncelleştirmelerin kullanıcıya görüntülenmek için kullanılabilir olduğunu bildirmek için bir amaç yayınlar. Etkinlik başladığında, bu Intents için kaydolr. Etkinlik arka plana taşındığında ve artık kullanıcıya görünmeyebiliyorsa, güncelleştirmeleri görüntülemeye ilişkin kullanıcı arabirimi artık görünür olmadığı için alıcı kaydının kaldırıldı olması gerekir. Aşağıdaki kod parçacığı, bir Etkinlik bağlamında yayın alıcısının nasıl kayded ve kaydının nasıl geri kaydedilebölgesidir:
[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 geldiğinde, yaşam döngüsü yöntemini kullanarak özel amacı dinleyecek bir yayın OnResume alıcısı kaydedecek. Etkinlik arka plana taşınırken yöntemi OnPause() alıcının kaydını sildi.
Yayın Yayımlama
Cihazda yüklü olan tüm uygulamalara bir Intent nesnesi oluşturarak veya yöntemiyle yayın SendBroadcastSendOrderedBroadcast yayımlanır.
Context.SendBroadcast yöntemleri – Bu yöntemin çeşitli uygulamaları vardır. Bu yöntemler amacı sistemin tamamına yayınlar. Amacı belirsiz bir sırada alacak yayın alıcıları. Bu büyük esneklik sağlar, ancak diğer uygulamaların amacı kaydeden ve aldırarak mümkün olduğu anlamına gelir. Bu, olası bir güvenlik riskine neden olabilir. Yetkisiz erişimi önlemek için uygulamaların ek güvenlik uygulaması gerekir. Olası çözümlerden biri, yalnızca
LocalBroadcastManageruygulamanın özel alanı içinde ileti gönderecek olan uygulamasını kullanmaktır. Bu kod parçacığı, yöntemlerden birini kullanarak bir amacın nasıl gönderl kod parçacığına örnekSendBroadcastolarak ve 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 yayın
Intent.SetActiongö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 çok benzerdir ve farklı olarak amaç, alıcıların kayıtlı olduğu sırayla alıcılara tek tek yayımlanır.
LocalBroadcastManager
Xamarin Destek Kitaplığı v4 adlı bir yardımcı sınıf sağlar. LocalBroadcastManager, cihaza diğer uygulamalardan yayın göndermek veya almak istemeyen uygulamalara yöneliktir. , iletileri yalnızca uygulama bağlamında ve yalnızca ile kaydedilen LocalBroadcastManager yayın alıcılarında yayımlar. LocalBroadcastManager Bu kod parçacığı ile bir yayın alıcısı kaydetme LocalBroadcastManager örneğidir:
Android.Support.V4.Content.LocalBroadcastManager.GetInstance(this). RegisterReceiver(receiver, new IntentFilter("com.xamarin.example.TEST"));
Cihaza ait diğer uygulamalar, ile yayımlanan iletileri LocalBroadcastManager aamaz. Bu kod parçacığında, kullanılarak Amacın nasıl gönder edildiği 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);