Comment obtenir des données dans une Service
Android qui a été transmise par une Activity
appelante?
Premier contexte (peut être activité/service, etc.)
Pour Service, vous devez remplacer onStartCommand pour avoir un accès direct à intent
:
Override
public int onStartCommand(Intent intent, int flags, int startId) {
Vous avez quelques options:
1) Utilisez le Bundle du Intent :
Intent mIntent = new Intent(this, Example.class);
Bundle extras = mIntent.getExtras();
extras.putString(key, value);
2) Créer un nouvel ensemble
Intent mIntent = new Intent(this, Example.class);
Bundle mBundle = new Bundle();
mBundle.extras.putString(key, value);
mIntent.putExtras(mBundle);
3) Utilisez la méthode de raccourci putExtra () de l'intention
Intent mIntent = new Intent(this, Example.class);
mIntent.putExtra(key, value);
Nouveau contexte (peut être activité/service, etc.)
Intent myIntent = getIntent(); // this getter is just for example purpose, can differ
if (myIntent !=null && myIntent.getExtras()!=null)
String value = myIntent.getExtras().getString(key);
}
REMARQUE: Les bundles disposent des méthodes "get" et "put" pour tous les types primitifs, Parcelables et Serializables. Je viens d'utiliser Strings à des fins de démonstration.
Pour obtenir une réponse précise à cette question sur "Comment envoyer des données via l'intention d'une activité au service", vous devez remplacer la méthode onStartCommand()
qui est l'endroit où vous recevez l'objet d'intention:
Lorsque vous créez une variable Service
, vous devez redéfinir la méthode onStartCommand()
. Ainsi, si vous examinez attentivement la signature ci-dessous, vous recevez l'objet intent
qui lui est transmis:
public int onStartCommand(Intent intent, int flags, int startId)
Ainsi, à partir d'une activité, vous créerez l'objet d'intention pour démarrer le service, puis vous placerez vos données dans l'objet d'intention, par exemple, vous souhaitez passer une variable UserID
de Activity
à Service
:
Intent serviceIntent = new Intent(YourService.class.getName())
serviceIntent.putExtra("UserID", "123456");
context.startService(serviceIntent);
Lorsque le service est démarré, sa méthode onStartCommand()
sera appelée. Ainsi, vous pouvez extraire la valeur (UserID) de l'objet d'intention, par exemple.
public int onStartCommand (Intent intent, int flags, int startId) {
String userID = intent.getStringExtra("UserID");
return START_STICKY;
}
Remarque: la réponse ci-dessus spécifie l'obtention d'une méthode Intent with getIntent()
qui n'est pas correcte dans le contexte d'un service.
Si vous liez votre service, vous obtiendrez le supplément dans onBind(Intent intent)
.
Activité:
Intent intent = new Intent(this, LocationService.class);
intent.putExtra("tour_name", mTourName);
bindService(intent, mServiceConnection, BIND_AUTO_CREATE);
Un service:
@Override
public IBinder onBind(Intent intent) {
mTourName = intent.getStringExtra("tour_name");
return mBinder;
}
Une autre possibilité consiste à utiliser intent.getAction:
En service:
public class SampleService inherits Service{
static final String ACTION_START = "com.yourcompany.yourapp.SampleService.ACTION_START";
static final String ACTION_DO_SOMETHING_1 = "com.yourcompany.yourapp.SampleService.DO_SOMETHING_1";
static final String ACTION_DO_SOMETHING_2 = "com.yourcompany.yourapp.SampleService.DO_SOMETHING_2";
static final String ACTION_STOP_SERVICE = "com.yourcompany.yourapp.SampleService.STOP_SERVICE";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String action = intent.getAction();
//System.out.println("ACTION: "+action);
switch (action){
case ACTION_START:
startingService(intent.getIntExtra("valueStart",0));
break;
case ACTION_DO_SOMETHING_1:
int value1,value2;
value1=intent.getIntExtra("value1",0);
value2=intent.getIntExtra("value2",0);
doSomething1(value1,value2);
break;
case ACTION_DO_SOMETHING_2:
value1=intent.getIntExtra("value1",0);
value2=intent.getIntExtra("value2",0);
doSomething2(value1,value2);
break;
case ACTION_STOP_SERVICE:
stopService();
break;
}
return START_STICKY;
}
public void startingService(int value){
//calling when start
}
public void doSomething1(int value1, int value2){
//...
}
public void doSomething2(int value1, int value2){
//...
}
public void stopService(){
//...destroy/release objects
stopself();
}
}
En activité:
public void startService(int value){
Intent myIntent = new Intent(SampleService.ACTION_START);
myIntent.putExtra("valueStart",value);
startService(myIntent);
}
public void serviceDoSomething1(int value1, int value2){
Intent myIntent = new Intent(SampleService.ACTION_DO_SOMETHING_1);
myIntent.putExtra("value1",value1);
myIntent.putExtra("value2",value2);
startService(myIntent);
}
public void serviceDoSomething2(int value1, int value2){
Intent myIntent = new Intent(SampleService.ACTION_DO_SOMETHING_2);
myIntent.putExtra("value1",value1);
myIntent.putExtra("value2",value2);
startService(myIntent);
}
public void endService(){
Intent myIntent = new Intent(SampleService.STOP_SERVICE);
startService(myIntent);
}
Enfin, dans le fichier manifeste:
<service Android:name=".SampleService">
<intent-filter>
<action Android:name="com.yourcompany.yourapp.SampleService.ACTION_START"/>
<action Android:name="com.yourcompany.yourapp.SampleService.DO_SOMETHING_1"/>
<action Android:name="com.yourcompany.yourapp.SampleService.DO_SOMETHING_2"/>
<action Android:name="com.yourcompany.yourapp.SampleService.STOP_SERVICE"/>
</intent-filter>
</service>
Activité:
int number = 5;
Intent i = new Intent(this, MyService.class);
i.putExtra("MyNumber", number);
startService(i);
Un service:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null && intent.getExtras() != null){
int number = intent.getIntExtra("MyNumber", 0);
}
}
Service: le service de démarrage peut avoir des effets secondaires et constitue le meilleur moyen d'utiliser Messenger et de transmettre des données.
private CallBackHandler mServiceHandler= new CallBackHandler(this);
private Messenger mServiceMessenger=null;
//flag with which the activity sends the data to service
private static final int DO_SOMETHING=1;
private static class CallBackHandler extends Android.os.Handler {
private final WeakReference<Service> mService;
public CallBackHandler(Service service) {
mService= new WeakReference<Service>(service);
}
public void handleMessage(Message msg) {
//Log.d("CallBackHandler","Msg::"+msg);
if(DO_SOMETHING==msg.arg1)
mSoftKeyService.get().dosomthing()
}
}
Activité: Récupérer Messenger de l’intention le remplir, transmettre les données et renvoyer le message au service.
private Messenger mServiceMessenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
mServiceMessenger = (Messenger)extras.getParcelable("myHandler");
}
private void sendDatatoService(String data){
Intent serviceIntent= new
Intent(BaseActivity.this,Service.class);
Message msg = Message.obtain();
msg.obj =data;
msg.arg1=Service.DO_SOMETHING;
mServiceMessenger.send(msg);
}
Voici comment je passe des données de Activity
à IntentService
.
Un de mes application a ce scénario.
1) Envoi de données (code d'activité)
Intent intent = new Intent(MusicActivity.class, DownloadSongService.class);
String songUrl = "something";
intent.putExtra(YOUR_KEY_SONG_NAME, songUrl);
startService(intent);
2) Obtenir les données dans Service (code IntentService)
Vous pouvez accéder à l’intention dans la méthode onHandleIntent()
public class DownloadSongService extends IntentService {
@Override
protected void onHandleIntent(@Nullable Intent intent) {
String songUrl = intent.getStringExtra("YOUR_KEY_SONG_NAME");
// Download File logic
}
}