Ciao a tutti,
nella mia ricerca di un metodo per fare un'applicazione a plugin, mi sono imbattuto in un dilemma.
Premessa:
1) "Applicazione a plugin" si intende un'apk che fa da core e più apk che fanno da plugin
2) La comunicazione tra i plugin ed il core avviene tramite l'utilizzo di Intent e BroadcastReceiver
3) il passaggio di dati è fatto tramite Bundle passati al Receiver tramite l'Intent.
4) l'Intent che il Core 'lancia' è ovviamente registrato su tutti i receiver degli n ipotetici plugin
Come fare per svolgere il compito al punto 4?
Ipotesi 1:
Il core lancia un intent per tutti i plugin indistintamente, quindi ogni plugin ha delle regole stringenti per rispondere solo se l'intent è per lui.
Ipotesi 2:
Il core lancia un intent specificatamente al plugin che sa di dover chiamare.
E' ovviamente un problema di disegno architetturale e quindi legato a cosa effettivamente il core debba fare.
Nel mio specifico caso l'ipotesi 2 è quella che mi permette di svolgere meglio il compito che è stato assegnato al core.
Qui vedremo come lanciare un Intent ad uno specifico Package e come farlo ad uno specifico Broadcast Receiver di uno specifico Package:
Per lanciare un intent ad uno specifico package è necessario usare le API versione 4 o superiore (quindi per android 1.6, minimo):
Ecco il codice del core che lancia l'intent:
1Intent i = new Intent("org.packagename.intent.TEST");
2i.setPackage("org.package.name");
3sendBroadcast(i);
Ovviamente il plugin è fatto in modo da avere un package "org.package.name" e deve avere nel manifest un receiver che risponda all'intent "org.packagename.intent.TEST".
Ecco il codice del receiver:
x1package org.package.name;
2
3import android.content.BroadcastReceiver;
4import android.content.Context;
5import android.content.Intent;
6import android.util.Log;
7
8public class testReceiver extends BroadcastReceiver {
9
10
11public void onReceive(Context arg0, Intent arg1) {
12Log.d("PackageNameLog", "Intent Ricevuto!");
13}
14
15}
Ecco la riga del manifest del plugin per il receiver:
11<receiver android:name="testReceiver" android:enabled="true"><intent-filter><action android:name="org.packagename.intent.TEST"></action>
se ci fossero anche 10 plugin che rispondono all'intent "org.packagename.intent.TEST", questo verrà ricevuto solo dal package "org.package.test".
Per inviarlo ad uno specifico receiver di uno specifico package invece cambia solo un'istruzione nel codice del core (questo funziona anche con API di livello 3, quindi android 1.5):
31Intent i = new Intent("org.packagename.intent.TEST");
2i.setClassName("org.package.name", "org.package.name.testReceiver");
3sendBroadcast(i);
Ovviamente è necessario che il core sappia nome del package del plugin e nome del receiver.
Per fare questo però è fondamentale che il core utilizzi la classe PackageManager oppure che esponga un content provider che il plugin possa usare per fornire il proprio nome e il proprio receiver al core.
Verrà trattato prossimamente.
Spero vi sia utile.