什么垂直条('|')在android中意味着什么?

时间:2012-12-12 18:00:43

标签: java android wakelock powermanager

例如:

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 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

From the doc

按位包含OR => |

按位包含OR(|)运算符对两个操作数的每个并行位对执行按位包含OR运算。在每对中,如果第一位或第二位为1(或两者都是1),则结果为1。否则结果为0.让我们看一下使用包含操作的表。 让我们理解使用真值表的包容性OR操作:

    (OR)

 A   B   Result
 0   0   0
 1   0   1
 0   1   1
 1   1   1

答案 2 :(得分: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;

如果你OR选项.OPTION1和Options.OPTION3,结果是0101;

Options.OPTION1 | Options.OPTION3 => 0101

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

您可以通过对选项进行“运算”来从打包值中“提取”选项:

packedValue = Options.OPTION1 | Options.OPTION3;


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

由于

0101 AND 0100 => 0100 => true

0101 AND 1000 => 0000 => false

答案 3 :(得分:0)

通常,该符号(|)是按位OR。它在Android之外的许多不同语言和环境中使用。

它的用法是:

“X | Y:如果X或Y为1,则结果为1”

在您的特定情况下,它用于创建位字段。请查看Android电源管理器代码库 here

此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),你试图只使用一个可选的唤醒锁标志运行......