প্রোগ্রামক্রমে একটি সম্প্রচার গ্রহণকারী নিবন্ধন করুন


149

আমি জানতে চাই যে প্রোগ্রামের মাধ্যমে কোনও সম্প্রচারের গ্রহণকারীর নিবন্ধনের সর্বোত্তম অনুশীলন / উপায় কী। আমি ব্যবহারকারীর পছন্দ অনুযায়ী সুনির্দিষ্ট রিসিভারগুলি নিবন্ধিত করতে চাই।

ম্যানিফেস্ট ফাইলের মাধ্যমে নিবন্ধকরণটি সম্পন্ন হওয়ার সাথে সাথে আমি ভাবছি যে কোডটিতে এটি অর্জনের কোনও সঠিক উপায় আছে কিনা।


2
কোডারজপ্যাশন ব্রডকাস্ট রিসিভার সেরা বিস্তৃত টিউটোরিয়াল
karanatwal.github.io

এই লিঙ্কে পড়ুন দয়া করে stackoverflow.com/questions/15698790/...

উত্তর:


64

দেখে মনে হচ্ছে আপনি আপনার ম্যানিফেস্টে প্রকাশিত উপাদানগুলি সক্রিয় কিনা তা নিয়ন্ত্রণ করতে চান, চলমান অবস্থায় কোনও প্রেরক (কনটেক্সট.রেজিস্টাররেসিভার () এর মাধ্যমে) গতিশীলভাবে নিবন্ধভুক্ত করবেন না।

যদি তা হয় তবে এই উপাদানগুলি সক্রিয় রয়েছে কিনা তা নিয়ন্ত্রণ করতে আপনি প্যাকেজম্যানেজ.সেট কম্পোনেন্টসইনবেসডিং () ব্যবহার করতে পারেন:

http://developer.android.com/references/android/content/pm/PackageManager.html#setCompenderEnabledSetting(android.content.Comp घटकName, int, int)

দ্রষ্টব্য যে আপনি চালনার সময় কেবল কোনও সম্প্রচার গ্রহণ করতে আগ্রহী হন, তবে রেজিস্ট্রার রিসিভার () ব্যবহার করা ভাল। যখন আপনার অ্যাপ্লিকেশনটি প্রতিবার সম্প্রচারের সময় পাঠানো হয় তখন আপনার অ্যাপ্লিকেশন চালু হয় তা নিশ্চিত করার জন্য যখন কোনও রিসিভার উপাদান মূলত কার্যকর হয়।


1
চালাক! আপনি আমাকে সোজা পেয়েছেন। আপনাকে অনেক ধন্যবাদ
15-15 এ কুলস্ট্রাট

খুব সুন্দর - আপনি এটি করতে পারবেন কোনও ধারণা ছিল না :)
ক্রিস নলডাস


1
@ হ্যাকবড কীভাবে কাস্টম রিসিভারে মেটা-ডেটা ট্যাগ যুক্ত করতে পারেন? তোমার কি কোন ধারনা আছে !! আমি অ্যান্ড্রয়েডম্যানফেস্ট.এক্সএমএলে কোনটি মেটা-ডেটা ট্যাগ যুক্ত করব।
জালা জানাকসিংহ

1
আজ অবধি সেরা টিউটোরিয়াল coderzpassion.com/implement-broadcastreceiver-android এবং সহজ ভাষায়
জগজিৎ সিং

269

আপনার onCreateপদ্ধতিতে আপনি এইভাবে কোনও রিসিভার নিবন্ধন করতে পারেন:

private BroadcastReceiver receiver;

@Override
public void onCreate(Bundle savedInstanceState){

  // your oncreate code should be

  IntentFilter filter = new IntentFilter();
  filter.addAction("SOME_ACTION");
  filter.addAction("SOME_OTHER_ACTION");

  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      //do something based on the intent's action
    }
  };
     registerReceiver(receiver, filter);
}

onDestroyপদ্ধতিতে এটি চালাতে ভুলবেন না :

 @Override
 protected void onDestroy() {
  if (receiver != null) {
   unregisterReceiver(receiver);
   receiver = null;
  }
  super.onDestroy();
 }

19
ধন্যবাদ, এটি দুর্দান্ত কাজ করেছে। সম্প্রচারটি প্রেরণ করতে আমি কোডটি ইনটেন্ট আই = নতুন ইনটেন্ট ("SOME_ACTION") ব্যবহার করেছি; sendBroadcast (ঝ);
বেন ক্লেটন 15

7
কেন না আবার শুরু এবং শুরু?
সৈয়দ রাজা মেহেদী

