Tengo una clase de servicio. He exportado esta clase a jar y he incrustado el jar en mi aplicación cliente.
Cuando es necesario, llamo a la clase de servicio. Cuando intento hacer esto, aparece el siguiente error:
Unable to start service Intent {comp={com.sample.service/com.sample.service.serviceClass}} : not found
Tengo otra clase además de la clase de servicio, a la que puedo acceder (crear un objeto de esa clase) que están dentro del mismo frasco.
Siento que me he perdido algo en mi configuración o manifiesto o algo así.
Ayúdame a identificar el mismo. Mi código está abajo:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent () ;
intent.setClassName("com.sample.service" ,"com.sample.service.serviceClass") ;
this.startService(intent) ; // when I call this line I get the message...
// binding other process continue here
}
Client manifest.xml
<service android:name="com.sample.service.serviceClass"
android:exported="true" android:label="@string/app_name"
android:process=":remote">
<intent-filter><action android:name="com.sample.service.serviceClass"></action>
</intent-filter>
</service>
Gracias de antemano,
Vinay
Respuestas:
Primero, no es necesario
android:process=":remote"
, así que elimínelo, ya que todo lo que hará es ocupar RAM adicional sin ningún beneficio.En segundo lugar, dado que el
<service>
elemento contiene una cadena de acción, utilícela:public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent=new Intent("com.sample.service.serviceClass"); this.startService(intent); }
fuente
android:process=":remote"
, así que elimínelo, ya que todo lo que hará es ocupar RAM extra sin ningún beneficio. Un servicio remoto es aquel que ofrece una API a través de AIDL y no tiene nada que ver con elandroid:process
atributo. Aquí hay un servicio remoto de muestra: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/… y aquí hay un cliente correspondiente de ese servicio: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ …Para cualquier otra persona que se encuentre con este hilo, tuve este problema y me estaba tirando de los pelos. Tenía la declaración de servicio FUERA de la etiqueta final '<aplicación>' ¡DUH!
CORRECTO:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...> ... <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity ...> ... </activity> <service android:name=".Service"/> <receiver android:name=".Receiver"> <intent-filter> ... </intent-filter> </receiver> </application> <uses-permission android:name="..." />
INCORRECTO pero aún se compila sin errores:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...> ... <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity ...> ... </activity> </application> <service android:name=".Service"/> <receiver android:name=".Receiver"> <intent-filter> ... </intent-filter> </receiver> <uses-permission android:name="..." />
fuente
1) verifique si la declaración de servicio en el manifiesto está anidada en la etiqueta de la aplicación
<application> <service android:name="" /> </application>
2) compruebe si
service.java
está en el mismo paquete o paquete diferente que la actividad<application> <!-- service.java exists in diff package --> <service android:name="com.package.helper.service" /> </application>
<application> <!-- service.java exists in same package --> <service android:name=".service" /> </application>
fuente
Espero poder ayudar a alguien con esta información también: moví mi clase de servicio a otro paquete y arreglé las referencias. El proyecto estaba perfectamente bien, PERO la actividad no pudo encontrar la clase de servicio.
Al mirar el log en logcat noté la advertencia sobre el problema: la actividad no pudo encontrar la clase de servicio, pero lo curioso fue que el paquete era incorrecto, contenía un carácter "/". El compilador estaba buscando
en vez de
Saqué la clase de servicio del paquete y volví a entrar y todo funcionó bien.
fuente
En mi caso, el límite máximo de 1 MB para el transporte de datos por intención. Solo usaré Caché o Almacenamiento.
fuente
Encontré el mismo problema. Perdí casi un día tratando de iniciar un servicio desde el
OnClickListener
método: fuera delonCreate
y después de 1 día, ¡todavía fallé! ¡Muy frustrante! Estaba mirando el ejemplo de muestraRemoteServiceController
. El suyo funciona, ¡pero mi implementación no funciona!La única forma en que funcionaba para mí era desde adentro
onCreate
método . Ninguna de las otras variantes funcionó y créanme que las he probado todas.Conclusión:
Además, el "/" no pudo encontrar la ruta al servicio, intentó comenzar con
Intent(package,className)
y nada, también otro tipo de Intent comenzandoMoví la clase de servicio en el mismo paquete de la actividad Forma final que funciona
Con suerte, esto ayuda a alguien al definir los listerners
onClick
dentro delonCreate
método de esta manera:public void onCreate() { //some code...... Button btnStartSrv = (Button)findViewById(R.id.btnStartService); Button btnStopSrv = (Button)findViewById(R.id.btnStopService); btnStartSrv.setOnClickListener(new OnClickListener() { public void onClick(View v) { startService(new Intent("RM_SRV_AIDL")); } }); btnStopSrv.setOnClickListener(new OnClickListener() { public void onClick(View v) { stopService(new Intent("RM_SRV_AIDL")); } }); } // end onCreate
También es muy importante para el archivo de manifiesto, asegúrese de que el servicio sea hijo de la aplicación:
<application ... > <activity ... > ... </activity> <service android:name="com.mainActivity.MyRemoteGPSService" android:label="GPSService" android:process=":remote"> <intent-filter> <action android:name="RM_SRV_AIDL" /> </intent-filter> </service> </application>
fuente