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

Attachment: 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());
			}
		}
	}
}

Reply via email to