2012-09-20 32 views
5

Así que tienen una actividad en una aplicación que se inicia un servicio:Cómo pasar un contexto de actividad en una aplicación a un servicio en una otra aplicación

private void startService() { 
    if (started) { 
     Toast.makeText(Main.this, "Service already started", 
       Toast.LENGTH_SHORT).show(); 
    } else { 
     Intent i = new Intent(); 
     i.setClassName("com.enorbitas.daemon.service", 
       "com.enorbitas.daemon.service.DaemonService"); 
     startService(i); 
     started = true; 
     updateServiceStatus(); 
     Log.d(getClass().getSimpleName(), "startService()"); 
    } 

} 

La actividad se puso en marcha por la siguiente intención:

<intent-filter> 
      <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
     </intent-filter> 

El servicio realiza el registro y se conecta con este dispositivo usb personalizado. Para hacer eso, necesita el contexto de actividad:

 mUsbManager = (UsbManager) parent.getSystemService(Context.USB_SERVICE); 
     HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); 
     Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
     while(deviceIterator.hasNext()){ 
      UsbDevice device = deviceIterator.next(); 
     } 

     Intent intent = parent.getIntent(); 
     String action = intent.getAction(); 
     UsbDevice device = (UsbDevice) intent 
       .getParcelableExtra(UsbManager.EXTRA_DEVICE); 
     if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { 
      setDevice(device); 
      Log.i(TAG, "usb conectado"); 
     } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { 
      if (mDevice != null && mDevice.equals(device)) { 
       setDevice(null); 
       Log.i(TAG, "usb NO conectado"); 
      } 
     } 

principal sería la actividad que inicia el servicio. Este enfoque solía funcionar porque ese código solía estar en la misma aplicación, pero ahora quiero que sea un servicio para que otras aplicaciones puedan conectarse a él.

¿Hay alguna manera de pasar el contexto de la actividad al servicio? Leí mucho sobre intents y bundles, parcelable y serialización, pero nada de eso me funciona. Necesito pasar el contexto.

¿Alguna idea?

Respuesta

8

Cada Service tiene su propio contexto, solo use eso. No necesita pasar un Servicio al Contexto de una Actividad.

No veo por qué necesita un Contexto de actividad específico para llamar al getSystemService() y un Servicio recibirá Intenciones de un BroadcastReceiver tan fácilmente como cualquier Actividad.

Además, si la actividad de origen se destruye si bien este servicio se está ejecutando, el contexto será inválida o la actividad se filtró ...

+0

Sí, lo sé. Pero el problema es que cuando obtengo la intención del padre para obtener el .getParcelableExtra y solicito el dispositivo, devuelve nulo. Para mí eso sucede porque el intento de capturar el archivo adjunto USB es el de la actividad, no el servicio. Creo que eso es lo que está pasando. ¿Entiendes lo que quiero decir? – matiaslezin

+0

Pero su BroadcastReceiver puede pasar esta información al Servicio directamente, no necesita ser almacenada en una Actividad. – Sam

+0

Porque probé con el contexto del servicio y siempre obtengo un puntero nulo cuando recupero el objeto del dispositivo usb. ¿Como lo harias? Si se establece el servicio para captar la intención del archivo adjunto usb, nunca se llama. No sé por qué Android tiene un problema con ese filtro de intención específico. – matiaslezin

0

cómo pasar un contexto de actividad en una aplicación a un servicio de otra aplicación

Esto no es posible. Estas aplicaciones se ejecutan en máquinas virtuales separadas en aplicaciones separadas: no puede pasar un objeto a través de estos límites.

Cuestiones relacionadas