1

開始後に結果を返す必要があるAndroidサービスがあります。そう:

1) サービスを開始します

2) サービスが何かをする

3) サービスが結果を返す

シングルトンクラスを使用して結果を取得できるのではないかと考えました。サービスに結果を保存させ、アクティビティによってサービスから結果を取得するために、シングルトン クラスを作成しました。クラスのコードは次のとおりです。

public class Result {

    //SIGLETON DECLARATION

    private static Result mInstance = null;

    public static Result getInstance() { 
        if (mInstance == null) {
            mInstance = new Result();
        }
        return mInstance;
    }

    private Result() {
    }

    //CODE

    Object result;
    boolean resultIsSet = false;

    public void deletePreviousResult() {
        this.result = null;
        resultIsSet = false;
    }

    public void setResult(Object result) {
        Log.w("result", "setResult");
        this.result = result;
        resultIsSet = true;
    }

    public Object getResult() {
        Log.w("result", "getResult");
        while(resultIsSet == false) {}
        return this.result;
    }

結果を取得するために使用するコードは次のとおりです。

public int getInfo() {
    Result.getInstance().deletePreviousResult();
    //start the service and ask to save the result in singleton class
    Intent myIntent = new Intent(mInstanceContext, MediaPlayerService.class);
    myIntent.setAction("getInfo");
    mInstanceContext.startService(myIntent);
    //take the result
    return (Integer) Result.getInstance().getResult();
}

で行っていることは次のonStartCommandとおりです。

 Result.getInstance().setResult(mMediaPlayer.getCurrentPosition()); 

mMediaPlayerMediaPlayer オブジェクトです。

ただし、問題は、setResultも呼び出されることになっている場合onStartCommand、決して呼び出されないことです。なんで?それは私のアプローチが間違っていますか?

4

1 に答える 1

1

あなたが持っているこのコードgetInfo()

mInstanceContext.startService(myIntent);
//take the result
return (Integer) Result.getInstance().getResult();

次のステートメントで。を使用して結果を取得できるように、サービスを呼び出すときstartService()にサービスが開始され、同期的onStartCommand()に呼び出されることを前提としています。Result.getInstance().getResult()

残念ながら、それはそのようには機能しません。呼び出すstartService()ことは、オブジェクトのメソッドを呼び出すこととは異なります。電話をかけるときは、次の利用可能な瞬間にstartService()そのサービスを開始するようにAndroidに指示します。サービスではメインスレッドで呼び出す必要があるため、通常、これはAndroidがサービスを開始し、次にAndroidがメインスレッドを制御したとき(つまり、すべてのアクティビティメソッドが戻ったとき)に呼び出すことを意味します。いずれにせよ、サービスがいつ開始されるか、いつ呼び出されるかを決定することはできません。これは非同期呼び出しであるため、コールバックに依存する必要がありますonStartCommand()onStartCommand()onStartCommand()機構。これは、サービスが作業を完了し、結果を返したいときに呼び出すことができる、ある種のコールバックメソッドを作成する必要があることを意味します。

これを行うにはさまざまな方法があります。サービスにインテントをアクティビティに送信させることができます。結果を含むインテントをサービスにブロードキャストさせることができます。サービスにバインドして、コールバックリスナーを登録できます(バインドされたサービスについては、開発者向けドキュメントを参照してください)。おそらく他の方法もあります。

于 2012-09-04T21:58:50.940 に答える