Reputation: 31
Hi: I can't seem to get an activity to bind to a service in the same package.
The activity looks like this:
public class myApp extends TabActivity {
static private String TAG = "myApp";
private myService mService = null;
private ServiceConnection mServiceConn = new ServiceConnection(){
public void onServiceConnected(ComponentName name, IBinder service) {
Log.v(TAG, "Service: " + name + " connected");
mService = ((myService.myBinder)service).getService();
}
public void onServiceDisconnected(ComponentName name) {
Log.v(TAG, "Service: " + name + " disconnected");
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
doBind();
Log.i(TAG, "Started (UI Thread)");
// set content
setContentView(R.layout.main);
Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost(); // The activity TabHost
... add some tabs here....
tabHost.setCurrentTab(0);
}
private void doBind(){
Intent i = new Intent(this,myService.class);
if( bindService(i, mServiceConn, 0 )){
Log.i(TAG, "Service bound");
} else {
Log.e(TAG, "Service not bound");
}
}
}
Then the service:
public class myService extends Service {
private String TAG = "myService";
private boolean mRunning = false;
@Override
public int onStartCommand(Intent intent, int flags, int startid) {
Log.i(TAG,"Service start");
mRunning = true;
Log.d(TAG,"Finished onStartCommand");
return START_STICKY;
}
/*
* Called on service stop
*/
@Override
public void onDestroy(){
Log.i(TAG,"onDestroy");
mRunning = false;
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
boolean isRunning() {
return mRunning;
}
/*
* class for binding
*/
private final IBinder mBinder = new myBinder();
public class myBinder extends Binder {
myService getService() {
return myService.this;
}
}
}
bindService returns true, but onServiceConnection is never called (mService is always null, so I can't do something like mService.isRunning() )
The manifest entry for the service is just:
<service android:name=".myService"></service>
I was copying the code direct from the Android developers site, but I must have missed something.
Upvotes: 3
Views: 15205
Reputation: 17216
Your service is never started. Start the service with
startService(bindIntent)
See this similar code:
Intent bindIntent = new Intent(this,ServiceTask.class);
if (ServiceTools.isServiceRunning() == false){
Log.d(Global.TAG,"-->service will be started.");
startService(bindIntent);
}else{
Log.d(Global.TAG,"-->service already is running");
}
boolean bound = bindService(bindIntent,mConnection,0);
You could also start the service automatically when binding with BIND_AUTO_CREATE instead of 0.
Here is the ServiceTools class also if you only want your service to be started once. Otherwise you may get more than one running instance of your service and methods called in onServiceConnected will be rut every time onCreate() / doBind() are.
public class ServiceTools {
public static boolean isServiceRunning(){
final ActivityManager activityManager = (ActivityManager)Global.gContext.getSystemService(Global.gContext.ACTIVITY_SERVICE);
final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);
boolean isServiceFound = false;
for (int i = 0; i < services.size(); i++) {
//Log.d(Global.TAG, "Service" + i + " :" + services.get(i).service);
//Log.d(Global.TAG, "Service" + i + " package name : " + services.get(i).service.getPackageName());
//Log.d(Global.TAG, "Service" + i + " class name : " + services.get(i).service.getClassName());
if ("com.atClass.lmt".equals(services.get(i).service.getPackageName())){
if ("com.atClass.lmt.ServiceTask".equals(services.get(i).service.getClassName())){
isServiceFound = true;
}
}
}
return isServiceFound;
}
}
Upvotes: 3
Reputation: 10590
it's a known issue that activities started as a subactivity in a tabactivity (running in the tabhost) cannot bind to services, even in the same package. there is a "hack" workaround. if you call:
getApplicationContext().bindService(Intent, connection, flags);
rather than just:
bindService(Intent, connection, flags);
everything will work. had this same problem, found the details in this bug report: http://code.google.com/p/android/issues/detail?id=2483
Upvotes: 25