2

Je suis nouveau au développement d'Android, et j'essaye de m'entraîner avec le service et l'intentservice.Communication entre le service et intentservice

C'est ma classe de service:

public class MyBaseService extends Service { 

private double[] returnData; 

public MyBaseService() { 
} 

@Override 
public void onCreate() { 
    returnData = new double[//dataSise]; 
} 

/** The service is starting, due to a call to startService() */ 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    try { 
     for (Map.Entry<Integer, Double[]> mapEntry : dataMap.entrySet()) { 

      doXYZ(mapEntry.getValue()); 
      Arrays.sort(returnData); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    Intent intents = new Intent(); 
    intents.setAction(ACTION_SEND_TO_ACTIVITY); 
    sendBroadcast(intents); 
    return START_STICKY; 
} 

/** A client is binding to the service with bindService() */ 
@Override 
public IBinder onBind(Intent arg0) { 
    return mBinder; 
} 

public class MyBinder extends Binder { 
    public MyBaseService getService() { 
     return MyBaseService.this; 
    } 
} 

/** Called when a client is binding to the service with bindService()*/ 
@Override 
public void onRebind(Intent intent) { 

} 

/** Called when The service is no longer used and is being destroyed */ 
@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 


private void doXYZ(double[] data) { 
    int gallerySize = galleryFiles.length; 

    for (int i=0; i<data.length; ++i) { 
     Intent cfIntent = new Intent(this, MyIntentService.class); 
     compareFeatureIntent.putExtra(MyIntentService.COMPARING_INDEX, i); 
     startService(cfIntent); 
    } 

} 

BroadcastReceiver mReceiver; 

// use this as an inner class like here or as a top-level class 
public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     int index = intent.getIntExtra(MyIntentService.COMPARING_INDEX, 0); 
     double scores = intent.getDoubleArrayExtra(MyIntentService.COMPARING_SCORE); 
     data[index] = scores[0]; 
    } 

    // constructor 
    public MyReceiver(){ 
    } 
} 

}

Et ceci est classe intentservice:

public class MyIntentService extends IntentService { 
protected static final String ACTION_COMPARE_FEATURES = "CompareFeatures"; 
protected static final String COMPARING_SCORE = "Score"; 
protected static final String COMPARING_INDEX = "Index"; 

public MyIntentService() { 
    super("MyIntentService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 

    int index = (int)intent.getLongExtra(COMPARING_INDEX, 0); 

    // This is long operation 
    double[] scores = getScores(index); 

    Intent intents = new Intent(); 
    intents.setAction(ACTION_COMPARE_FEATURES); 
    intent.putExtra(COMPARING_SCORE, scores); 
    intent.putExtra(COMPARING_INDEX, index); 
    sendBroadcast(intents); 
} 

}

Le scénario est que je veux commencer MyBaseService classe à l'intérieur de l'activité principale. À l'intérieur de MyBaseService, j'ai besoin de faire une opération à long terme et j'ai besoin de répéter cette opération plusieurs fois. Donc, je mets cette longue opération dans MyIntentService, et démarre MyIntentService dans une boucle. MyIntentService produira des données, et je veux récupérer ces données dans la classe MyBaseService pour effectuer d'autres opérations.

Le problème auquel je suis confronté avec la communication entre MyBaseService et MyIntentService. Étant donné que MyBaseService démarre MyIntentSerice plusieurs fois, ma solution initiale consiste à sendBroadcast() à partir de MyIntentService et à enregistrer le destinataire dans MyBaseService.

Alors, mes questions sont les suivantes:

  1. est mon design avec MyBaseService MyIntentService efficace? Si non, comment dois-je faire pour archiver le résultat que je veux?

  2. Si sendBroadcast() est une bonne direction, comment dois-je m'inscrire dans MyBaseService?

Répondre

1

Votre architecture est bonne. Il y a plusieurs façons de le faire mais cette approche est OK.

Vous pouvez enregistrer le BroadcastReceiver dans MyBaseSerice.onStartCommand() et le désinscrire dans MyBaseService.onDestroy().

Vous devrez déterminer comment arrêter MyBaseService. Soit le Activity peut le faire ou MyBaseService devra garder une trace du nombre de réponses qu'il attend du IntentService et dès qu'il obtient le dernier il peut se fermer en appelant stopSelf().