例如:
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK|
PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.ON_AFTER_RELEASE, "Alarm");
'| '字符意味着什么?
有关此问题的更多详细信息:
我问这个是因为当我只用PowerManager.AQUIRE_CAUSES_WAKEUP
实例化唤醒锁时,程序停止工作,而当我使用上面的方法时,它运行正常。
我想知道造成这种情况的原因是因为程序忽略了ACQUIRE_CAUSES_WAKEUP
标签并且最终没有被使用。
答案 0 :(得分:7)
|是一个按位或者,它超越了Android。它通常用于将多个选项填充到一个参数中。
因此形式f(X | Y | Z)的函数意味着函数应该使用选项X,Y和Z.当然,X,Y和Z应该被适当地编码以确保|将保留他们的价值观。
答案 1 :(得分: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
答案 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”实例化唤醒锁时,程序停止工作
那是因为 必须 选择其中一个唤醒锁定级别PARTIAL
,SCREEN_DIM
,SCREEN_BRIGHT
或FULL
),你试图只使用一个可选的唤醒锁标志运行......