खोज…


परिचय

ब्रॉडकास्टसीवर (रिसीवर) एक एंड्रॉइड घटक है जो आपको सिस्टम या एप्लिकेशन ईवेंट के लिए पंजीकरण करने की अनुमति देता है। किसी ईवेंट के लिए सभी पंजीकृत रिसीवर को एंड्रॉइड रनटाइम द्वारा सूचित किया जाता है, जब यह घटना होती है।

उदाहरण के लिए, एक प्रसारण जो यह घोषणा करता है कि स्क्रीन बंद हो गई है, बैटरी कम है, या एक तस्वीर कैप्चर की गई थी।

एप्लिकेशन प्रसारण को भी आरंभ कर सकते हैं - उदाहरण के लिए, अन्य एप्लिकेशन को यह बताने के लिए कि कुछ डेटा डिवाइस में डाउनलोड किया गया है और उनका उपयोग करने के लिए उपलब्ध है।

ब्रॉडकास्ट रिसीवर का परिचय

ब्रॉडकास्ट रिसीवर एक एंड्रॉइड घटक है जो आपको सिस्टम या एप्लिकेशन ईवेंट के लिए पंजीकरण करने की अनुमति देता है।

एक रिसीवर AndroidManifest.xml फ़ाइल के माध्यम से या गतिशील रूप से Context.registerReceiver() विधि के माध्यम से पंजीकृत किया जा सकता है।

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      //Your implementation goes here.
   }
}

यहां मैंने ACTION_BOOT_COMPLETED का एक उदाहरण लिया है, जिसे सिस्टम ने एक बार बूट प्रक्रिया पूरी करने के बाद निकाल दिया है।

आप इस तरह से प्रकट फ़ाइल में एक पुनर्विक्रेता रजिस्टर कर सकते हैं:

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

अब डिवाइस बूट हो जाता है, onReceive() विधि को कॉल किया जाएगा और फिर आप अपना काम कर सकते हैं (जैसे एक सेवा शुरू करना, एक अलार्म शुरू करना)।

ब्रॉडकास्टसीवर बेसिक्स

BroadcastReceivers का उपयोग प्रसारण इंटेंट प्राप्त करने के लिए किया जाता है जो Android OS, अन्य ऐप्स या उसी ऐप के भीतर भेजे जाते हैं।

प्रत्येक इरादे को एक इंटेंट फिल्टर के साथ बनाया जाता है, जिसमें एक स्ट्रिंग एक्शन की आवश्यकता होती है। अतिरिक्त जानकारी को आशय में कॉन्फ़िगर किया जा सकता है।

इसी तरह, ब्रॉडकास्टवर्स एक विशेष आशय फिल्टर के साथ इरादे प्राप्त करने के लिए रजिस्टर करते हैं। उन्हें प्रोग्रामेटिक रूप से पंजीकृत किया जा सकता है:

mContext.registerReceiver(new BroadcastReceiver() {
    @Override
   public void onReceive(Context context, Intent intent) {
      //Your implementation goes here.
   }
}, new IntentFilter("Some Action"));

या AndroidManifest.xml फ़ाइल में:

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="Some Action"/>
    </intent-filter>
</receiver>

आशय प्राप्त करने के लिए, Android OS द्वारा, किसी अन्य ऐप या API द्वारा, या अपने स्वयं के अनुप्रयोग में, sendBroadcast का उपयोग करके किसी चीज़ पर कार्रवाई सेट करें:

mContext.sendBroadcast(new Intent("Some Action"));

इसके अतिरिक्त, इरादे में स्ट्रिंग, आदिम और पार्सलबेल जैसी जानकारी हो सकती है, onReceive में देखा जा सकता है।

LocalBroadcastManager का उपयोग करना

LocalBroadcastManager प्रसारण भेजने के लिए प्रयोग किया जाता है उद्देश्य उन्हें अवांछित श्रोताओं के लिए प्रकट किए बिना, एक आवेदन के भीतर।

