Android - Yayın Alıcıları

Broadcast Receivers sadece diğer uygulamalardan veya sistemin kendisinden gelen yayın mesajlarına yanıt verin. Bu mesajlar bazen olaylar veya niyetler olarak adlandırılır. Örneğin, uygulamalar, diğer uygulamalara bazı verilerin cihaza indirildiğini ve bunların kullanımına açık olduğunu bildirmek için yayınları da başlatabilir, bu nedenle bu, bu iletişimi kesecek ve uygun eylemi başlatacak yayın alıcısıdır.

BroadcastReceiver'ın sistem tarafından yayınlanan amaçlar için çalışmasını sağlamak için aşağıdaki iki önemli adım vardır:

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

  • Yayın Alıcısını Kaydetme

Özel amaçlarınızı uygulamanız durumunda bir ek adım daha vardır, o zaman bu amaçları oluşturmanız ve yayınlamanız gerekecektir.

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

Bir yayın alıcısı, bir alt sınıf olarak uygulanır. BroadcastReceiver sınıf ve her mesajın bir olarak alındığı onReceive () yöntemini geçersiz kılma Intent nesne parametresi.

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

Yayın Alıcısını Kaydetme

Bir uygulama, bir yayın alıcısını AndroidManifest.xml dosyasına kaydederek belirli yayın amaçlarını dinler . MyReceiver'ı , Android sistemi önyükleme işlemini tamamladığında sistem tarafından tetiklenen ACTION_BOOT_COMPLETED adlı sistem tarafından oluşturulmuş olay için kaydettireceğimizi düşünün .

Yayın alıcı

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
   
      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED">
         </action>
      </intent-filter>
   
   </receiver>
</application>

Artık Android cihazınız her başlatıldığında, BroadcastReceiver MyReceiver tarafından durdurulacak ve onReceive () içinde uygulanan mantık çalıştırılacaktır.

Son statik alanlar olarak tanımlanan, sistem tarafından oluşturulmuş birkaç olay vardır. Intentsınıf. Aşağıdaki tablo birkaç önemli sistem olayını listeler.

Sr.No Olay Sabiti ve Açıklaması
1

android.intent.action.BATTERY_CHANGED

Pil ile ilgili şarj durumu, seviyesi ve diğer bilgileri içeren yapışkan yayın.

2

android.intent.action.BATTERY_LOW

Cihazda düşük pil durumunu gösterir.

3

android.intent.action.BATTERY_OKAY

Pilin azaldıktan sonra artık iyi durumda olduğunu gösterir.

4

android.intent.action.BOOT_COMPLETED

Bu, sistem önyüklemeyi bitirdikten sonra bir kez yayınlanır.

5

android.intent.action.BUG_REPORT

Bir hatayı bildirmek için etkinliği gösterin.

6

android.intent.action.CALL

Veriler tarafından belirtilen birine bir arama yapın.

7

android.intent.action.CALL_BUTTON

Kullanıcı, bir arama yapmak için çeviriciye veya diğer uygun UI'ye gitmek için "ara" düğmesine bastı.

8

android.intent.action.DATE_CHANGED

Tarih değişti.

9

android.intent.action.REBOOT

Cihazı yeniden başlatın.

Özel Amaçları Yayınlama

Uygulamanızın kendisinin özel amaçlar oluşturmasını ve göndermesini istiyorsanız, bu amaçları , aktivite sınıfınızın içindeki sendBroadcast () yöntemini kullanarak oluşturmanız ve göndermeniz gerekecektir . Eğer kullanırsanız sendStickyBroadcast (Niyet) yöntemini Niyet olduğunustickyyani gönderdiğiniz Niyet , yayın tamamlandıktan sonra ortalıkta kalır.

public void broadcastIntent(View view) {
   Intent intent = new Intent();
   intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
   sendBroadcast(intent);
}

Bu amaç com.tutorialspoint.CUSTOM_INTENT , sistem tarafından oluşturulan amacı yeniden kaydettiğimiz gibi benzer şekilde kaydedilebilir.

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
   
      <intent-filter>
         <action android:name="com.tutorialspoint.CUSTOM_INTENT">
         </action>
      </intent-filter>
   
   </receiver>
</application>

Misal

Bu örnek, özel amacı engellemek için BroadcastReceiver'ı nasıl oluşturacağınızı açıklayacaktır . Özel amaca aşina olduğunuzda, uygulamanızı sistem tarafından üretilen amaçları engellemek için programlayabilirsiniz. Öyleyse Merhaba Dünya Örneği bölümünde oluşturduğumuz Android uygulamasını değiştirmek için aşağıdaki adımları takip edelim -

