2017-02-18 17 views
1

Я хочу динамически настраивать BroadcastReceiver, чтобы проверить, действительно ли я онлайн, только когда мое приложение работает на переднем плане. В моем основном классе я создал фильтр Intent, вложенный класс BroadcastReceiver и, наконец, зарегистрировал/отменил регистрацию получателя в методах onResume и onPause соответственно.Dynamic BroadcastReceiver для проверки онлайн-подключения

Мой вопрос: есть ли намеренное ДЕЙСТВИЕ, которое я могу добавить в свой фильтр намерений, который проверяет возможность онлайн-подключения?

Если нет, как я могу создать этот динамический широковещательный приемник для выполнения только в том случае, когда работает мое приложение?

Вот что мой класс выглядит ....

public class MainActivity extends AppCompatActivity { 
private IntentFilter onlineIntentFilter; 
private CheckOnlineReceiver checkOnlineReceiver; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    onlineIntentFilter = new IntentFilter(); 
    checkOnlineReceiver = new CheckOnlineReceiver(); 
    //*****WHAT INTENT ACTION CAN I PASS TO CHECK NETWORK CONNECTIVITY****** 
    onlineIntentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED); 

    } 

@Override 
protected void onResume() { 
    super.onResume(); 
    registerReceiver(checkOnlineReceiver, onlineIntentFilter); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(checkOnlineReceiver); 
} 


private class CheckOnlineReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     Toast.makeText(getApplicationContext(),"IN METHOD, ACTION = " + action, Toast.LENGTH_LONG).show(); 
    } 
}} 

ответ

1

Добавить действие соединения onlineIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)

и не забудьте добавить разрешение

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Радиопередача приемника onReceive() будет вызвана изменением подключения, которое означает, что на обоих подключен и отключен. поэтому, когда вы получаете braodcast вы должны проверить подключение, как показано ниже

public boolean isNetworkAvailable() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
    if (networkInfo != null && networkInfo.isConnected()) { 
     return true; 
    } 
    return false; 
} 
0

добавить IntentFilter CONNECTIVITY_ACTION

+0

Говорят, что это невозможно решить. Вот что я добавил: onlineIntentFilter.addAction (Intent.CONNECTIVITY_ACTION); –

1

Вот стандартный способ сделать это.

Создать интерфейс, который будет иметь два метода onNetworkConnected() и onNetworkDisconnected()

public interface NetworkConnectivityListener { 
    public void onNetworkConnected(); 
    public void onNetworkDisconnected(); 
} 

Любой класс, который хочет слушать изменения в сети будут реализовывать этот интерфейс и переопределить это два метода.

Создайте класс, который расширит BroadcastReceiver, и onReceive() этого приемника поймает изменения связи. В этом классе создать функцию для регистрации слушателей

public class NetworkBroadcastReceiver extends BroadcastReceiver { 

private NetworkConnectivityListener listener; 

public NetworkBroadcastReceiver(NetworkConnectivityListener listener) { 
    this.listener = listener; 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 

    if (listener != null) { 
     if (isConnectedToInternet()) { 
      listener.onNetworkConnected(); 
     } else { 
      listener.onNetworkDisconnected(); 
     } 
    } 
} 

PS Вы можете легко проверить, если устройство подключено к Интернету или нет. Просто Google.

Теперь предположим, что вы хотите, чтобы ваша MainActivity прослушивала изменения в сети, все, что вам нужно сделать, это реализовать NetworkConnectivityListener в своем основном вызове активности и создать экземпляр NetworkBroadcastReceiver, передающий контекст MainActivity, и он начнет получать сетевые обновления.

0

Вам нужно будет создать службу, как вы хотите, чтобы выполнить затянувшуюся задачу в фоновом режиме.

Служба должна быть зарегистрирована в манифесте в тегах <application>.

<service android:name=".WifiService" 
     android:stopWithTask="true" 
     android:enabled="true"/> 

stopWithTask вызывает служба должна быть уничтожена, когда все операции будут уничтожены (значение по умолчанию верно).

Вам необходимо будет зарегистрировать и отменить регистрацию BroadcastReceiver для действия CONNECTIVITY_CHANGE в классе обслуживания.

public class WifiService extends Service { 

    private BroadcastReceiver mReceiver; 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); 

     // Your BroadcastReceiver class 
     mReceiver = new WifiReceiver(); 
     registerReceiver(mReceiver, filter); 
     return null; 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     unregisterReceiver(mReceiver); 
     return super.onUnbind(intent); 
    } 
} 

А затем в BroadcastReceiver вы должны прослушать CONNECTIVITY_CHANGE.

public class WifiReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = manager.getActiveNetworkInfo(); 

     boolean isConnected = networkInfo != null && 
           networkInfo.isConnectedOrConnecting(); 

     if (isConnected) { 
      switch (networkInfo.getType()) { 
       case ConnectivityManager.TYPE_WIFI: 
        // Connected via wifi 
        break; 

       case ConnectivityManager.TYPE_ETHERNET: 
        // Connected via ethernet 
        break; 

       case ConnectivityManager.TYPE_MOBILE: 
        // Connected via mobile data 
        break; 
      } 
     } 
    } 
} 

С помощью этой установки вы сможете уведомить компоненты своего приложения о смене соединения.

 Смежные вопросы

  • Нет связанных вопросов^_^