LocalBroadcastManager का उपयोग करना और अधिक कुशल है और context.sendBroadcast() से अधिक सुरक्षित है। SendBroadcast context.sendBroadcast() सीधे, क्योंकि आपको किसी भी अन्य एप्लिकेशन द्वारा प्रसारित प्रसारण के बारे में चिंता करने की आवश्यकता नहीं है, जो एक सुरक्षा खतरा पैदा कर सकता है।

यहाँ स्थानीय प्रसारण भेजने और प्राप्त करने का एक सरल उदाहरण है:

BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("Some Action")) {
            //Do something
        }
    }
});

LocalBroadcastManager manager = LocalBroadcastManager.getInstance(mContext);
manager.registerReceiver(receiver, new IntentFilter("Some Action"));

// onReceive() will be called as a result of this call:
manager.sendBroadcast(new Intent("Some Action"));//See also sendBroadcastSync

//Remember to unregister the receiver when you are done with it:
manager.unregisterReceiver(receiver);

ब्लूटूथ प्रसारण रिसीवर

अपनी मैनिफ़ेस्ट फ़ाइल में अनुमति जोड़ें

<uses-permission android:name="android.permission.BLUETOOTH" />

आपके टुकड़े (या गतिविधि) में

  • रिसीवर विधि जोड़ें
private BroadcastReceiver mBluetoothStatusChangedReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final Bundle extras = intent.getExtras();
        final int bluetoothState = extras.getInt(Constants.BUNDLE_BLUETOOTH_STATE);
        switch(bluetoothState) {
            case BluetoothAdapter.STATE_OFF:
                // Bluetooth OFF
                break;
            case BluetoothAdapter.STATE_TURNING_OFF:
                // Turning OFF
                break;
            case BluetoothAdapter.STATE_ON:
                // Bluetooth ON
                break;
            case BluetoothAdapter.STATE_TURNING_ON:
                // Turning ON
                break;
    }
};

प्रसारण को पंजीकृत करें

  • इस विधि को onResume () पर कॉल करें
private void registerBroadcastManager(){
    final LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
    manager.registerReceiver(mBluetoothStatusChangedReceiver, new IntentFilter(Constants.BROADCAST_BLUETOOTH_STATE));
}

अपंजीकृत प्रसारण

  • ऑनपॉज पर इस विधि को कॉल करें ()
private void unregisterBroadcastManager(){
    final LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
    // Beacon機能用
    manager.unregisterReceiver(mBluetoothStatusChangedReceiver);
}

प्रोग्राम को प्रसारण प्राप्तकर्ता को सक्षम और अक्षम करना

BroadcastReceiver को सक्षम या अक्षम करने के लिए, हमें PackageManager संदर्भ प्राप्त करने की आवश्यकता है और हमें एक ComponentName ऑब्जेक्ट की आवश्यकता है जिसमें रिसीवर के वर्ग को हम सक्षम / अक्षम करना चाहते हैं:

ComponentName componentName = new ComponentName(context, MyBroadcastReceiver.class);
PackageManager packageManager = context.getPackageManager();

अब हम BroadcastReceiver को सक्षम करने के लिए निम्न विधि को कॉल कर सकते हैं:

packageManager.setComponentEnabledSetting(
    componentName,
    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
    PackageManager.DONT_KILL_APP);

या इसके बजाय हम रिसीवर को निष्क्रिय करने के लिए COMPONENT_ENABLED_STATE_DISABLED का उपयोग कर सकते हैं:

packageManager.setComponentEnabledSetting(
    componentName,
    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
    PackageManager.DONT_KILL_APP);

BOOT_COMPLETED घटनाओं को संभालने के लिए ब्रॉडकास्टरेवर

नीचे दिए गए उदाहरण से पता चलता है कि कैसे एक BroadcastReceiver बनाने के लिए जो BOOT_COMPLETED ईवेंट प्राप्त करने में सक्षम है। इस तरह, आप एक Service शुरू करने या एक Activity शुरू करने में सक्षम होते हैं जैसे ही डिवाइस को संचालित किया गया था।

इसके अलावा, आप अपने अलार्म को पुनर्स्थापित करने के लिए BOOT_COMPLETED ईवेंट का उपयोग कर सकते हैं क्योंकि डिवाइस बंद होने पर वे नष्ट हो जाते हैं।

