No se puede iniciar la intención de servicio

81

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

Vinay
fuente
Traté de arreglar su código, pero en la fuente hay problemas que sentí que no entendía lo suficiente como para intentarlo. Básicamente, tiene un espacio adicional en <servicio ...>, debería ser <servicio ...>, pero si observa la fuente, tiene un '/' antes de las dos declaraciones de importación y no estoy seguro de si se supone que deben estar allí. Creo que los espacios después de '<' serán la causa de su problema.
James Black
Gracias james por la respuesta. Esos espacios se dan intencionalmente solo para mostrarlos en el sitio. Dentro del código, no hay espacios dentro de las etiquetas. Incluso el "\" es solo para una visualización correcta en el sitio. Básicamente, no obtengo ningún error de compilación en eclipse. Solo en tiempo de ejecución, recibo el mensaje en LogCat
Vinay

Respuestas:

48

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);
}
CommonsWare
fuente
Estimado Sr. Mark, agregué el control remoto porque necesito acceder al mismo contenido desde las diferentes aplicaciones. Incluyo esto después de leer en la web que es mejor implementar un servicio remoto. Modifiqué según su sugerencia y ahora funciona bien. Gracias una vez más.
Vinay
2
@Vinay: "Necesito acceder al mismo contenido desde las diferentes aplicaciones". Aún no es necesario 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 el android:processatributo. 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/ …
CommonsWare
72

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="..." />

Blundell
fuente
7
¡Esto suena como un trabajo para un Android Lint mejorado que detecta estos simples errores! Lo que podríamos conseguir eventualmente.
Ehtesh Choudhury
1
¡Había escrito mal el nombre del servicio en xml! Esto me dio una pista de dónde estaba el problema. gracias
Arvand
Gracias por publicar tu respuesta. Esto finalmente resolvió que el servicio no se iniciaba.
pmont
¡GUAUU! Muchas gracias. ¿Por qué no funciona en la etiqueta <application>?
Ruchir Baronia
El IDE no se queja de la etiqueta <service> mal escrita. También cometimos un error.
Yeung
32

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.javaestá 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>
Jianhong
fuente
1
con el punto o no? en mi caso: no, en su lugar uso <service android: name = "service" /> y funciona. consulte stackoverflow.com/questions/2265020/…
DiveInto
con el punto, también debería funcionar porque en la parte superior define la ruta de su paquete
Jianhong
3
Amigo, muchas gracias por tu respuesta. He estado luchando con un maldito problema y resulta que mi servicio estaba en un paquete diferente. ¡Si pudiera abrazarte, lo haría!
racl101
1
El segundo punto ayudó. Muchas gracias hermano, intenté descifrarlo durante 1 día completo :(. Aunque tonto
Archie.bpgc
5

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

com.something./service.MyService

en vez de

com.something.service.MyService

Saqué la clase de servicio del paquete y volví a entrar y todo funcionó bien.

sataniccrow
fuente
Primero pensé que / era un error, pero si sigues mirando las entradas de logcat, lo verás muchas veces y todas esas aplicaciones funcionan perfectamente.
Axxiss
1
bueno, no puedo negar su experiencia, pero la mía fue un poco diferente y al entrar y salir de la clase del paquete, eclipse solucionó su propio error;) y no obtuve ninguna excepción de tiempo de ejecución.
sataniccrow
2
Debo decir que a mí también me funcionó. Extraño problema, tardé media hora en encontrar nuestro comentario. ¡Gracias!
Alex RR
Creo que tengo el mismo problema, pero no pude conseguir que fija moviendo el archivo de clase ...
SEB
Este era mi problema particular. Es muy difícil de entender, pero la / en el nombre del servicio era una pista. Si su servicio deja de funcionar repentinamente o no funciona en una caja nueva, esta podría ser la causa (y la solución).
Hayes Haugen
0

En mi caso, el límite máximo de 1 MB para el transporte de datos por intención. Solo usaré Caché o Almacenamiento.

rancho
fuente
0

Encontré el mismo problema. Perdí casi un día tratando de iniciar un servicio desde el OnClickListenermétodo: fuera del onCreatey después de 1 día, ¡todavía fallé! ¡Muy frustrante! Estaba mirando el ejemplo de muestra RemoteServiceController. 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:

  • Si pones tu clase de servicio en un paquete diferente al de mainActivity, obtendré todo tipo de errores
  • Además, el "/" no pudo encontrar la ruta al servicio, intentó comenzar con Intent(package,className)y nada, también otro tipo de Intent comenzando

  • Moví 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 onClickdentro del onCreatemé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>
marisxanis
fuente