Obtener la referencia de actividad de un servicio

Necesito obtener una referencia a la actividad principal de un servicio.

Este es mi diseño:

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 } } 

¿Como lo puedo hacer?

[EDITAR]

Gracias a todos por las respuestas! Esta aplicación es un servidor web, que en este momento funciona sólo con subprocesos, y quiero usar un servicio en su lugar, para que funcione también en segundo plano. El problema es que tengo una clase que es responsable de obtener la página de los activos, y para hacer esta operación necesito usar este método:

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

En este momento mi proyecto tiene sólo una Actividad y no hay servicios, por lo que puedo pasar la referencia de la actividad principal directamente de sí mismo:

 WebServer ws= new DroidWebServer(8080,this); 

Por lo tanto, para que esta aplicación funcione con un servicio, ¿qué debo cambiar en mi diseño?

No explicaste por qué necesitas esto. Pero esto es definitivamente mal diseño. Guardar las referencias a la Actividad es lo primero que no debe hacer con las actividades. Bueno, puedes hacerlo, pero debes rastrear el ciclo de vida de la actividad y liberar la referencia después de onDestroy() su onDestroy() . Si no lo hace, obtendrá una pérdida de memoria (cuando cambie la configuración, por ejemplo). Y, bueno, después de onDestroy() se llama, la actividad se considera muerta y es más probable inútil de todos modos.

Así que no guarde la referencia en Service. Describa lo que necesita para lograr en su lugar. Estoy seguro de que hay mejores alternativas por ahí.


ACTUALIZAR

Ok, por lo que en realidad no necesita referencia a la actividad. En su lugar, necesita referencia a Contexto (que en su caso debe ser ApplicationContext para no mantener referencia a la actividad o cualquier otro componente para el caso).

Asumiendo que usted tiene una clase separada que maneja la solicitud de 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); } } 

Ahora puede crear y utilizar la instancia de WebService desde Service (que se recomienda para dichas tareas de fondo) o incluso de Activity (que es mucho más difícil de obtener cuando las llamadas de servicio web o las tareas de fondo largas están involucradas).

Un ejemplo 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; } } 

Para comunicarse entre su servicio y su actividad debe utilizar AIDL. Más información en este enlace:

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

El AIDL es excesivo a menos que la actividad y el servicio estén en apks separados.

Sólo utilice una carpeta para un servicio local. (Ejemplo completo aquí: http://developer.android.com/reference/android/app/Service.html )

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

De acuerdo con los comentarios de inazaruk. Pero, en términos de comunicación entre una actividad y un servicio, usted tiene algunas opciones – AIDL (como se mencionó anteriormente), Messenger, BroadcastReicever, etc El método de Messenger es similar a AIDL, pero no requiere que defina las interfaces. Usted puede comenzar aquí:

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

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.