Servicio que no se está creando (o que se conecta) después de bindService ()
Tengo este servicio simple que difunde la localización actual del usuario. Quiero utilizar el mecanismo de vinculación sólo para controlar el ciclo de vida del servicio, pero el servicio no está empezando.
¿Qué hice mal?
- if (pausa == null) {no funciona
- ¿Cómo generar el gráfico de llamadas desde Android APK?
- La aplicación de cámara de llamadas recrea la actividad de Android
- Cómo hacer coincidir int con el enum
- Negación de permisos al intentar acceder a contactos en Android
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: Se ha resuelto gracias a la respuesta de NickT.
La entrada de manifiesto no tenía un filtro de intenciones o el nombre correcto
<service android:enabled="true" android:name="com.android.gps.services.LocationService"> <intent-filter> <action android:name="com.android.gps.services.LocationService" /> </intent-filter> </service>
Y la intención que usé para encuadernar era como las que necesitas usar al iniciar una actividad. La correcta es:
Intent intent = new Intent("com.android.gps.services.LocationService");
- Uso de Google Docs y Google Spreadsheet API para Android
- Programar un evento para ser ejecutado en el futuro (Cron Job la forma de Android)
- La imagen de recorte reduce la calidad y la frontera se ve mal
- Retrofit 2 Callback onResponse en el subproceso de fondo
- ¿Cómo puedo obtener el contexto de la aplicación de un servicio de Android?
- Obtener cumpleaños para cada contacto en la aplicación de Android
- URL de caracteres ilegales
- Animar el color de la barra de estado en DrawerLayout - Diseño del material
El onStartCommand sólo se ejecutará si el servicio se inicia explícitamente, parece que sólo desea enlazar con él, lo cual está bien. No veo que usted ha fijado la conexión del servicio correctamente sin embargo. Estoy publicando mi programa de stub que muestra cómo vincular a un servicio y llamar a un método en el servicio a través de un cuaderno. Es posible que desee ejecutar esto y ver la secuencia de los distintos mensajes de registro. Obviamente, tendrá que agregar su código BroadcastReceiver y onLocationChaged para que sea útil para usted.
La actividad
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'S 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(); } }
El servicio
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's 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"); } }
El manifiesto
<?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>
Espero que esto ayude
Tuve mi implementación de servicio ServiceConnection
y vinculado de esta manera:
bindService( new Intent( this, Service.class ), this, Context.BIND_AUTO_CREATE );
Luego onServiceConnected()
las devoluciones de llamada para onServiceConnected()
y onServiceDisconnected()
en mi Activity
Cuando llama a bindService
puede obtener este error:
ActivityManager java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.android.server.am.ActivityRecord$Token
Compruebe la salida de logcat.
Este es un error de Android.
Para solucionarlo, use getApplicationContext().bindService(...)
- SLF4J varargs interpreta la primera cadena como marcador
- Método correcto para llamar al servicio Web (API) de la clase Fragment