Adım Açıklama
1 Merhaba Dünya Örneği bölümünde açıklandığı gibi bir com.example.tutorialspoint7.myapplication paketi altında bir Android uygulaması oluşturmak ve bunu Uygulamam olarak adlandırmak için Android stüdyosunu kullanacaksınız .
2 BroadcastIntent () yöntemini eklemek için ana etkinlik dosyası MainActivity.java'yı değiştirin .
3 BroadcastReceiver'ı tanımlamak için com.example.tutorialspoint7.myapplication paketinin altında MyReceiver.java adlı yeni bir java dosyası oluşturun .
4 Bir uygulama, herhangi bir kısıtlama olmaksızın bir veya daha fazla özel ve sistem amacını işleyebilir. Kesmek istediğiniz her niyet, <alıcı ... /> etiketi kullanılarak AndroidManifest.xml dosyanıza kaydedilmelidir
5 Res / layout / activity_main.xml dosyasının varsayılan içeriğini, yayın amacı için bir düğme içerecek şekilde değiştirin.
6 Dize dosyasını değiştirmeye gerek yoktur, Android stüdyosu string.xml dosyasıyla ilgilenir.
7 Android öykünücüsünü başlatmak ve uygulamada yapılan değişikliklerin sonucunu doğrulamak için uygulamayı çalıştırın.

Aşağıda, değiştirilen ana aktivite dosyasının içeriği yer almaktadır MainActivity.java. Bu dosya, temel yaşam döngüsü yöntemlerinin her birini içerebilir. Özel bir amaç yayınlamak için broadcastIntent () yöntemini ekledik .

package com.example.tutorialspoint7.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

   /** Called when the activity is first created. */
   @Override
   
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }


   // broadcast a custom intent.
      
   public void broadcastIntent(View view){
      Intent intent = new Intent();
      intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent);
   }
}

Aşağıdakilerin içeriği MyReceiver.java:

package com.example.tutorialspoint7.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * Created by TutorialsPoint7 on 8/23/2016.
 */
public class MyReceiver extends BroadcastReceiver{
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

AndroidManifest.xml dosyasının değiştirilmiş içeriği aşağıdadır . Burada hizmetimizi dahil etmek için <alıcı ... /> etiketini ekledik:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.tutorialspoint7.myapplication">

   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
		
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   
      <receiver android:name="MyReceiver">
         <intent-filter>
            <action android:name="com.tutorialspoint.CUSTOM_INTENT">
            </action>
         </intent-filter>

      </receiver>
   </application>

</manifest>

Aşağıdakilerin içeriği olacak res/layout/activity_main.xml özel amacımızı yayınlamak için bir düğme eklemek için dosya -

<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" 
   android:layout_width="match_parent"
   android:layout_height="match_parent" 
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" 
   tools:context=".MainActivity">
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Example of Broadcast"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />
      
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_above="@+id/imageButton"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp" />
      
   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_centerVertical="true"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/button2"
      android:text="Broadcast Intent"
      android:onClick="broadcastIntent"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />

</RelativeLayout>

Değiştirilmiş ürünümüzü çalıştırmayı deneyelim Hello World!az önce değiştirdiğimiz uygulama. Senin yarattığını varsayıyorumAVDçevre kurulumunu yaparken. Uygulamayı Android stüdyosundan çalıştırmak için, projenizin etkinlik dosyalarından birini açın

ve araç çubuğundan Çalıştır simgesine tıklayın . Android Studio, uygulamayı AVD'nize yükler ve başlatır ve kurulumunuz ve uygulamanızla ilgili her şey yolundaysa, aşağıdaki Emulator penceresini görüntüler -

Şimdi özel amacımızı yayınlamak için tıklayın Broadcast Intentdüğmesi, bu, kayıtlı BroadcastReceiver, yani MyReceiver tarafından kesilecek olan özel amacımız "com.tutorialspoint.CUSTOM_INTENT" i yayınlayacak ve uygulanan mantığımıza göre simülatörün altında aşağıdaki gibi bir tost görünecektir -

Sistem başlatma, değiştirilme tarihi, düşük pil vb. Gibi sistem tarafından oluşturulan amaçları engellemek için diğer BroadcastReceiver'ı uygulamayı deneyebilirsiniz.