2012-12-12 3 views
0

Например:Какой вертикальный бар ('|') означает в android?

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

Что делает "| «символ означает?


Подробнее о проблеме:

Я спрашиваю это, потому что, когда я экземпляр wakelock только PowerManager.AQUIRE_CAUSES_WAKEUP программа перестает работать, где, как, когда я использую путь выше, он отлично работает.

Мне интересно, причина в том, что программа игнорирует тег ACQUIRE_CAUSES_WAKEUP, и она не используется.

+0

Это называется трубой;) – Magakahn

ответ

0

В общем, этот символ (|) является побитовым ИЛИ. Он используется во многих разных языках и средах вне Android.

Это использование является:

«X | Y: если X или Y является 1, то результат 1»

В вашем конкретном случае он используется для создания битового поля. Представьтесь, чтобы просмотреть базу кода управления Android 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 

Так однажды ваш код запускает его OrS эти флаги вместе в результате:

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

Я спрашиваю это, потому что, когда я экземпляр wakelock только с программой «PowerManager.AQUIRE_CAUSES_WAKEUP» перестает работать

Это потому, что вы должны выбрать один из уровней блокировки бодрствование (PARTIAL, SCREEN_DIM, SCREEN_BRIGHT, или FULL), вы пытаетесь запустить только один из дополнительных флажков блокировки бодрствования ...

7

The | является поразрядным или, и это выходит за рамки Android. Он часто используется для заполнения нескольких параметров одним параметром.

Таким образом, функция вида f (X | Y | Z) означает, что функция должна использовать опции X, Y и Z. Конечно, X, Y и Z должны быть соответствующим образом закодированы, чтобы обеспечить | сохранят свои ценности.

2

From the doc

поразрядное OR => |

Оператор побитового включения ИЛИ (|) выполняет побитовое включение операции ИЛИ по каждой параллельной паре битов из двух операндов. В каждой паре результат равен 1, если первый или второй бит равен 1 (или оба равны 1). В противном случае результат равен 0. Давайте посмотрим на таблицу использования инклюзивных операций. Позволяет понять исключающую ИЛИ операцию с использованием таблицы истинности:

(OR) 

A B Result 
0 0 0 
1 0 1 
0 1 1 
1 1 1 
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 Opt ионы .OPTION1 и Options.OPTION3, результат 0101;

Options.OPTION1 | Options.OPTION3 => 0101 

Это позволяет упаковать несколько значений в один, поскольку каждая комбинация параметров уникальна.

Вы можете "извлечь" опции из упакованного значения по операции AND опции:

packedValue = Options.OPTION1 | Options.OPTION3; 


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

С

0101 AND 0100 => 0100 => true 

и

0101 AND 1000 => 0000 => false 

 Смежные вопросы

  • Нет связанных вопросов^_^