代码之家  ›  专栏  ›  技术社区  ›  Vikramsinh Gaikwad

如何从应用程序类中注销广播接收器?

  •  2
  • Vikramsinh Gaikwad  · 技术社区  · 8 年前

    我在Android的应用程序类中注册了广播接收器,但现在我的问题是在哪里注销该广播?

    public class MyApplication extends Application 
    
    {
    
    @Override
    public void onCreate() {
         ..... 
         // OTHER INITIALIZATIONS
         initNetworkBR();
    } 
    private void initNetworkBR() {
    
          br = new BroadcastReceiver() {
            ....
          };
          IntentFilter filter = new IntentFilter();
          filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
          registerReceiver(br, filter);
       }
    }
    
    6 回复  |  直到 8 年前
        1
  •  3
  •   Naruto Uzumaki    8 年前

    一个建议是在您的启动器活动或所需活动中取消注册,如下所示:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ((MyApplication) getApplication()).unregisterReceiver();
    }
    

    并实施 unregisterReceiver 中的方法 MyApplication 类别:

    public void unregisterReceiver() {
         unregisterReceiver(br);//your broadcast
    }
    
        2
  •  1
  •   ADM    8 年前

    除了在应用程序类中使用广播接收器外,您可以为所有活动使用基类。并在基本活动中注册BR,然后向child提供回调。 由于活动具有严格的生命周期模型,因此最好在活动中使用运行时广播接收器,而不是应用程序类。

     public class BaseActivity extends AppCompatActivity {
        @Override
        protected void onResume() {
            super.onResume();
            //registerReceiver Here
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            //unregisterReceiver here
        }
    }
    
        3
  •  0
  •   jorjSB    8 年前

    您应该在onPause()中使用unregisterReceiver(BroadcastReceiver receiver)来注销广播接收器。

    例子:

    public class MyActivity extends Activity {
      private final BroadcastReceiver mybroadcast = new SmsBR();
    
      public void onResume() {
        super.onResume();
    
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(mybroadcast, filter);
      }
    
      public void onPause() {
        super.onPause();
    
        unregisterReceiver(mybroadcast);
      }
    }
    
        4
  •  0
  •   Dhruv Patel    8 年前

    我认为你应该使用 LocalBroadcastManager 注册和注销接收人,而不是 BroadcastReceiver .

    Benefits to use LocalBroadcastManager

    @Override
    public void onCreate(Bundle savedInstanceState) {
    
      LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
          new IntentFilter("custom-event-name"));
    }
    
    @Override
    protected void onDestroy() {
      // Unregister since the activity is about to be closed.
      LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
      super.onDestroy();
    }
    
        5
  •  0
  •   Samir Bhatt    8 年前

    尝试以下代码:
    如果您已从Manifiest注册。xml

    ComponentName component = new ComponentName(context, MyReceiver.class);
    
        int status = context.getPackageManager().getComponentEnabledSetting(component);
        if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
         context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP);
        }
    

    如果以编程方式注册接收器:

    @Override
    public void onCreate(Bundle savedInstanceState) {
    
      LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
          new IntentFilter("custom-event-name"));
    }
    
    @Override
    protected void onDestroy() {
      // Unregister since the activity is about to be closed.
      LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
      super.onDestroy();
    }
    
        6
  •  0
  •   Esteban Higuita Duarte    4 年前

    您实施 Application.ActivityLifecycleCallbacks 接口并在从应用程序类创建时将回调注册为continue:

    registerActivityLifecycleCallbacks(<here your typed class with ActivityLifecycleCallbacks>)
    

    然后,您可以完全控制所有活动的生命周期,以执行诸如注销或注册接收器之类的操作。

    我希望它能有所帮助