नोट: उपयोगकर्ता को BOOT_COMPLETED कार्रवाई प्राप्त करने से पहले कम से कम एक बार आवेदन शुरू करना होगा।

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.example" >
    ...
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    ...

    <application>
        ...

        <receiver android:name="com.test.example.MyCustomBroadcastReceiver">
        <intent-filter>
                <!-- REGISTER TO RECEIVE BOOT_COMPLETED EVENTS -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

MyCustomBroadcastReceiver.java

public class MyCustomBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if(action != null) {
            if (action.equals(Intent.ACTION_BOOT_COMPLETED) ) {
                // TO-DO: Code to handle BOOT COMPLETED EVENT
                // TO-DO: I can start an service.. display a notification... start an activity
            } 
        }
    }
}

एक LocalBroadcastManager का उदाहरण

एक ब्रॉडकास्टसीवर मूल रूप से विशिष्ट कार्यों को करने के लिए ओएस के माध्यम से इरादों को रिले करने के लिए एक तंत्र है। एक क्लासिक परिभाषा

"ब्रॉडकास्ट रिसीवर एक एंड्रॉइड घटक है जो आपको सिस्टम या एप्लिकेशन ईवेंट के लिए पंजीकरण करने की अनुमति देता है।"

LocalBroadcastManager एक आवेदन प्रक्रिया के भीतर प्रसारण भेजने या प्राप्त करने का एक तरीका है। इस तंत्र के बहुत सारे फायदे हैं

  1. चूंकि डेटा अनुप्रयोग प्रक्रिया के अंदर रहता है, इसलिए डेटा को लीक नहीं किया जा सकता है।
  2. LocalBroadcasts को तेजी से हल किया जाता है, क्योंकि पूरे ओएस में रनटाइम पर एक सामान्य प्रसारण का संकल्प होता है।

LocalBroastManager का एक सरल उदाहरण है:

SenderActivity

  Intent intent = new Intent("anEvent");
  intent.putExtra("key", "This is an event");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

ReceiverActivity

  1. एक रिसीवर पंजीकृत करें
LocalBroadcastManager.getInstance(this).registerReceiver(aLBReceiver,
              new IntentFilter("anEvent"));
  1. रिसीवर को कॉल करने पर कार्रवाई करने के लिए एक ठोस वस्तु
private BroadcastReceiver aLBReceiver = new BroadcastReceiver() {
    @Override 
    public void onReceive(Context context, Intent intent) {
        // perform action here.
    } 
};
  1. जब कोई दृश्य दिखाई नहीं दे रहा हो तो अपंजीकृत करें।
@Override 
protected void onPause() { 
    // Unregister since the activity is about to be closed. 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(aLBReceiver);
    super.onDestroy(); 
}

कस्टम प्रसारण रिसीवर के माध्यम से दो गतिविधियों का संचार करें

आप दो गतिविधियों को संवाद कर सकते हैं ताकि गतिविधि ए को गतिविधि बी में होने वाली घटना के बारे में सूचित किया जा सके।

गतिविधि ए

final String eventName = "your.package.goes.here.EVENT";

@Override
protected void onCreate(Bundle savedInstanceState) {
    registerEventReceiver();
    super.onCreate(savedInstanceState);
}

@Override
protected void onDestroy() {
    unregisterEventReceiver(eventReceiver);
    super.onDestroy();
}

private void registerEventReceiver() {
    IntentFilter eventFilter = new IntentFilter();
    eventFilter.addAction(eventName);
    registerReceiver(eventReceiver, eventFilter);
}

private BroadcastReceiver eventReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
         //This code will be executed when the broadcast in activity B is launched
    }
};

गतिविधि बी

final String eventName = "your.package.goes.here.EVENT";

private void launchEvent() {
    Intent eventIntent = new Intent(eventName);
    this.sendBroadcast(eventIntent);
}

