Comment passer un contexte d'activité dans une application à un service dans une autre application
J'ai donc une activité dans une application qui démarre un service:
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()");
}
}
L'activité est lancé par la suite intention:
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
Le service de la journalisation et se connecte avec ce périphérique usb personnalisées. Pour ce faire, il a besoin du contexte d'activité:
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");
}
}
mère devrait être l'activité qui démarre le service. Cette approche utilisée pour le travail, parce que le code utilisé pour être dans la même application, mais maintenant, je veux que ce soit un service, afin que d'autres applications peuvent se connecter à elle.
Est-il un moyen de passer le contexte de l'activité du service? J'ai lu beaucoup de choses sur les intentions et les faisceaux, parcelable et la sérialisation, mais aucune ne fonctionne pour moi. J'ai besoin de passer du contexte.
Des idées?
OriginalL'auteur matiaslezin | 2012-09-20
Vous devez vous connecter pour publier un commentaire.
Chaque Service a son propre Contexte, il suffit d'utiliser cela. Vous n'avez pas besoin de passer à un Service, une Activité du Contexte.
Je ne vois pas pourquoi vous avez besoin d'une Activité spécifique du Contexte d'appel
getSystemService()
et un Service recevra les Intentions d'un BroadcastReceiver aussi facilement que n'importe quelle Activité.Aussi, si l'origine de l'Activité est détruite alors que ce Service est en cours d'exécution, le Contexte sera pas valide ou l'Activité sera coulé.
Mais votre BroadcastReceiver pouvez transmettre cette information au Service directement, il n'a pas besoin d'être stockées dans une Activité.
Parce que j'ai essayé avec le contexte du service et j'ai toujours pointeur null lors de la récupération du périphérique usb de l'objet. Comment le feriez-vous? Si un ensemble de service pour attraper l'intention de l'usb attachement juste n'est jamais appelé. Je ne sais pas pourquoi Android a un problème avec cette intention spécifique de filtre.
Mais le BroadcastReceiver n'auraient jamais recevoir de l'intention de la connexion usb. Android dispose d'un bug ou quelque chose comme ça. Elle ne fonctionne que pour un filtre d'intention dans une activité.
"J'ai essayé avec le contexte du service et j'ai toujours pointeur null lors de la récupération du périphérique usb de l'objet." Intéressant (je vais l'essayer moi-même.) Cependant, vous pouvez toujours passer l'extra Parcelable les données dans une nouvelle Intention ou vous pouvez utiliser UsbManager#getDeviceList().
OriginalL'auteur Sam
Ce n'est pas possible. Ces applications sont en cours d'exécution sur des machines virtuelles distinctes dans des applications distinctes -- vous ne pouvez pas passer d'un objet à travers ces frontières.
OriginalL'auteur CommonsWare
Peut-être la communication Interprocessus peut vous y aider.
Certains au hasard sur google Android CIB diapositives ici
OriginalL'auteur enTropy