আমি যদি সম্প্রচারের রিসিভারটি নিবন্ধভুক্ত না করি তবে কী হবে? এটি কি পুনরায় বুট করার পরেও ব্রডকাস্ট রিসিভারটি নিবন্ধিত ছেড়ে দেবে?
জয়দেব

5
এটির নিশ্চয়তা নেই যা onDestroy()বলা হবে, ফলে একটি সম্ভাব্য মেমরি ফাঁস তৈরি হবে। এটা তোলে রেজিস্টার / নিবন্ধন মুক্ত মধ্যে ভালো onStart()/ onStop()
নেরিয়া নাছুম

এর অর্থ কি আমার কোনও সম্প্রচারের রিসিভার ক্লাস তৈরি করতে হবে না? আমি আমার সমস্ত অনারিপ () কোডটি এখানে রাখতে পারি এবং এটি কাজ করবে?
তাসলিম ওসেনি

70

একটি গুরুত্বপূর্ণ বিষয় যা লোকেদের উল্লেখ করতে ভুলে যায় তা হ'ল জীবনের সময় Broadcast Receiver। প্রোগ্রামাম্যাটিকভাবে এটিকে অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল এ নিবন্ধভুক্ত করার পার্থক্য । ম্যানিফেস্ট ফাইলে, এটি অ্যাপ্লিকেশন জীবনের সময়ের উপর নির্ভর করে না। প্রোগ্রামগতভাবে এটি নিবন্ধভুক্ত করার সময় এটি প্রয়োগ জীবনের সময় নির্ভর করে on এর অর্থ হ'ল আপনি যদি অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলতে নিবন্ধন করেন তবে আপনার অ্যাপ্লিকেশন চলমান না থাকলেও আপনি সম্প্রচারিত অভিপ্রায়গুলি ধরতে পারেন।

সম্পাদনা করুন: উল্লিখিত নোটটি অ্যান্ড্রয়েড ৩.১-এর মতো আর সত্য নয়, সংশ্লিষ্ট অ্যাপ্লিকেশনটি কখনই ব্যবহারকারীর দ্বারা আরম্ভ না করা হয় বা যদি ব্যবহারকারী স্পষ্টভাবে অ্যান্ড্রয়েড মেনুর মাধ্যমে অ্যাপ্লিকেশনটি বন্ধ করে দেয় তবে অ্যান্ড্রয়েড সিস্টেমটি ডিফল্টরূপে সমস্ত প্রাপককে বাদ দেয় না receiving পরিচালনা → অ্যাপ্লিকেশন)। https://developer.android.com/about/versions/android-3.1.html

এটি একটি অতিরিক্ত সুরক্ষা বৈশিষ্ট্য কারণ ব্যবহারকারীরা নিশ্চিত হতে পারেন যে কেবলমাত্র তিনি শুরু করা অ্যাপ্লিকেশনগুলিই সম্প্রচারের অভিপ্রায় গ্রহণ করবে।

সুতরাং এটি বোঝা যায় যে অ্যাপ্লিকেশনগুলিতে প্রোগ্রামালিমে নিবন্ধিত রিসিভারগুলির উপরের অ্যান্ড্রয়েড ৩.১ থেকে অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলonCreate()ঘোষিতগুলির সাথে একই প্রভাব থাকবে ।


1
এটি একটি ভাল নোট। আমি প্রকৃতপক্ষে এমন একটি বই দেখছি যা আমি অ্যান্ড্রয়েড সম্পর্কে পড়ছি এবং ভাবছি যে সম্প্রচারের বাস্তবায়ন করার 2 টি পদ্ধতি কেন করা হয়েছে? এটি আমার কাছে মনে হয় এটি পিছিয়ে-সামঞ্জস্যের জন্য। তবে আমি নিশ্চিত নই।
নিয়ন ওয়ার্জ

ঠিক আছে, আপনি কি সত্যিই এমন কিছু করেন যে সম্পাদনাটি সত্য? আমি শেষ বাক্যটি বোঝাতে চাইছি। অ্যান্ড্রয়েড আপনার অ্যাপ্লিকেশনটি যে কোনও সময় হত্যার সম্ভাবনা রয়েছে, যার ফলস্বরূপ আপনার প্রোগ্রামগতভাবে নিবন্ধিত রিসিভারগুলি আর কাজ করবে না, তবে নিবন্ধিত প্রকাশিত এখনও কাজ করবে।
জ্যাকসঅনএফ 1

40

ক্রিয়াকলাপ / খণ্ডের যে কোনও জায়গাতেই এইভাবে সম্প্রচারিত রিসিভার সংজ্ঞায়িত করুন:

mReceiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
     Log.d(TAG," onRecieve"); //do something with intent
   }
 };

