0

以前の質問: BroadcastReceiver でデータを保持してアクセスする方法は? 素晴らしい回答が得られましたが、ここではこれに焦点を当てます。

BroadcastReceiverがあり、Serviceがあります。レシーバーからサービスにデータを送信し、データを取り戻したいと思います。転送を開始する当事者は、サービスではなく受信者です。

簡単にするために、レシーバーが SCREEN_ON を待ってからサービスに「これはユーザーの誕生日ですか」と尋ね、サーバーが true または false を返すとします。

私が間違っていなければ、 Service に送られるデータを Intent に添付して を呼び出す必要startServiceがありますが、データを取り戻すにはどうすればよいですか?

4

2 に答える 2

5

あなたが説明したようにこれを実際に行うことはできません。@CommonsWareは正しく、選択したアーキテクチャに欠陥があります。

BroadcastReceiverは短命です。したがって、非同期呼び出しを行うことはできず、「かなりの時間」かかるタスクを実行することもできません。特定のイベントによってトリガーBroadcastReceiverされ、そのイベントのためにかなりの量の作業を行う必要がある場合は、その作業をに委任する必要がありますService

通常(例:内Activity)、から情報を要求するService場合は、にバインドしServiceてサービスに同期呼び出しを行い、必要なデータを要求するか、サービスを非同期に呼び出すことができます(つまりIntent、 it)次に、返された結果をリッスンします(を使用してBroadcastReceiver)。はにバインドできず、非同期呼び出しを行うことができないBroadcastReceiverため、これらのメソッドはどちらもaからは機能しません。BroadcastReceiverService

編集:ここで参照するためにAndroidドキュメントから関連情報をコピーしました

レシーバーのライフサイクル

オブジェクトは、へのBroadcastReceiver呼び出しの間のみ有効ですonReceive(Context, Intent)。コードがこの関数から戻ると、システムはオブジェクトが終了し、アクティブでなくなったと見なします。

これは、実装で実行できることに重要な影響を及ぼします onReceive(Context, Intent)。非同期操作を処理するために関数から戻る必要があるため、非同期操作を必要とするものは利用できませんが、その時点でBroadcastReceiverはアクティブではなくなり、システムはアクティブではなくなります。非同期操作が完了する前に、プロセスを自由に強制終了できます。

特に、ダイアログを表示したり、内からサービスにバインドしたりすることはできませんBroadcastReceiver。前者の場合、代わりに NotificationManagerAPIを使用する必要があります。後者の場合、を使用 Context.startService()してコマンドをサービスに送信できます。

于 2012-10-12T14:21:12.053 に答える
0

セッションを使おう!セッションにデータを保存します。

@Override
    public void onReceive(Context context, Intent intent)
    {
        SessionManager session = new SessionManager(context);
        // get user data from session
        HashMap<String, Object> user = session.getUserDetails();

    // name
    m_userId = (int)user.get(SessionManager.KEY_ID);


    m_context = context;

    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");

    wl.acquire();

    // Put here YOUR code.
    //Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example



    wl.release();
}
于 2015-12-08T21:57:52.463 に答える