0

在我的应用程序中,如果没有Internet连接,我不需要允许用户使用该应用程序。我知道有很多好的教程可以做到这一点,但非实际上已经满足了我需要的要求。Android:适用于应用程序的Internet BroadcastReceiver

互联网连接应该一直在应用程序中检查。这就是为什么,并且基于this文档的一部分,我在Application类中注册了我的接收器。然而,问题是在哪里注销接收器,因为类中没有onDestort(), onStop()方法。

我尝试的另一种选择是(UN)的延伸AppCompatActivity,并在应用中的所有其他活动扩展了BaseActivityBaseActivity类注册的接收器,但我不断收到java.lang.IllegalArgumentException: Receiver not registered

很多问题通过得到解决如果在onStart()中注册了onStop(),或者在onDestroy()中取消了注册,那么在onStop()中注销接收方,如果它在onCreate()中注册,但这对我也不适用。

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); 
    } 
} 
+1

检查此HTTPS然后注销。com/questions/34244581/receiver-not-registered-error –

+0

@SunilP Will,解决了这个问题。谢谢。 另一个问题是,我使用的性能好的方法是什么?我的意思是(注册接收器在BaseActivity –

+0

是啊,它应该允许你 –

回答

0

然而,问题是在哪里注销接收器,因为 没有onDestort()的onStop()类中的方法。

  1. 您可以创建一个服务,并创建一个内部广播接收器类,它会做上述工作。在服务的onDestroy()方法中,您可以取消注册接收方。注册该服务的方法onCreate()

这样做的好处是,你可以进行一些长期的操作,因为广播接收器将只执行内部onReceive()的代码,并退出了,说,如果你想启动任何服务或做其他工作,需要时间再敷上里面的服务是最好的。

我猜想除此之外,没有地方可以放在其他地方。

  • 创建在这样的应用程序类广播接收机的静态方法,

    静态ConnectionReceiver mConnectionReceiver; static Context appContext; static void registerConReceiver() { mConnectionReceiver = new ConnectionReceiver();IntentFilter filter = new IntentFilter(“android.net.conn.CONNECTIVITY_CHANGE”); appContext.registerReceiver(mConnectionReceiver,filter); //计算器: }

  • ,每当你想

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

    )我怎样才能更新我的活动观点?如果连接不可用,我如何防止导航到MainActivity(例如,来自SplashActivity)? –

    +0

    @MotassemJalal'如果连接不可用,我该如何防止导航到MainActivity(例如来自SplashActivity)?' 如果互联网连接不存在,使用上述逻辑和'finish'SplashActivity –

    +0

    当使用回调如在MVP设计模式中),当SplashActivity已经完成时,BroadcastReceiver返回结果。如果没有连接,我需要的不是去MainActivity –

    相关问题