繁体   English   中英

Android:该应用程序的Internet BroadcastReceiver

[英]Android: Internet BroadcastReceiver for the application

在我的应用程序中,如果没有互联网连接,则无需允许用户使用该应用程序。 我知道有很多很好的教程可以做到这一点,但实际上并没有满足我的要求。

应始终在应用程序中检查互联网连接。 因此,基于文档的这一部分,我在Application类中注册了接收器。 但是,问题在于在哪里注销接收者 ,因为该类中没有onDestort(), onStop()方法。

我尝试的另一个选项是在扩展了AppCompatActivity BaseActivity类中(取消注册)接收器,而应用程序中的所有其他活动都扩展了BaseActivity ,但是我一直在获取java.lang.IllegalArgumentException: Receiver not registered

通过在onStop()注销接收器onStop()如果已在onStart()中注册onStart()或在onDestroy()注销onDestroy()如果已在onCreate()注册onDestroy()来解决很多问题,但这对我也不起作用。

public class ConnectivityReceiver extends BroadcastReceiver {

    public interface ConnectivityChangedListener {
        void onConnectivityChanged(boolean isConnected);
    }

    public static ConnectivityChangedListener listener;

    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null
                && activeNetwork.isConnectedOrConnecting();

        if (listener != null) {
            Log.i("Connectivity", "" + isConnected);
            listener.onConnectivityChanged(isConnected);
        }
    }
}

我的BaseActivity.java(其他活动对此进行了扩展)

public class BaseActivity extends AppCompatActivity implements ConnectivityReceiver.ConnectivityChangedListener {

    private static BroadcastReceiver br;

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

        br = new ConnectivityReceiver();
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        ConnectivityReceiver.listener = this;

        registerReceiver(br, filter);

    }

    @Override
    public void onConnectivityChanged(boolean isConnected) {
        Log.i("Connectivity", "Activity " + isConnected);
    }

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

但是,问题在于在哪里注销接收者,因为该类中没有onDestort()和onStop()方法。

  1. 您可以创建服务并创建内部广播接收器类,以完成上述工作。 在服务的onDestroy()方法中,您可以注销接收者。 在服务的onCreate()方法中注册。

这样做的好处是您可以执行一些长时间的操作,因为广播接收器将只执行onReceive()的代码并退出,例如,如果您要启动任何服务或执行其他需要花费时间的工作,则将服务放入内部最好。

我想除了那儿没有其他地方可以放它了。

  1. 在Application类的广播接收器中创建一个静态方法,如下所示:

    静态ConnectionReceiver mConnectionReceiver; 静态上下文appContext; 静态无效registerConReceiver(){mConnectionReceiver = new ConnectionReceiver(); IntentFilter filter = new IntentFilter(“ android.net.conn.CONNECTIVITY_CHANGE”); appContext.registerReceiver(mConnectionReceiver,过滤器); }

然后随时注销

static void unregisterConReceiver()
    {
        try{
             appContext.unregisterReceiver(mConnectionReceiver);
            mConnectionReceiver=null;
        }catch (IllegalArgumentException e) {
            mConnectionReceiver = null;
        }

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM