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:
est mon design avec MyBaseService MyIntentService efficace? Si non, comment dois-je faire pour archiver le résultat que je veux?
Si sendBroadcast() est une bonne direction, comment dois-je m'inscrire dans MyBaseService?