बेशक आप प्रसारण के लिए और अधिक जानकारी जोड़ सकते हैं एक्स्ट्रा कलाकार जो गतिविधियों के बीच पारित किया गया है में अतिरिक्त जोड़ सकते हैं। उदाहरण को यथासंभव सरल रखने के लिए नहीं जोड़ा गया।

स्टिकी ब्रॉडकास्ट

यदि हम विधि sendStickyBroadcast (इरादे) का उपयोग कर रहे हैं, तो संगत अभिप्राय चिपचिपा है, जिसका अर्थ है कि आप जो प्रसारण भेज रहे हैं वह प्रसारण पूरा होने के बाद चारों ओर रहता है। जैसा कि नाम से पता चलता है एक स्टिकबॉयरकास्ट एक प्रसारण से डेटा को पढ़ने के लिए है, प्रसारण पूरा होने के बाद। इसका उपयोग उस परिदृश्य में किया जा सकता है, जहाँ आप किसी Activity's onCreate() में उस गतिविधि को लॉन्च करने से पहले इरादे में एक कुंजी के मान की जांच करना चाहते हैं।

Intent intent = new Intent("com.org.action");
intent.putExtra("anIntegerKey", 0);
sendStickyBroadcast(intent);

आदेशित प्रसारण का उपयोग करना

आदेशित प्रसारण का उपयोग तब किया जाता है जब आपको प्रसारण श्रोताओं के लिए प्राथमिकता निर्दिष्ट करने की आवश्यकता होती है।

इस उदाहरण में firstReceiver एक secondReceiver तुलना में हमेशा पहले प्रसारण प्राप्त करेगा:

final int highPriority = 2;
final int lowPriority = 1;
final String action = "action";

// intent filter for first receiver with high priority
final IntentFilter firstFilter = new IntentFilter(action);
first Filter.setPriority(highPriority);
final BroadcastReceiver firstReceiver = new MyReceiver();

// intent filter for second receiver with low priority
final IntentFilter secondFilter = new IntentFilter(action);
secondFilter.setPriority(lowPriority);
final BroadcastReceiver secondReceiver = new MyReceiver();

// register our receivers
context.registerReceiver(firstReceiver, firstFilter);
context.registerReceiver(secondReceiver, secondFilter);

// send ordered broadcast
context.sendOrderedBroadcast(new Intent(action), null);

इसके अलावा प्रसारण रिसीवर आदेश दिया प्रसारण को रद्द कर सकते हैं:

@Override
public void onReceive(final Context context, final Intent intent) {
    abortBroadcast();
}

इस स्थिति में कम प्राथमिकता वाले सभी रिसीवर को प्रसारण संदेश प्राप्त नहीं होगा।

Android ने रोका राज्य

एंड्रॉइड 3.1 के साथ शुरू, इंस्टॉलेशन पर सभी एप्लिकेशन को एक रोका स्थिति में रखा गया है। जबकि रोकी गई स्थिति में, एप्लिकेशन किसी भी कारण से नहीं चलेगा, एक गतिविधि के मैनुअल लॉन्च को छोड़कर, या एक स्पष्ट इरादे से जो एक गतिविधि, सेवा या प्रसारण को संबोधित करता है।

एपीके को सीधे इंस्टॉल करने वाले सिस्टम ऐप को लिखते समय, कृपया ध्यान रखें कि नए इंस्टॉल किए गए एपीपी को तब तक कोई प्रसारण प्राप्त नहीं होगा जब तक कि एक गैर-रोक राज्य में स्थानांतरित नहीं किया जाता है।

किसी ऐप को सक्रिय करने का एक आसान तरीका इस ऐप को एक स्पष्ट प्रसारण भेजना है। जैसा कि अधिकांश एप्लिकेशन INSTALL_REFERRER कार्यान्वित करते हैं, हम इसे एक हुकिंग बिंदु के रूप में उपयोग कर सकते हैं

इंस्टॉल किए गए एप्लिकेशन के प्रकटन को स्कैन करें, और प्रत्येक रिसीवर को एक स्पष्ट प्रसारण भेजें:

Intent intent = new Intent();
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.setComponent(new ComponentName(packageName, fullClassName));
sendBroadcast(intent);


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow