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 [email protected]
To unsubscribe from this group, send email to
[email protected]
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());
}
}
}
}

