get il riferimento di attività da un servizio

Ho bisogno di un riferimento all'attività principale di un servizio.

Questo è il mio design:

  • legame di dati Android con una visualizzazione personalizzata
  • Conserva l'image selezionata in GridView
  • ProgressBar circolare personalizzato con image nel centro
  • Parse HTML in Android
  • Fai exception l'evento dall'evento ricorrente originale?
  • Doze e servizio in primo piano
  • MainActivity.java

    public class MainActivity extendsActivity{ private Intent myIntent; onCreate(){ myIntent=new Intent(MainActivity.this, MyService.class); btnStart.setOnClickListener(new OnClickListener(){ public void onClick(View V){ startService(myIntent); }); }} 

    MyService.java

     class MyService extends Service{ public IBinder onBind(Intent intent) { return null; } onCreate(){ //Here I need to have a MainActivity reference //to pass it to another object } } 

    Come posso fare?

    [EDIT]

    Grazie a tutti per le risposte! Questa applicazione è un server web, che in questo momento funziona solo con i thread e voglio utilizzare un servizio invece di farlo funzionare anche in background. Il problema è che ho una class che è responsabile per get la pagina dagli asset e per eseguire questa operazione ho bisogno di utilizzare questo metodo:

     InputStream iS =myActivity.getAssets().open("www/"+filename); 

    In questo momento il mio progetto ha solo un'attività e nessun servizio, quindi posso passare direttamente il riferimento dell'attività principale da se stessa:

     WebServer ws= new DroidWebServer(8080,this); 

    Quindi, per fare funzionare questa applicazione con un servizio, cosa devo cambiare nel mio disegno?

  • Perché non è chiamato AccountAuthenticator # getAuthToken ()?
  • Utilizzo di API di riconoscimento vocale Android da Google Glass
  • Intenti di evento del calendario - startActivityForResult
  • Imansible installare il mio apk generato
  • Come faccio a creare una linea tratteggiata / tratteggiata in Android?
  • Android - Come decidere se eseguire un servizio in un process separato?
  • 4 Solutions collect form web for “get il riferimento di attività da un servizio”

    Non hai spiegato perché hai bisogno di questo. Ma questo è sicuramente un design difettoso . Memorizzare i riferimenti a Attività è la prima cosa che non dovresti fare con le attività. Beh, puoi, ma devi seguire il ciclo di vita delle attività e rilasciare il riferimento dopo che è chiamato onDestroy() . Se non lo fai, riceverai una perdita di memory (ad esempio, quando cambia la configuration). E, beh, dopo che è chiamato onDestroy() , l'attività è considerata morta e comunque è inutile.

    Quindi non basta memorizzare il riferimento in Servizio. Descrivete invece cosa serve. Sono sicuro che ci siano migliori alternative là fuori.


    AGGIORNARE

    Ok, quindi non hai bisogno di riferimento per l'attività. Invece, devi fare riferimento a Context (che nel tuo caso dovrebbe essere ApplicationContext per non mantenere il riferimento all'attività o ad un altro componente per quella materia).

    Supponendo che si disponga di una class separata che gestisce la richiesta WebService:

     class WebService { private final Context mContext; public WebService(Context ctx) { //The only context that is safe to keep without tracking its lifetime //is application context. Activity context and Service context can expire //and we do not want to keep reference to them and prevent //GC from recycling the memory. mContext = ctx.getApplicationContext(); } public void someFunc(String filename) throws IOException { InputStream iS = mContext.getAssets().open("www/"+filename); } } 

    Ora è ansible creare e utilizzare l'istanza di WebService da Service (che è consigliata per tali attività di background) o anche da Activity (cosa che è molto più complicata per arrivare quando chiamate di servizi web o lunghe attività di background).

    Un esempio con Service :

     class MyService extends Service { WebService mWs; @Override public void onCreate() { super.onCreate(); mWs = new WebService(this); //you now can call mWs.someFunc() in separate thread to load data from assets. } @Override public IBinder onBind(Intent intent) { return null; } } 

    Per comunicare tra il tuo servizio e l'attività devi utilizzare AIDL. Maggiori informazioni su questo link:

    EDIT: (Ringraziamenti Renan Malke Stigliani) http://developer.android.com/guide/components/aidl.html

    L'AIDL è overkill a less che l'attività e il servizio non siano in apache separate.

    Basta usare un legante per un servizio locale. (esempio completo qui: http://developer.android.com/reference/android/app/Service.html )

     public class LocalBinder extends Binder { LocalService getService() { return LocalService.this; } } 

    Concordo con i commenti di inazaruk. Ma, in termini di comunicazione tra un'attività e un servizio, hai poche scelte – AIDL (come sopra indicato), Messenger, BroadcastReicever ecc. Il metodo Messenger è simile a AIDL ma non richiede di definire le interfacce. Puoi partire qui:

    http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerService.html

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.