Hello, I am trying to implement a service that is supposed to download stuff from a cloud service. So I want this service to be notified whenever phone/tablet looses network connectivity.
So I implemented code that looks like this: receiver = new ConnectivityReceiver(); filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); try { Intent i = registerReceiver(receiver, filter); } catch (Exception e) { .... } However when I have this code in a class that extends a Service registerReciver always throws a NullPointerException. However the same code in a class that extends an activity does not throw such an exception. I have attached my manifest file and the full code for the service template. Would appreciate any pointers as to why this works in activity and not in a service. Or is there any better way for a service that run in the background to know when device looses/gains (IP) network connectivity? Regards, -Subodh -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en
AndroidManifest.xml
Description: XML document
package com.mycompany.ScsService; import android.app.Activity; import android.app.Service; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.StrictMode; import android.util.Log; import android.os.Process; import java.lang.String; import java.lang.Exception; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.content.BroadcastReceiver; import android.content.IntentFilter; import android.content.Context; public class ScsService extends Service { private final static String LOG_TAG = ScsService.class.getCanonicalName(); private ConnectivityReceiver receiver = null; private int result = Activity.RESULT_OK; // Used to receive messages from the Activity final Messenger inMessenger = new Messenger(new IncomingHandler()); // Use to send message to the Activity private Messenger outMessenger; private IntentFilter filter = null; public ScsService() { super(); Log.d(LOG_TAG, new Exception().getStackTrace()[0].getMethodName() + " called"); // Don't do this // Network Stuff will run in the main thread StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .permitAll().build(); StrictMode.setThreadPolicy(policy); receiver = new ConnectivityReceiver(); filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); if (receiver != null && filter != null) { try { Intent i = registerReceiver(receiver, filter); if ( i == null ) Log.d(LOG_TAG,"Register received returned null"); else Log.d(LOG_TAG,"Register receiver returned non-null"); } catch (Exception e) { Log.d(LOG_TAG,"Exception while registering receiver => " + e); } } else { receiver = null; Log.d(LOG_TAG,"Receiver is not registered."); } } class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { Bundle data = msg.getData(); String message = data.getString(MessageConstants.MESSAGE); String str = "Message id is " + msg.what + " Actual message " + message + " "; Log.e("MESSAGE", str); Message backMsg = Message.obtain(); backMsg.arg1 = result; Bundle bundle = new Bundle(); str = str + " Service PID " + Process.myPid(); bundle.putString(MessageConstants.RETURN_MESSAGE, str); backMsg.setData(bundle); try { outMessenger.send(backMsg); } catch (android.os.RemoteException e1) { Log.w(getClass().getName(), "Exception sending message", e1); } } } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(LOG_TAG, new Exception().getStackTrace()[0].getMethodName() + " called for ScsService "); // We want this service to continue running until it is explicitly // stopped, so return sticky. return START_STICKY; } @Override public void onDestroy() { Log.d(LOG_TAG, new Exception().getStackTrace()[0].getMethodName() + " @ScsService called"); if ( receiver != null ) unregisterReceiver(receiver); } @Override public void onRebind(Intent intent) { Log.d(LOG_TAG, new Exception().getStackTrace()[0].getMethodName() + " @ScsService called"); } @Override public boolean onUnbind(Intent intent) { Log.d(LOG_TAG, new Exception().getStackTrace()[0].getMethodName() + " @ScsService called"); return true; } @Override public IBinder onBind(Intent intent) { Log.d(LOG_TAG, new Exception().getStackTrace()[0].getMethodName() + " called for ScsService"); Bundle extras = intent.getExtras(); Log.d(LOG_TAG, "getPackage = " + intent.getPackage() + "class = " + intent.getClass().getName() + "toString = " + intent.toString()); // Get messager from the Activity if (extras != null) { outMessenger = (Messenger) extras.get("MESSENGER"); } // Return our messenger to the Activity to get commands return inMessenger.getBinder(); } private String getNetworkStateString(NetworkInfo.State state) { String stateString = "Unknown"; switch (state) { case CONNECTED: stateString = "Connected"; break; case CONNECTING: stateString = "Connecting"; break; case DISCONNECTED: stateString = "Disconnected"; break; case DISCONNECTING: stateString = "Disconnecting"; break; case SUSPENDED: stateString = "Suspended"; break; default: stateString = "Unknown"; break; } return stateString; } private class ConnectivityReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { /* NetworkInfo info; ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); System.out.println("CALLED ON RECEIVE ON CONNECTIVITY RX"); info = mgr.getActiveNetworkInfo(); */ NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (null != info) { String state = getNetworkStateString(info.getState()); String stateString = info.toString().replace(',', '\n'); String infoString = String.format( "Network Type: %s\nNetwork State: %s\n\n%s", info.getTypeName(), state, stateString); Log.i("ConnTest", info.getTypeName()); Log.i("ConnTest", state); Log.i("ConnTest", info.toString()); } } } }