0

例えば:

WakeLock wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK|
        PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.ON_AFTER_RELEASE, "Alarm");

' | は何をしますか? 」という文字の意味は?


問題の詳細:

PowerManager.AQUIRE_CAUSES_WAKEUP上記の方法を使用した場合と同様に、プログラムのみでウェイクロックをインスタンス化すると動作が停止するため、これを求めています。

これの原因は、プログラムがACQUIRE_CAUSES_WAKEUPタグを無視して使用されなくなったためではないかと思います。

4

4 に答える 4

7

| | はビットごとの or であり、Android を超えています。多くの場合、複数のオプションを 1 つのパラメーターに詰め込むために使用されます。

したがって、f(X|Y|Z) の形式の関数は、関数がオプション X、Y、および Z を使用する必要があることを意味します。それらの値を保持します。

于 2012-12-12T18:02:23.143 に答える
2

ドキュメントから

ビットごとの包括的 OR => |

ビット単位の包括的 OR ( | ) 演算子は、2 つのオペランドのビットの並列ペアごとに、ビット単位の包括的 OR 演算を実行します。各ペアで、最初または 2 番目のビットのいずれかが 1 (または両方が 1) の場合、結果は 1 です。それ以外の場合、結果は 0 です。包含演算を使用する表を見てみましょう。真理値表を使用して、包括的 OR 演算を理解しましょう。

    (OR)

 A   B   Result
 0   0   0
 1   0   1
 0   1   1
 1   1   1
于 2012-12-12T18:03:27.927 に答える
1

示した例のタイプで最も頻繁に使用される定数を見ると|、それらの値は2の累乗です。次に例を示します。

Options.OPTION1 = 1;
Options.OPTION2 = 2;
Options.OPTION3 = 4;
Options.OPTION4 = 8;

バイナリの場合(読みやすくするために0bプレフィックスを省略していることに注意してください):

Options.OPTION1 = 0001;
Options.OPTION2 = 0010;
Options.OPTION3 = 0100;
Options.OPTION4 = 1000;

Options.OPTION1ORとOptions.OPTION3を使用すると、結果は0101になります。

Options.OPTION1 | Options.OPTION3 => 0101

これにより、オプションの各組み合わせが一意であるため、複数の値を1つにまとめることができます。

オプションをANDすることにより、パックされた値からオプションを「抽出」できます。

packedValue = Options.OPTION1 | Options.OPTION3;


packedValue & Options.OPTION3 => true;
packedValue & Options.OPTION4 => false;

以来

0101 AND 0100 => 0100 => true

0101 AND 1000 => 0000 => false
于 2012-12-12T18:16:01.743 に答える
0

一般に、その記号 ( |) はビットごとの OR です。Android 以外のさまざまな言語や環境で使用されています。

その使用法は次のとおりです。

"X|Y : X または Y が 1 の場合、結果は 1"

あなたの特定のケースでは、ビットフィールドを作成するために使用されています。ここで Android パワー マネージャーのコード ベースを確認してください

この API で使用できるフラグは次のとおりです。

PARTIAL_WAKE_LOCK        = 0x01 
SCREEN_DIM_WAKE_LOCK     = 0x06
SCREEN_BRIGHT_WAKE_LOCK  = 0x0a
FULL_WAKE_LOCK           = 0x1a

これらは相互に排他的です (1 つしか選択できません) が、他のいくつかのフラグを "OR" することができます。

ON_AFTER_RELEASE         = 0x20000000
ACQUIRE_CAUSES_WAKEUP    = 0x10000000

したがって、コードが実行されると、これらのフラグを一緒に OR 演算すると、次のようになります。

    0x20000000
  | 0x10000000
  | 0x0000001a
---------------
    0x3000001a

「PowerManager.AQUIRE_CAUSES_WAKEUP」のみでウェイクロックをインスタンス化すると、プログラムが動作しなくなるため、これを求めています

これは、wake lock のレベル ( 、、、または) のいずれか選択する必要があるためです。オプションの wake lock フラグの 1 つだけを使用して実行しようとしています...PARTIALSCREEN_DIMSCREEN_BRIGHTFULL

于 2012-12-12T18:18:16.730 に答える