Android - Démarrage d'un service avec des informations supplémentaires par le biais de vente/getExtra
J'ai vraiment essayé d'obtenir par le biais de l'intention.putExtra() et getIntent().getExtras() et de les appliquer à l'un des SimpleService tutoriels. Je sais que beaucoup de gens ont déjà demandé "pourquoi est-ce bundle extras toujours null?" Je vous promets que j'ai essayé de pirater à travers les réponses que j'ai trouvé ici pendant plusieurs heures avant que je considéré comme annonce, mais je ne pense pas que je suis assez avancé pour vraiment comprendre ce que c'est que je doit faire mal avec le mineur extraits de gens sont à poster. En tant que tel, j'ai mis dans le code complet de mon activité et de mon service.
Je pense que mon problème est que mon intention de départ (celui que j'ai créer dans mon activité) n'existe pas dans le cadre de mon service. Je me demande si je vais peut-être l'aide d'Intentions dans le mauvais sens et le but de tout? Je l'ai fait essayer à une intention.putExtra dans mon service, pour essayer d'envoyer une chaîne de caractères dans une autre direction, mais ces extras sont toujours nulles, trop. Donc, au risque de la répétition, pourquoi est-bundle extras toujours null? Comment puis-je faire une seule intention qui existe à la fois dans le cadre de mon activité et de mon service?
Je note que le code affiché ci-dessous devront évidemment null extras parce que j'ai commenté quelques-uns de mes tentatives .getExtras() qui ont échoué. J'ai supprimé le reste pour le bien de propreté.
EDIT: La réponse merci pour les réponses, dans le code, pour le bien de ceux qui ont aussi cherché sur Google pendant des heures. Mettez ceci dans votre service (veuillez noter que le retour START_REDELIVER_INTENT trompe peut-être):
@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;
}
Mon activité (basé sur Sai Geetha blog):
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();
}
}
};
}
Et c'est mon service:
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();
}
}
Kurtis, j'aime votre stock invitation! Je suis content que quelqu'un est prendre le temps d'informer les nouveaux arrivants de la façon d'utiliser le service 🙂
Je ne comprends pas, désolé: le code de votre service à la fin n'a PAS le
onStartCommand()
??
OriginalL'auteur Adam | 2011-11-13
Vous devez vous connecter pour publier un commentaire.
vous avez besoin de regarder le onStartCommand() fonction (je ne suis pas au bureau donc je ne peux pas idéalement lien vers la javadoc). Cela permettra de recevoir de l'intention que vous avez passé et vos extras doivent être disponibles.
Merci pour l'URL de connexion @H9kDroid. Aussi loin que de répondre, vous avez deux options: soit utiliser un BroadcastReceiver ou de l'utilisation onBind.
Éventuellement d'un mauvais hack, je ai réalisé que je peux faire depuis mon service s'exécutant dans le même processus (je crois?) comme ma demande, je peux effectivement accès ou modifier les variables publiques que j'aimerais... ce serait une mauvaise idée pour l'exécution d'un service comme un service réel, mais il fonctionne pour mon tutoriel fins.
OriginalL'auteur Femi
Je pense que vous devez le faire à votre service..
pour obtenir de l'intention que vous êtes en passant... mais je ne suis pas à 100% sur ce, alors vérifiez
http://developer.android.com/reference/android/app/Service.html
vous êtes la plupart de bienvenue, content d'avoir pu aider.
À partir de la documentation: C'est la vieille méthode onStart qui sera appelée lors de la pré-2.0 plate-forme. Sur la 2.0 ou version ultérieure nous remplacer onStartCommand() cette méthode ne sera pas appelé.
OriginalL'auteur Genia S.