2010-08-09 31 views
78

Tengo una clase de servicio. He exportado esta clase a jar y he incrustado el jar en mi aplicación cliente.No se puede iniciar Service Intent

Cuando sea necesario, llamo a la clase de servicio. Cuando trato de hacer esto, me sale el siguiente error:

Unable to start service Intent {comp={com.sample.service/com.sample.service.serviceClass}} : not found 

tengo otra clase aparte de la clase de servicio, que soy capaz de acceso (crear el objeto de esa clase) que están dentro de la misma jarra.

Siento que he perdido algo en mi configuración o manifiesto más o menos.

Por favor, ayúdame a identificar el mismo. Mi código es el siguiente:

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 
} 

Manifest.xml cliente

<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

+0

Traté de corregir su código, pero en la fuente hay problemas que siento que no entiendo lo suficiente como para intentarlo. Básicamente tiene un espacio adicional en , debería ser , pero si mira la fuente, tiene un '/' antes de las dos declaraciones de importación y no estoy seguro si se supone que están allí . Creo que los espacios después de '<' serán la causa de tu problema. –

+0

Gracias james por la respuesta. Esos espacios se dan intencionalmente solo para mostrarse en el sitio. Dentro del código, no hay espacios dentro de las etiquetas. Incluso el "\" es solo para la visualización correcta en el sitio. Básicamente, no recibo ningún error de compilación en Eclipse. Solo en el tiempo de ejecución, recibo el mensaje en LogCat – Vinay

Respuesta

48

En primer lugar, no es necesario android:process=":remote" lo tanto, elimine, ya que todo lo que se lo que hará es tomar RAM extra sin ningún beneficio.

En segundo lugar, dado que el elemento <service> contiene una cadena de acción, lo utilizan:

public void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState); 
     Intent intent=new Intent("com.sample.service.serviceClass"); 
     this.startService(intent); 
} 
+0

Estimado Sr. Mark: He agregado 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. He modificado según su sugerencia y funciona bien ahora. Gracias una vez más. – Vinay

+2

@Vinay: "Necesito acceder al mismo contenido desde las diferentes aplicaciones." Todavía no necesita 'android: process =": ​​remote "', así que elimínelo, ya que lo único que hará es tomar RAM adicional para sin beneficio. Un servicio remoto es aquel que ofrece una API a través de AIDL y no tiene nada que ver con el atributo 'android: process'. Aquí hay un servicio remoto de muestra: http: // github.com/commonsguy/cw-advandroid/tree/master/AdvServices/RemoteService/y aquí hay un cliente correspondiente de ese servicio: http://github.com/commonsguy/cw-advandroid/tree/master/AdvServices/RemoteClient/ – CommonsWare

+0

Gracias para la entrada, Sr. Mark. Seguramente lo haré ... – Vinay

70

Para cualquier otra persona que viene a través de este hilo que tenían este problema y estaba tomando el pelo. Tenía la declaración de servicio FUERA de la '< aplicación>' end tag DUH!

DERECHA:

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

mal, pero todavía 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="..." /> 

+7

¡esto suena como un trabajo para una pelusa Android mejorada que recoge estos errores simples! Que podemos obtener eventualmente –

+1

¡Había escrito incorrectamente el nombre del servicio en xml! Esto me dio una pista de dónde estaba el problema. Gracias – Arvand

+0

Gracias por publicar su respuesta. Esto finalmente resolvió que el servicio no comenzaba. – pmont

31

1) cheque si la declaración de servicio en el manifiesto se anida en la etiqueta de aplicación

<application> 
    <service android:name="" /> 
</application> 

2) comprobar si su service.java está en el mismo paquete paquete o diff como 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> 
+1

con el punto o no? en mi caso: no, en su lugar uso y funciona. see http://stackoverflow.com/questions/2265020/why-doesnt-my-service-work-in-android -i-solo-quiere-registrar-algo-siempre-5-seco – DiveInto

+0

con el punto, debería funcionar también porque en la parte superior se define la ruta de su paquete – Jianhong

+3

Amigo, muchas gracias por su respuesta. He estado luchando con un pequeño problema y resulta que mi servicio estaba en un paquete diferente. ¡Si pudiera abrazarte lo haría! – racl101

4

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 clase de servicio no pudo ser encontrada por la actividad.

Al observar el logcat en el registro, noté la advertencia sobre el problema: la actividad no podía encontrar la clase de servicio, pero lo curioso era que el paquete era incorrecto, contenía un carácter "/".El compilador buscaba

com.something./service.MyService

en lugar de

com.something.service.MyService

moví la clase de servicio fuera de la caja y de nuevo y todo funcionaba bien.

+0

Primero pensé que/era un error, pero pero si sigues mirando las entradas de Logcat lo verás muchas veces y todas esas aplicaciones están funcionando perfectamente. – Axxiss

+1

bueno, no puedo negar tu experiencia pero la mía fue un poco diferente y al mudarme dentro y fuera de la clase del paquete, eclipse arregló su propio error;) y no obtuve excepción de tiempo de ejecución. – sataniccrow

+2

Tengo que decir que funcionó para mí también. Extraño problema, me tomó media hora encontrar nuestro comentario. ¡Gracias! –

0

He encontrado el mismo problema. Perdí casi un día tratando de iniciar un servicio del método OnClickListener - fuera del onCreate y después de 1 día, ¡aún así fallé! ¡Muy frustrante! Estaba viendo el ejemplo de muestra RemoteServiceController. ¡El suyo funciona, pero mi implementación no funciona!

La única forma que me funcionaba, era desde el interior del método onCreate. Ninguna de las otras variantes funcionó y créanme que las he probado todas.

Conclusión:

  • Si usted pone su clase de servicio en el paquete diferente que el mainActivity, voy a conseguir todo tipo de errores
  • también el "/" No se pudo encontrar el camino hacia servicio, tratado a partir de Intent(package,className) y nada, también otro tipo de intención de iniciar

  • moví la clase de servicio en el mismo paquete de la actividad forma final que funciona

  • Esperamos que esto ayude a alguien mediante la definición de los listerners onClick dentro del método onCreate así:

    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 muy importante para el archivo de manifiesto, asegúrese de que el servicio es hijo de 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> 
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.

Cuestiones relacionadas