2

時間が変わったときにイベントを受け取るための非常に単純な IntentReceiver があります。コードは次のとおりです。

public class IntentRec extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("IntentRec", intent.getAction());
    }
}

<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
    <receiver android:name=".IntentRec">
        <intent-filter>
            <action android:name="android.intent.action.TIME_SET"/>
        </intent-filter>
    </receiver>
    <activity android:name="MyActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

ただし、アプリケーションの実行中にインテントを受け取ります。しかし、(Force Close を使用して) アプリをシャットダウンすると、onReceive は呼び出されません。私の質問は、リスナー アプリが実行されている場合にのみインテントを受け取ることですか? インテントは、アプリが実行されていないときにターゲット リスナー クラスを実行するように設計されていると思いました。

ありがとう

4

2 に答える 2

6

解決策は簡単です。[強制終了] をクリックするのをやめます。

Android 3.1 以降では、ユーザーが手動でアクティビティを実行するか、他の何か (サードパーティ製アプリなど) がアプリを起動するまで、強制終了により、アプリ内のすべての操作が再度実行されなくなります。


アップデート

「停止」という言葉の複数の意味に混乱していると思われます。「停止」という言葉を避けて、プロセスを順を追って説明し、それが役立つかどうかを確認しましょう。

アプリが Android デバイスに最初にインストールされたとき、アプリは「snicklefritzed」と呼ばれる状態になっています。アプリがこの「snicklefritzed」状態にある間、マニフェスト登録は機能しませんBroadcastReceiver。アプリを「snicklefritzed」状態から移動するには、一部のサードパーティ アプリ (ホーム画面ランチャーなど) が、アプリで何か (アクティビティなど) を実行するように明示的に要求する必要があります。したがって、イベントの通常のコースは、ユーザーがアプリをダウンロードし、そのランチャー アイコンをクリックすると、アプリが「通常の」状態になり、「snickelfritzed」状態から離れるというものです。「通常」の状態では、正常BroadcastReceiverに動作します。

BroadcastReceiverあなたのが放送用だとしましょうACTION_BOOT_COMPLETED「snicklefritzed」状態は、アプリが現在実行されているかどうかとは関係ありません。アプリが実行されたかどうかにのみ依存します。したがって、ユーザーがアプリをインストールしても、アプリで何かを行う前に電話を再起動すると、ACTION_BOOT_COMPLETED受信機は起動時に制御できなくなります。ただし、ユーザーがアプリで何かを実行してから電話を再ACTION_BOOT_COMPLETED起動すると、受信機は通常どおりブロードキャストを受信します。

通常、アプリは「snicklefritzed」状態から抜け出し、その状態に戻ることはありません。アプリが再び「スニックルフリッツ」になる原因の1 つは、ユーザーが [設定] でこのアプリの [強制終了] をクリックした場合です。ここで、ユーザーは Android に対して、アプリの動作に誤りがあり、ユーザーが別のことを言うまで再実行すべきではないことを明示的に伝えています。もちろん、ユーザーが再びアクティビティを起動すると、「通常の」状態に戻ります。

于 2012-06-10T23:42:56.367 に答える
0

がアクティビティとは無関係に受信できるようにするには、追加android:process=":remote"する必要があります。BroadcastReceiver

<receiver android:name=".IntentRec"
    android:process=":remote"> //We declare that this is in a remote process
    <intent-filter>
        <action android:name="android.intent.action.TIME_SET"/>
    </intent-filter>
</receiver>

乾杯、ゼッド

于 2012-06-10T23:39:26.910 に答える