Проблема в понимании приемника вещания - PullRequest
0 голосов
/ 04 июня 2011

У меня есть приложение, в котором я пытаюсь обнаружить КОГДА Интернет-соединение появляется и когда оно исчезает.

В тот момент, когда он появляется, я запускаю новый поток (отличный от пользовательского интерфейса), который подключает мое приложение к удаленному серверу.

Для этого я с трудом пытаюсь реализовать вещательный приемник, который СЛУШАЕТ для подключения, но у меня возникают проблемы с пониманием концепции.

В моем onCreate() есть что-то вроде:

onCreate()    
{
     cThread = new Thread(new ClientThread(syncToken));
     cThread.start();
}

Когда есть подключение к Интернету, я отправляю данные через сокет, когда нет, я храню данные в базе данных. И когда появляется Интернет, я перезагружаю свой поток для повторного подключения и отправки старых данных (которые не были отправлены из-за сбоя сети) и новых.

Допустим, я бы реализовал что-то вроде этого:

DoRefreshBroadcastReceiver refreshBroadcastReceiver; 
...    
onResume() {    
  // register the refreshing complete broadcast receiver    
  IntentFilter intentFilter = new IntentFilter(DO_REFRESH);    
  refreshBroadcastReceiver = new doRefreshBroadcastReceiver();    
  registerReceiver(refreshBroadcastReceiver, intentFilter);        
}

public class DoRefreshBroadcastReceiver extends BroadcastReceiver {     
    @Override
    public void onReceive(Context context, Intent intent) {    
        // call method to run fetch code...
    }
} 

Означает ли это, что при обнаружении интернет-соединения вызывается мой onReceive()? И я мог бы начать свою нить там?

Какова концепция использования намерения? Потому что я действительно не понимаю. Как его использовать и каково его назначение?


ИДЕЯ: Я действительно не знаю, как использовать это намерение в этом случае или как использовать его в моем приложении!

Обнаружит ли эта вещь соединение с Интернетом, даже когда я не в этой деятельности?


EDIT:

Вот как выглядит мой onReceive:


onCreate()
{
    cThread = new Thread(new ClientThread(syncToken));
    // cThread.start();

    connIntentFilter = new IntentFilter(
                             "android.net.conn.CONNECTIVITY_CHANGE");
    connListener = new MyConnectivityListener();
}

public void onReceive(Context context, Intent intent)
{
    mNetworkInfo = (NetworkInfo) intent
            .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);

    if (mNetworkInfo != null && mNetworkInfo.isConnected())
    {
        /*
         * if(mNetworkInfo.getType()==ConnectivityManager.TYPE_WIFI);
         *
         *
         * else
         */

        cThread.start();
    }

    else {
        System.out.println("There is no internet connection!");

        try {
            cThread.stop();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

mNetworkInfo != null && mNetworkInfo.isConnected()    

Означает ли это, что он подключен, или я должен проверить соединение определенного типа на эмуляторе?

* Я думаю, что я должен начать свою тему непосредственно в onReceive(). Как только мое приложение запускается, оно обнаруживает подключение к Интернету и BroadcastReceiver срабатывает, не так ли?

1 Ответ

3 голосов
/ 05 июня 2011

Попробуйте что-то вроде этого ...

public class MyActivity extends Activity {

    private MyConnectivityListener connListener = null;
    private IntentFiler connIntentFilter = null;
    private Boolean connIntentFilterIsRegistered = false;

    @Override
    protected void onCreate(...) {
        ...
        connIntentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        connListener = new MyConnectivityListener();
    }

    @Override
    protected void onResume() {
        ...
        if (!connIntentFilterIsRegistered) {
            registerReceiver(connListener, connIntentFilter);
            connIntentFilterIsRegistered = true;
        }
    }

    @Override
    protected void onPause() {
        ...
        if (connIntentFilterIsRegistered) {
            unregisterReceiver(connListener);
            connIntentFilterIsRegistered = false;
        }
    }

    protected class MyConnectivityListener extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // The NetworkInfo for the affected network is sent
            // as an extra; it should be consulted to see what
            // kind of connectivity event occurred.
        }
    }
}

BroadcastReceiver по сути является «слушателем», который прослушивает события, отправленные системой или, в некоторых случаях, вашими собственными компонентами приложения.

В этом случае система передает android.net.conn.CONNECTIVITY_CHANGE всякий раз, когда происходит изменение соединения (подключено / отключено).Зарегистрировав свой BroadcastReceiver для «прослушивания» этого события, вы можете получить extra, включенный в намерение, из метода onReceive(...) вашего BroadcastReceiver и делать все, что вам нужно, соответственно.Дополнительным является объект `NetworkInfo, который будет содержать информацию о конкретной сети и о том, подключена она или нет.

...