2011-11-13 5 views
9

Realmente he intentado atravesar el intent.putExtra() y getIntent(). GetExtras() y aplicarlos a uno de los tutoriales de SimpleService. Sé que muchas personas ya han preguntado "¿por qué los extras del paquete siempre son nulos?" Prometo haber intentado hackear las respuestas que encontré aquí durante varias horas antes de considerar publicar, pero no creo que esté lo suficientemente avanzado como para entender realmente qué es lo que debo estar haciendo mal con los fragmentos menores que la gente está publicando. Como tal, puse el código completo de mi actividad y mi servicio.Android - Comenzando un servicio con información adicional a través de put/getExtra

Creo que mi problema es que mi intención inicial (la que creo en mi actividad) no existe en el contexto de mi servicio. Me pregunto si tal vez estoy usando intenciones en la dirección/propósito equivocado por completo. Probé un intent.putExtra en mi servicio, para tratar de enviar una cadena en la otra dirección, pero esos extras siempre son nulos, también. Entonces, a riesgo de repetir, ¿por qué los extras del paquete siempre son nulos? ¿Cómo puedo hacer un único intento que existe tanto en el contexto de mi actividad como de mi servicio?

Debería tener en cuenta que el código que se muestra a continuación obviamente tendrá unos extras nulos porque he comentado algunos de mis intentos de .getExtras() que han fallado. Eliminé el resto en aras de la limpieza.

EDITAR: La respuesta gracias a las respuestas, en código por el bien de aquellos que también han estado buscando en Google por horas. Poner esto en su servicio (tenga en cuenta que el START_REDELIVER_INTENT retorno puede ser malo):

@Override 
public int onStartCommand(Intent intent , int flags , int startId) 
{ 
     super.onStartCommand(intent, flags , startId); 

     extras = intent.getExtras(); 

      //just checking 
     if(extras != null) 
     Toast.makeText(this,extras.getString("extratoservice"), Toast.LENGTH_SHORT).show(); 

     return START_REDELIVER_INTENT; 

} 

Mi actividad (basado en el blog de Sai Gita):

package com.example.BroadcastIntent; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class BroadcastIntentActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button start = (Button)findViewById(R.id.buttonStart); 
    start.setOnClickListener(startListener); 

    Button stop = (Button)findViewById(R.id.buttonStop); 
    stop.setOnClickListener(stopListener); 

    //the intent I'm using to start and stop the service -- the extras don't go anywhere.... 
    intent = new Intent(BroadcastIntentActivity.this,BroadcastService.class);  
    intent.putExtra("extratoservice", "if you can read this, it made it to the service"); 

} 

Boolean serviceRunning; 
Intent intent; 

//Clicks from Geetha's Blog 
private OnClickListener startListener = new OnClickListener() { 
    public void onClick(View v){ 

     startService(intent); 
     serviceRunning = true; 
    }     
}; 

private OnClickListener stopListener = new OnClickListener() { 
    public void onClick(View v){ 

     try 
     { 
      stopService(intent); 
      serviceRunning = false;     
     } 
     catch(Exception e) 
     { 
      Toast.makeText(getApplicationContext(), "Service was not running...",Toast.LENGTH_SHORT).show(); 
     } 
    }     
}; 

} 

Y esta es mi servicio:

package com.example.BroadcastIntent; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.widget.Toast; 

public class BroadcastService extends Service{ 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 

    //extras = arg0.getExtras(); <-- this has null extras, too... 

    return null; 
} 

Bundle extras; 

@Override 
public void onCreate() { 
     super.onCreate(); 

     // extras = getIntent().getExtras(); <-- this is undefined? 

     if(extras == null) 
     Toast.makeText(this,"Service created... extras still null", Toast.LENGTH_SHORT).show(); 
     else 
     Toast.makeText(this,extras.getString("extratoservice"), Toast.LENGTH_SHORT).show(); 

} 

@Override 
public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Service destroyed ...", Toast.LENGTH_SHORT).show(); 

} 
} 
+0

¡Bienvenido a Stackoverflow! Si encuentra que una respuesta es útil, vote por favor. Si la respuesta responde satisfactoriamente a su pregunta, haga clic en la marca de verificación verde al lado para aceptar la respuesta. También mire http://stackoverflow.com/questions/how-to-ask para obtener consejos sobre cómo escribir una buena pregunta –

+0

Kurtis, me gusta su invitación de acciones. Me alegro de que alguien se tome el tiempo de informar a los recién llegados sobre cómo usar el servicio :) –

+0

@ Adam: No lo entiendo, lo siento: su código de servicio al final NO tiene 'onStartCommand()' ?? –

Respuesta

12

tiene que mirar la función onStartCommand() (no estoy en una computadora de escritorio, por lo que no puedo vincular convenientemente con el javadoc). Esto recibirá la intención que aprobó y sus extras deberían estar disponibles allí.

+0

Bien, ahora para descubrir cómo enviar un mensaje de vuelta. – Adam

+0

Gracias por la conexión de URL @ H9kDroid. En cuanto a la respuesta, tiene un par de opciones: o use un BroadcastReceiver o use onBind. – Femi

+0

Se ha dado cuenta que puedo hacer un hack posiblemente malo, ya que mi servicio se ejecuta en el mismo proceso (¿o sí?) Que mi aplicación, realmente puedo acceder/cambiar cualquier variable pública que me gustaría ... es ' Sería una mala idea para ejecutar un servicio como un servicio real, pero funciona para mis simples propósitos de tutorial. – Adam

1

Creo que hay que hacer esto en su servicio ..

@Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 

para conseguir el objetivo que está pasando en ... pero no estoy 100% en esto, así que vuelva a comprobar http://developer.android.com/reference/android/app/Service.html

+0

Funciona, gracias. Por cierto, parece que tengo que esperar a que onCommand() suceda después de onCreate(). Entonces puedo recibir los extras. – Adam

+0

eres bienvenido, me alegro de poder ayudarte. –

+0

De la documentación: Este es el viejo método onStart que se llamará en la plataforma pre-2.0. En 2.0 o posterior, reemplazamos onStartCommand() por lo que no se llamará a este método. –

Cuestiones relacionadas