2011-11-13 8 views
9

Ho davvero cercato di passare attraverso intent.putExtra() e getIntent(). GetExtras() e applicarli a una delle esercitazioni di SimpleService. So che molte persone hanno già chiesto "perché gli extra del bundle sono sempre nulli?" Prometto che ho cercato di carpire le risposte che ho trovato qui per diverse ore prima di prendere in considerazione l'idea di postare, ma non credo di essere abbastanza avanzato da capire davvero cosa devo fare storto con i frammenti secondari che le persone pubblicano. Come tale ho inserito il codice completo della mia attività e del mio servizio.Android - Avvio di un servizio con informazioni aggiuntive tramite put/getExtra

Penso che il mio problema sia che il mio intento iniziale (quello che creo nella mia attività) non esiste nel contesto del mio servizio. Mi chiedo se forse sto usando Intents nella direzione/scopo sbagliati del tutto? Ho provato un intent.putExtra nel mio servizio, per provare a inviare una stringa nell'altra direzione, ma anche quegli extra sono sempre nulli. Quindi, a rischio di ripetizione, perché gli extra del bundle sono sempre nulli? Come faccio a fare un singolo intento che esiste sia nel contesto della mia attività sia nel mio servizio?

Devo notare che il codice come mostrato di seguito ovviamente avrà un extra nullo perché ho commentato alcuni dei miei tentativi di .getExtras() che hanno fallito. Ho cancellato il resto per motivi di pulizia.

MODIFICA: La risposta grazie alle risposte, in codice per il bene di coloro che sono stati anche su Google per ore. Mettere questo nel vostro servizio (si prega di notare che lo START_REDELIVER_INTENT ritorno può essere sbagliato):

@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; 

} 

mia attività (sulla base di blog di 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(); 
     } 
    }     
}; 

} 

E questo è il mio servizio:

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

Benvenuti in Stackoverflow! Se trovi che una risposta è utile, ti preghiamo di votarla. Se la risposta risponde correttamente alla tua domanda, fai clic sul segno di spunta verde accanto ad essa per accettare la risposta. Per favore guarda http://stackoverflow.com/questions/how-to-ask per un consiglio su come scrivere una buona domanda –

+0

Kurtis, mi piace il tuo invito stock! Sono contento che qualcuno stia prendendo il tempo per informare i nuovi arrivati ​​su come usare il servizio :) –

+0

@Adam: Non capisco, scusa: il tuo codice di servizio alla fine NON ha il 'onStartCommand()' ?? –

risposta

12

è necessario guardare la funzione onStartCommand() (non sono su un desktop quindi non posso collegarmi comodamente a javadoc). Questo riceverà l'intento che hai passato e i tuoi extra dovrebbero essere disponibili lì.

+0

Bello - ora per capire come inviare un messaggio. – Adam

+0

Grazie per l'hookup @ H9kDroid. Per quanto riguarda la risposta, hai un paio di opzioni: utilizzare BroadcastReceiver o utilizzare onBind. – Femi

+0

Una possibile cattiva modifica Ho capito che posso fare - dal momento che il mio servizio è in esecuzione nello stesso processo (credo?) Come mia applicazione, posso effettivamente accedere/modificare qualsiasi variabile pubblica che vorrei ... d essere una cattiva idea per l'esecuzione di un servizio come un vero servizio - ma funziona per i miei scopi semplici tutorial. – Adam

1

Credo che hai bisogno di fare questo nel vostro servizio ..

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

per ottenere l'intento che stai passando ... ma io non sono al 100% su questo, quindi doppio controllo http://developer.android.com/reference/android/app/Service.html

+0

Funziona, grazie. Per inciso, sembra che devo effettivamente attendere che onCommand() accada dopo onCreate(). Quindi sono in grado di ricevere gli extra. – Adam

+0

sei il benvenuto, felice di poterti aiutare. –

+0

Dalla documentazione: Questo è il vecchio metodo onStart che verrà chiamato sulla piattaforma pre-2.0. Su 2.0 o successivo, sovrascriviamo onStartCommand(), quindi questo metodo non verrà chiamato. –