Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 服务和intentservice之间的通信_Android_Broadcastreceiver_Android Service_Intentservice - Fatal编程技术网

Android 服务和intentservice之间的通信

Android 服务和intentservice之间的通信,android,broadcastreceiver,android-service,intentservice,Android,Broadcastreceiver,Android Service,Intentservice,我是Android开发的新手,我试图在服务和intentservice方面进行一些实践 这是我的服务课: public class MyBaseService extends Service { private double[] returnData; public MyBaseService() { } @Override public void onCreate() { returnData = new double[//dataSise]; } /** The servic

我是Android开发的新手,我试图在服务和intentservice方面进行一些实践

这是我的服务课:

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(){
    }
}
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);
}
}

场景是,我想在主活动内启动MyBaseService类。在MyBaseService内部,我需要执行一个长时间运行的操作,并且需要多次迭代该操作。所以,我将这个长操作放在MyIntentService中,并在一个循环中启动MyIntentService

MyIntentService将生成一些数据,我希望将这些数据返回到MyBaseService类中,以便执行进一步的操作

我在MyBaseService和MyIntentService之间的通信中面临的问题。因为MyBaseService会多次启动MyIntentSerice,所以我的初始解决方案是从MyIntentService发送广播(),并在MyBaseService中注册接收器

因此,我的问题是:

  • 我使用MyBaseService MyIntentService的设计是否高效?如果没有,我应该如何存档我想要的结果

  • 如果sendBroadcast()方向正确,我应该如何在MyBaseService中注册


  • 你的架构很好。有几种方法可以做到这一点,但这种方法是可以的

    您可以在
    MyBaseSerice.onStartCommand()
    中注册
    BroadcastReceiver
    ,然后在
    MyBaseService.onDestroy()中注销它

    您需要确定如何关闭
    MyBaseService
    活动
    可以完成,或者
    MyBaseService
    需要跟踪它等待
    IntentService
    回复的数量,一旦收到最后一个回复,它就可以通过调用
    stopSelf()关闭自己