0

まず、質問を検索したところ、約 2 ~ 3 個のスタック オーバーフロー リンクが見つかりましたが、明確な答えが得られません。マニフェストにブロードキャスト レシーバーを登録しました。

<receiver android:name=".BootReciever">
<intent-filter >
    <action android:name="android.intent.action.ACTION_DOCK_EVENT"/>
    <action android:name="android.intent.action.SCREEN_OFF"/>
</intent-filter>
</receiver>

そして私のクラスでは:

public class BootReciever extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
if(action.equals(Intent.ACTION_DOCK_EVENT)){
        //work for dock
    }

    if (action.equals(Intent.ACTION_SCREEN_OFF)) {
        //work for screen off
    }

}
}

しかし、どちらも機能しません.私の仕事は両方のケースで完了していません.私はサービスでそれをしなければならないことについて読みましたが、私は自分のサービスで働いたことがないので、android.developers.comは少しプロに優しいです.私はそれを機能させるのに苦労しています.誰かが私に上記を達成する方法を教えてもらえますか?そして私のアプリは長いサービスとしてそれをリッスンする必要があります.だから私のアプリがフォアグラウンドにないときでも.あなたの助けに感謝します.

4

2 に答える 2

0

これらの種類のインテントの受信者は、コードに動的に登録する必要があります。

        this.receiver = new BootReceiver();
        final IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_DOCK_EVENT);
        this.registerReceiver(receiver, filter);

これは、任意のアクティビティ (onStart() で登録、onStop() で登録解除、表示される有効期間セクションを参照) またはアプリケーション オブジェクトで行うことができます。

ただし、動的登録の問題は、BootReceiver がインテントを受け取る前にアプリケーションを起動する必要があることです。

于 2013-06-25T06:00:17.277 に答える
0

SCREEN_OFF間違いなくプログラムで登録する必要があります (たとえば、このリンクを参照してください。保護された意図です):

public class MainActivity extends Activity {
    BroadcastReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    Log.d("TAG", "on or off");
                }
            };
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            Log.d("TAG", "Register receiver");
            registerReceiver(receiver, filter);

        } catch (Exception e) {
            Log.d("TAG", "Caught: " + e.getStackTrace());
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        try {
            Log.d("TAG", "Unregister receiver");
            unregisterReceiver(receiver);

        } catch (Exception e) {
            Log.d("TAG", "Caught: " + e.getStackTrace());
        }
    }
}

ACTION_DOCK_EVENT私は何か他のことが間違っていると思います。との組み合わせが原因で機能しないACTION_SCREEN_OFF可能性があります。名前付けの問題が原因である可能性があります(.BootRecieverたとえば、 の相対パスは期待できません。完全修飾クラス名が機能するかどうかを確認してください)。

これが役に立てば幸いです....乾杯!

于 2013-06-25T06:17:34.733 に答える