ইনটেন্টফিলার ইন সংজ্ঞা দিন onCreate()

mIntentFilter=new IntentFilter("action_name");

এখন ব্রডকাস্টআরসিভারটিকে নিবন্ধভুক্ত করুন onResume()এবং এটিতে নিবন্ধভুক্ত করুন onPause()[কারণ ক্রিয়াকলাপটি যদি থমকে থাকে তবে সম্প্রচারের কোনও ব্যবহার নেই]।

@Override
protected void onResume() {
     super.onResume();
     registerReceiver(mReceiver, mIntentFilter);
}

@Override
protected void onPause() {
    if(mReceiver != null) {
            unregisterReceiver(mReceiver);
            mReceiver = null;
    }
    super.onPause();
}

বিশদ টিউটোরিয়ালের জন্য, ব্রডকাস্ট রিসিভার-দুটি বাস্তবায়নের উপায় দেখুন


এখন পর্যন্ত আমি খুঁজে পেয়েছি সেরা উদাহরণ! ধন্যবাদ!
আয়ুশ গোয়েল

1
@ সোহেলআজিয লিঙ্কটি একটি ভাল উত্তর সরবরাহ করে। আপনি কি লিঙ্কটির প্রসঙ্গটি আপনার উত্তরে রেখে দিতে পারেন, যাতে লিঙ্কটি নীচে চলে যায়, আপনার উত্তরটি প্রাসঙ্গিক থেকে যায়?
iRuth 8

আমার ব্যক্তিগত দৃষ্টিতে সম্প্রচারটি অনারিউম এবং অনপজেতে নিবন্ধিত হওয়া উচিত যেমনটি আপনি পরামর্শ করেছিলেন তবে কিছু লোক বলে যে এটি অবশ্যই অনক্রিয়েট এবং অনড্রেস্ট্রয় এ থাকা উচিত, আপনি কি উভয়ের পক্ষে পক্ষে মতামত ব্যাখ্যা করতে পারবেন?
সৈয়দ রাজা মেহেদী

2
@ সাইয়েদরাজী মেহেদী যদি সম্প্রচারটি ইউআই আপডেট করতে ব্যবহৃত হয় [যা বেশিরভাগ ক্ষেত্রে রয়েছে] আপনার এটি অনারুমে নিবন্ধন করা উচিত এবং অনপজ এ নিবন্ধন করা উচিত কারণ অন্যথায় সম্প্রচার ব্যর্থ হবে।
সোহেলআজিজ

ধন্যবাদ .এই সেরা উত্তর।
সাeদ জেড

4
package com.example.broadcastreceiver;


import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

   UserDefinedBroadcastReceiver broadCastReceiver = new UserDefinedBroadcastReceiver();

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }

   /**
    * This method enables the Broadcast receiver for
    * "android.intent.action.TIME_TICK" intent. This intent get
    * broadcasted every minute.
    *
    * @param view
    */
   public void registerBroadcastReceiver(View view) {

      this.registerReceiver(broadCastReceiver, new IntentFilter(
            "android.intent.action.TIME_TICK"));
      Toast.makeText(this, "Registered broadcast receiver", Toast.LENGTH_SHORT)
            .show();
   }

   /**
    * This method disables the Broadcast receiver
    *
    * @param view
    */
   public void unregisterBroadcastReceiver(View view) {

      this.unregisterReceiver(broadCastReceiver);

      Toast.makeText(this, "unregistered broadcst receiver", Toast.LENGTH_SHORT)
            .show();
   }
}

1
আপনি দয়া করে ওকে ব্যাখ্যা করতে পারেন কেন এটি সর্বোত্তম অনুশীলন?
মার্টিন প্রিক্রিল

1
তারা ব্যাখ্যা করে না, "তারা" সর্বদা কোড পোস্ট করে, কারণ এটি আপনারা আরও ভাল জানেন। -সার্কাসম
নিয়ন ওয়ার্জ

2

শোনার জন্য এবং সম্প্রচারিত গ্লোবাল বার্তা, এবং সাধারণ কার্যগুলিতে অ্যালার্ম সেট করা এবং অ্যান্ড্রয়েডে তাদের কীভাবে করবেন সে অনুযায়ী :

যদি প্রাপ্য শ্রেণিটি তার ম্যানিফেস্টে ব্যবহার করে নিবন্ধিত না হয়, আপনি কনটেক্সট.রেজিস্টাররেসিভার () কল করে গতিশীলভাবে ইনস্ট্যান্টিয়েট এবং কোনও রিসিভার নিবন্ধন করতে পারেন ।

একটি সময়ে দেখে নিন registerReceiver (BroadcastReceiver রিসিভার, IntentFilter ফিল্টার) আরও তথ্যের জন্য।


