Service is not created (or connected) after bindService ()

I have this simple service that transfers the current location of the user. I want to use the binding mechanism only to control the life cycle of the service, but the service just does not start.

What have I done wrong?

public class GPSActivity extends ListActivity { ... protected void onResume() { super.onResume(); Log.i("Service", "Service bound"); Intent intent = new Intent(this, LocationService.class); bindService(intent, service_connection , Context.BIND_AUTO_CREATE); } protected void onPause() { if (dataUpdateReceiver!=null) unregisterReceiver(dataUpdateReceiver); unbindService(service_connection); super.onPause(); } class LocationServiceConnection implements ServiceConnection{ public void onServiceConnected(ComponentName name, IBinder service) { Log.i("Service", "Service Connected"); } public void onServiceDisconnected(ComponentName name) { } } } 

LocalBinder.java

 public class LocalBinder<S> extends Binder { private String TAG = "LocalBinder"; private WeakReference<S> mService; public LocalBinder(S service){ mService = new WeakReference<S>(service); } public S getService() { return mService.get(); } } 

LocationService.java

 public class LocationService extends Service { public void onCreate() { initLocationListener(); Log.i("Location Service","onCreate()"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("Location Service", "Received start id " + startId + ": " + intent); return START_NOT_STICKY; } private final IBinder mBinder = new LocalBinder<LocationService>(this); @Override public IBinder onBind(Intent intent) { return mBinder; } } 

AndroidManifest.xml

 <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > ... <service android:name=".LocationService"> </service> </application> 

EDIT: Fixed thanks to NickT's answer.

There was no intent filter or valid name in the manifest entry

 <service android:enabled="true" android:name="com.android.gps.services.LocationService"> <intent-filter> <action android:name="com.android.gps.services.LocationService" /> </intent-filter> </service> 

And the intention that I used to bind was similar to the ones you should use at startup. correct:

 Intent intent = new Intent("com.android.gps.services.LocationService"); 
+7
source share
3 answers

OnStartCommand will only be executed if the service is explicitly running, it looks like you just want to bind to it, and that's fine. I do not see that you have correctly configured the service connection. I am sending my stub program that shows how to bind to the service and call the method in the service through a binder. You might want to run this and see a sequence of different log messages. Obviously, you need to add your BroadcastReceiver and onLocationChaged code to make it useful to you.

Activities

 package com.servtest.test; import com.servtest.test.LocationService.LocalBinder; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; public class ServiceTestActivity extends Activity { boolean mServiceConnected = false; boolean mBound = false; private LocationService mLocnServ; ServiceConnection mServconn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d("SVTEST", "Activity service connected"); LocalBinder binder = (LocalBinder) service; mLocnServ = binder.getService(); // Can't call this methodInTheService UNTIL IT BOUND! mLocnServ.methodInTheService(); mBound = true; } @Override public void onServiceDisconnected(ComponentName name) { Log.d("SVTEST", "Activity service disconnected"); mBound = false; } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onStart() { super.onStart(); Log.d("SVTEST", "Activity onStart"); mServiceConnected = bindService(new Intent( "com.servtest.test.LOCATIONSERVICE"), mServconn, Context.BIND_AUTO_CREATE); } @Override protected void onResume() { super.onResume(); Log.d("SVTEST", "Activity onResume"); } @Override public void onPause() { Log.d("SVTEST", "Activity onPause"); super.onPause(); } @Override public void onStop() { Log.d("SVTEST", "Activity onStop"); if (mBound) { unbindService(mServconn); mBound = false; } super.onStop(); } } 

Service

 package com.servtest.test; import android.app.Service; import android.content.Intent; import android.location.Location; import android.location.LocationListener; import android.os.Binder; import android.os.Bundle; import android.os.IBinder; import android.util.Log; public class LocationService extends Service implements LocationListener { private final IBinder mBinder = new LocalBinder(); @Override public void onLocationChanged(Location arg0) {} @Override public void onProviderDisabled(String arg0) {} @Override public void onProviderEnabled(String arg0) {} @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) {} @Override public IBinder onBind(Intent intent) { Log.d("SVTEST", "Loc service ONBIND"); return mBinder; } @Override public boolean onUnbind(Intent intent) { Log.d("SVTEST", "Loc service ONUNBIND"); return super.onUnbind(intent); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // Won't run unless it EXPLICITLY STARTED Log.d("SVTEST", "Loc service ONSTARTCOMMAND"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d("SVTEST", "Loc service ONDESTROY"); } public class LocalBinder extends Binder { LocationService getService() { // Return this instance of LocalService so clients can call public methods return LocationService.this; } } public void methodInTheService() { // A method you can call in the service Log.d("SVTEST", "Loc service EXECUTING THE METHOD"); } } 

Manifesto

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.servtest.test" android:versionCode="1" android:versionName="1.0" > <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".ServiceTestActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:enabled="true" android:name="LocationService"> <intent-filter> <action android:name="com.servtest.test.LOCATIONSERVICE" /> </intent-filter> </service> </application> </manifest> 

Hope this helps

+3
source

I had an Activity Activity Activity and attached like this:

 bindService( new Intent( this, Service.class ), this, Context.BIND_AUTO_CREATE ); 

Then the processed callbacks for onServiceConnected() and onServiceDisconnected() in my Activity

0
source

When you call bindService , you may get this error:

ActivityManager java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.android.server.am.ActivityRecord$Token

Check logcat output.

This is an Android bug.

To solve this problem, use getApplicationContext().bindService(...)

0
source

All Articles