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

该| 是按位或,它超越了 Android。它通常用于将多个选项填充到一个参数中。

所以 f(X|Y|Z) 形式的函数意味着函数应该使用选项 X、Y 和 Z。当然,X、Y 和 Z 应该适当编码以确保 | 将保持他们的价值观。

于 2012-12-12T18:02:23.143 回答
2

从文档

按位包含 OR => |

按位包含 OR (|) 运算符对两个操作数的每个并行位对执行按位包含 OR 运算。在每一对中,如果第一位或第二位为 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;

如果你使用OROptions.OPTION1和Options.OPTION3,结果是0101;

Options.OPTION1 | Options.OPTION3 => 0101

这使您可以将多个值打包为一个,因为每个选项组合都是唯一的。

您可以通过 ANDing 选项从打包值中“提取”选项:

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

通常,该符号 ( |) 是按位或。它在 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

这些是互斥的(你只能选择一个),但你可以“或”其他一些标志:

ON_AFTER_RELEASE         = 0x20000000
ACQUIRE_CAUSES_WAKEUP    = 0x10000000

因此,一旦您的代码运行它或将这些标志组合在一起,将导致:

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

我问这个是因为当我只用“PowerManager.AQUIRE_CAUSES_WAKEUP”实例化唤醒锁时,程序停止工作

那是因为您必须选择唤醒锁定级别之一(PARTIALSCREEN_DIMSCREEN_BRIGHTFULL),您试图仅使用一个可选的唤醒锁定标志来运行......

于 2012-12-12T18:18:16.730 回答