Programmatically register a broadcast receiver

后端 未结 10 1643
[愿得一人]
[愿得一人] 2020-11-22 05:00

I\'d like to know what is the best practice/way of programmatically register a broadcast receiver. I want to register specific receivers according to user choice.

As

10条回答
  •  青春惊慌失措
    2020-11-22 05:30

    Two choices

    1) If you want to read Broadcast only when the Activity is visible then,

    registerReceiver(...) in onStart() and unregisterReceiver(...) in onStop()

    2) If you want to read Broadcast even if Activity is in Background then,

    registerReceiver(...) in onCreate(...) and unregisterReceiver(...) in onDestroy()

    Bonus:

    If you are lazy

    If you don't want to write boilerplate code for registering and unregistering a BroadcastReceiver again and again in each Activity then,

    1. Create an abstract Activity
    2. Write boilerplate code in Activity
    3. Leave the implementation as abstract methods

    Here is the code snippet:

    Abstract Activity

    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();
    
    }
    

    Using this approach you can write more boilerplate code such as writing common animations, binding to a service, etc.

    See full code:

    HERE

提交回复
热议问题