Voglio semplicemente chiamare i metodi di un servizio locale dalla mia attività. Come lo posso fare ?Come chiamare i metodi di un servizio dall'attività?
risposta
Un modo per fare ciò è definire un'interfaccia con Android's AIDL e utilizzare il sottosistema Binder
per eseguire IPC. C'è una grande serie di istruzioni al link che ho postato. Inizierei lì e quindi inserirò qui se hai domande. Nonostante sia un argomento molto complesso (IPC) Android e lo Binder
fanno davvero un buon lavoro nel renderlo abbastanza semplice (almeno per iniziare, sono sicuro che potresti renderlo complicato se lo volessi ;-))
Modifica Come indicato nei commenti, questo non è necessario se lo Service
e il client sono in esecuzione nello stesso processo. Se non diversamente specificato, questo è il valore predefinito. Tuttavia, funziona ancora a prescindere, aggiunge solo un po 'più di complessità.
Non so dove sia il tuo problema, per favore inserisci del codice. Utilizzando un Raccoglitore, l'Attività può avere accesso all'oggetto servizio. Vedi gli esempi nell'API per creare una connessione tra attività e servizio.
Avere l'oggetto servizio nella propria attività, è sufficiente chiamare:
mService.yourMethod();
Potremmo aiutarti molto meglio se descrivesti esattamente il tuo problema e, come ho detto, pubblica alcuni frammenti.
Perché non metti alcuni link a risorse utili? Pubblica alcuni frammenti di scheletro su come associare un servizio e chiamare successivamente il suo metodo? :) – Juri
@Juri http://stackoverflow.com/questions/1916253/bind-service-to-activity-in-android dal nulla è stato collegato – CrandellWS
C'è codice di esempio per questo diritto nella documentazione del Servizio, sotto "Sample servizio locale":
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
anche per quelle persone che suggeriscono AIDL - se il servizio e cliente sono tutti parte del vostro possedere .apk ed essere in esecuzione nello stesso processo (il comportamento predefinito), non c'è bisogno di aiuto; è solo una complessità aggiuntiva che non ti dà nulla.
Ecco un esempio che potrebbe aiutare
Server.java:
package com.example.bindservice.binder;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class Server extends Service {
IBinder mBinder = new LocalBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class LocalBinder extends Binder {
public Server getServerInstance() {
return Server.this;
}
}
public String getTime() {
SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return mDateFormat.format(new Date());
}
}
Client.java
package com.example.bindservice.binder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.bindservice.binder.Server.LocalBinder;
public class Client extends Activity {
boolean mBounded;
Server mServer;
TextView text;
Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView)findViewById(R.id.text);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
text.setText(mServer.getTime());
}
});
}
@Override
protected void onStart() {
super.onStart();
Intent mIntent = new Intent(this, Server.class);
bindService(mIntent, mConnection, BIND_AUTO_CREATE);
};
ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(Client.this, "Service is disconnected", 1000).show();
mBounded = false;
mServer = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Toast.makeText(Client.this, "Service is connected", 1000).show();
mBounded = true;
LocalBinder mLocalBinder = (LocalBinder)service;
mServer = mLocalBinder.getServerInstance();
}
};
@Override
protected void onStop() {
super.onStop();
if(mBounded) {
unbindService(mConnection);
mBounded = false;
}
};
}
risposta eccellente ... – Opiatefuchs
se il servizio è forzato, ricevo la chiamata a onServiceDisconnected? –
perché è così dannatamente difficile chiamare una fuction semplice –
- 1. Come posso chiamare i metodi del servizio web da javascript?
- 2. Come chiamare un metodo di servizio Web?
- 3. Come chiamare i metodi factory da HTML in angularjs? metodi
- 4. Chiamare i metodi di attività da Frammento
- 5. Un genitore può chiamare i metodi di classe figlio?
- 6. Chiamare i metodi di frontend dall'applicazione esterna di meteorologia
- 7. Come chiamare dinamicamente i metodi di accesso in Ruby
- 8. Utilizzo degli attributi per chiamare i metodi
- 9. Chiamare i metodi C# BHO da Javascript
- 10. Chiamare i metodi dentro if() - C#
- 11. Chiamare i metodi basati su attività da ASMX
- 12. Chiamare setVolumeControlStream da un servizio
- 13. Come chiamare un servizio Web da jQuery
- 14. Come chiamare un servizio Windows da asp.net
- 15. Chiamare i metodi @Transactional da un altro thread (Runnable)
- 16. Spring 3: Come chiamare i metodi annotati @Async dal TaskExecutor
- 17. Principi SOA - un servizio dovrebbe chiamare un altro servizio?
- 18. Come chiamare i metodi sovrascritto in tutte le classi derivate
- 19. Utilizzo di JRuby per chiamare direttamente i metodi Java Android
- 20. Come chiamare un servizio Web SOAP da un modulo Wordpress?
- 21. Chiamare i metodi di classe tramite nome classe vs self
- 22. Come utilizzare map() per chiamare i metodi di classe su un elenco di oggetti
- 23. Un repository dovrebbe chiamare un altro repository? O un repository dovrebbe chiamare un livello di servizio?
- 24. Chiamare un servizio RESTful con * molti * parametri
- 25. Chiamare un servizio Web all'interno di SQL Server
- 26. Chiamare magicamente metodi in Java
- 27. Chiamare un servizio all'avvio in un'applicazione Play
- 28. I metodi di overloading non sono supportati dal servizio WCF?
- 29. WCF. Servizio metodi generici
- 30. Come chiamare metodi .NET da Excel VBA
il tuo link non funziona ... –
@RajaReddyPolamReddy grazie! L'ho riparato. –
AIDL è necessario solo se il servizio e l'attività si trovano in diverse applicazioni. Se il servizio e l'attività sono locali per l'applicazione (che è il caso comune), vedere la risposta di @hackbod – odedfos