1
আমি কল করার চেষ্টা করেছি context.registerReceiverকিন্তু এটি কল হচ্ছে না আপনি দয়া করে এই প্রশ্নটি দেখতে পারেন stackoverflow.com/questions/13238600/…
হান্ট

2

রিসিভারটি রেজিস্ট্রেশন করার সময় সর্বদা অনুমতি সরবরাহ করা ভাল অনুশীলন, অন্যথায় আপনি কোনও অ্যাপ্লিকেশন যা মেলানো উদ্দেশ্য প্রেরণ করবে তার জন্য আপনি পাবেন। এটি দূষিত অ্যাপ্লিকেশনগুলিকে আপনার রিসিভারে সম্প্রচারের অনুমতি দিতে পারে।


1

লোকালড্রোডকাস্টম্যানেজারের জন্য

   Intent intent = new Intent("any.action.string");
   LocalBroadcastManager.getInstance(context).
                                sendBroadcast(intent);

এবং নিবন্ধন করুন onResume

LocalBroadcastManager.getInstance(
                    ActivityName.this).registerReceiver(chatCountBroadcastReceiver, filter);

এবং এটি নিবন্ধন করুন onStop

LocalBroadcastManager.getInstance(
                ActivityName.this).unregisterReceiver(chatCountBroadcastReceiver);

এবং এটি গ্রহণ ..

mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("mBroadcastReceiver", "onReceive");
        }
    };

ইনট্যান্টফিল্টার যেখানে

 new IntentFilter("any.action.string")

1

দুটি পছন্দ

1) আপনি যদি ক্রিয়াকলাপটি কেবল তখন দৃশ্যমান থাকে তখনই সম্প্রচারটি পড়তে চান,

registerReceiver(...) ইন onStart()এবং unregisterReceiver(...)ইনonStop()

2) আপনি যদি ব্রডকাস্টটি পড়তে চান এমনকি যদি কার্যকলাপ ব্যাকগ্রাউন্ডে থাকে তবে,

registerReceiver(...)ভিতরে onCreate(...)এবং unregisterReceiver(...)ভিতরেonDestroy()

বোনাস:

যদি অলস হয়

আপনি যদি প্রতিটি ক্রিয়াকলাপে বারবার একটি সম্প্রচারকামীকে নিবন্ধভুক্ত এবং নিবন্ধভুক্ত করার জন্য বয়লারপ্লেট কোডটি লিখতে না চান,

  1. একটি বিমূর্ত ক্রিয়াকলাপ তৈরি করুন
  2. ক্রিয়াকলাপে বয়লারপ্লেট কোড লিখুন
  3. বিমূর্ত পদ্ধতি হিসাবে বাস্তবায়ন ছেড়ে দিন

কোড স্নিপেট এখানে:

বিমূর্ত ক্রিয়াকলাপ

public abstract class BasicActivity extends AppCompatActivity {

    private BroadcastReceiver broadcastReceiver;
    private IntentFilter filter;
    private static final String TAG = "BasicActivity";

    /**********************************************************************
    *                   Boilerplate code
    **********************************************************************/

    @Override
    public void onCreate(Bundle sis){
        super.onCreate(sis);
        broadcastReceiver = getBroadcastReceiver();
        filter = getFilter();
    }

    @Override
    public void onStart(){
        super.onStart();
        register();
    }

    @Override
    public void onStop(){
        super.onStop();
        unregister();
    }

    private void register(){
        registerReceiver(broadcastReceiver,filter);
    }

    private void unregister(){
        unregisterReceiver(broadcastReceiver);
    }

    /**********************************************************************
    *                   Abstract methods
    **********************************************************************/

    public abstract BroadcastReceiver getBroadcastReceiver();

    public abstract IntentFilter getFilter();

}

এই পদ্ধতির ব্যবহার করে আপনি আরও বয়লারপ্লেট কোড লিখতে পারেন যেমন সাধারণ অ্যানিমেশনগুলি লিখতে, কোনও পরিষেবায় আবদ্ধ হওয়া ইত্যাদি etc.

সম্পূর্ণ কোড দেখুন:

এখানে


0

একটি সম্প্রচার রিসিভার তৈরি করুন

[ব্রডকাস্টআরসিভার (সক্ষম = সত্য, রফতানি = মিথ্যা)]

public class BCReceiver : BroadcastReceiver
{

    BCReceiver receiver;

    public override void OnReceive(Context context, Intent intent)
    {
        //Do something here
    }
}

আপনার ক্রিয়াকলাপ থেকে এই কোড যুক্ত করুন:

LocalBroadcastManager.getInstance(ApplicationContext)
    .registerReceiver(receiver, filter);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.