Android activity has leaked service connection

Android-activity-has-leaked-service-connection-featured.png

I’m working on my first Android app, so I apologize if this is extremely obvious. I’ve got three activities in my app, and the user switches back and forth pretty frequently. I’ve also got a remote service, which handles a telnet connection. The apps need to bind to this service in order to send/receive telnet messages.

Edit Thank you BDLS for your informative answer. I have re-written my code in light of your clarification on the difference between using bindService() as a stand-alone function or after startService(), and I now only get the leak error message intermittently when using the back button to cycle between activities.

My connection activity has the following onCreate() and onDestroy():

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

/*
* Initialize the ServiceConnection. Note that this is the only place startService() is run.
* It is also the only time bindService is run without dependency on connectStatus.
*/
conn = new TelnetServiceConnection();
//start the service which handles telnet
Intent i = new Intent();
i.setClassName( “com.wingedvictorydesign.LightfactoryRemote”, “com.wingedvictorydesign.LightfactoryRemote.TelnetService” );
startService(i);
//bind to the service
bindService(i, conn, 0);

setContentView(R.layout.connect);
setupConnectUI();

}//end OnCreate()

@Override
protected void onDestroy() {
super.onDestroy();

//unbind the service and null it out
if (conn != null) {
unbindService(conn);
conn = null;
}

if(connectStatus == 0) {
//stop the service
Intent i = new Intent();
i.setClassName( “com.wingedvictorydesign.LightfactoryRemote”, “com.wingedvictorydesign.LightfactoryRemote.TelnetService” );
stopService(i);
Log.d(“LightfactoryRemote”, “Connect onDestroy() attempted to stop service”);
}

Log.d(“LightfactoryRemote”, “Connect onDestroy()”);
}//end onDestroy()

So the service is started when the activity is started, and stopped when the activity is destroyed if no successful telnet connection was made (connectStatus == 0). The other activities bind to the service only if a successful connection was made (connectStatus == 1, saved to a shared preferences). Here is their onResume() and onDestroy():

@Override
protected void onResume() {
super.onResume();

//retrieve the shared preferences file, and grab the connectionStatus out of it.
SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_WORLD_WRITEABLE);
connectStatus = settings.getInt(“connectStatus”, 0);

Log.d(“LightfactoryRemote”, “Focus onResume with ” + connectStatus);

//if a telnet connection is active, start the service and bind to it
if (connectStatus == 1) {
conn = new TelnetServiceConnection();
Intent i = new Intent();
i.setClassName(“com.wingedvictorydesign.LightfactoryRemote”, “com.wingedvictorydesign.LightfactoryRemote.TelnetService”);
bindService(i, conn, 0);
//TODO write restore texview code
}//end if
}//end onResume

@Override
protected void onDestroy() {
super.onDestroy();
//unbind the service and null it out.
if (conn != null) {
Log.d(“LightfactoryRemote”, “Focus onDestroy() attempted to unbind service”);
unbindService(conn);
conn = null;
}
Log.d(“LightfactoryRemote”, “Focus onDestroy()”);
}//end onDestroy()

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>