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
Ş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.