开发者

Problem in understanding broadcast receiver

I have an app in which I'm trying to detect WHEN the Internet connection appears and when it disappears.

At the moment, when it appears, I'm starting a new thread (different from the UI) which connects my app to a remote server.

For that I'm hardly trying to implement a broadcast receiver which LISTENS for connectivity, but I'm having problems in understanding the concept.

In my onCreate() I have somethig like:

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

When there is connection to the Internet I'm sending data through the socket, when there is not I'm storing the data in a database. And when the Internet 开发者_如何转开发appears I'm restarting my thread to reconnect and send the old data (which hasn't been sent because of network crashing) and the new one.

Let's say I would implement something like this:

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...
    }
} 

Does this mean that when the Internet connection is detected my onReceive() gets called? And I could start my thread there?

What is the concept of using an intent? Because I really don't get it. How to use it, and what its purpose?


THE IDEA: I don't really know how to use this intent in this case or how to use it in my app!

Would this thing detect the connection to the Internet even when I'm not in this activity?


EDIT:

Here is how my onReceive looks like:


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()    

Does this mean it's connected or should I verify for a certain type of connection on the emulator?

*I think that I should start my thread directly in onReceive(). As soon as my app starts it detects the Internet connection and BroadcastReceiver gets fired, doesn't it?


Try something like this...

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.
        }
    }
}

A BroadcastReceiver is effectively a 'listener' which listens for events either sent by the system or, in some cases, by your own application components.

In this case, the system broadcasts android.net.conn.CONNECTIVITY_CHANGE whenever there is a connection change (connected/disconnected). By registering your BroadcastReceiver to 'listen' for that event, you can get the extra included in the Intent from your BroadcastReceiver's onReceive(...) method and do whatever you need to do accordingly. The extra is a `NetworkInfo object which will contain information about the particular network and whether it is connected or not.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