Могу ли я узнать, почему параметр этой функции не имеет тип int? Я не понимаю всю концепцию указателя здесь [закрыто]

В новом Android L Preview Google объявил Task Locking , что делает именно это. Однако, похоже, он нуждается в корне.

В L Developer Preview представлен новый API блокировки задачи, который позволяет временно запретить пользователям покидать ваше приложение или прерваться уведомлениями. Это можно использовать, например, если вы разрабатываете образовательное приложение для поддержки требований оценки высоких ставок на Android. Когда ваше приложение активирует этот режим, пользователи не смогут видеть уведомления, получать доступ к другим приложениям или вернуться на главный экран, пока ваше приложение не выйдет из режима.

Чтобы предотвратить несанкционированное использование, разрешено только авторизованным приложениям активировать блокировку задачи. Кроме того, авторизация блокировки задачи должна предоставляться специально настроенным устройством владельца устройства с помощью метода android.app.admin.DevicePolicyManager.setLockTaskComponents().

Чтобы настроить владельца устройства, выполните следующие действия:

  • Прикрепите устройство, на котором установлена ​​сборка Android userdebug к вашей машине разработки.
  • Установите приложение владельца устройства.
  • Создайте файл device_owner.xml и сохраните его в каталоге /data/system на устройстве.
$ adb root
$ adb shell stop
$ rm /tmp/device_owner.xml
$ echo "" >> /tmp/device_owner.xml
$ echo "&device-owner package=\"\" name=\"*\" />" >> /tmp/device_owner.xml
$ adb push /tmp/device_owner.xml /data/system/device_owner.xml
$ adb reboot

Перед использованием API блокировки задачи в вашем приложении убедитесь, что ваша активность разрешена, вызывая DevicePolicyManager.isLockTaskPermited ().

Чтобы активировать блокировку задачи, вызовите android.app.Activity.startLockTask() из вашего разрешенного действия.

Когда блокировка задачи активна, действует следующее поведение:

  • Строка состояния пуста , а пользовательские уведомления и информация о статусе скрыты.
  • Кнопки Home и Recent Apps скрыты.
  • Другие приложения могут не запускать новые действия.
  • Текущее приложение может запускать новые действия, если это не создает новых задач.
  • Пользователь остается заблокированным в вашем приложении до тех пор, пока авторизационная активность не назовет Activity.stopLockTask().

0
задан Ray 16 January 2019 в 11:29
поделиться

3 ответа

Не должен ли параметр функции addatEnd () иметь тип int?

Он может быть реализован по-другому, но в настоящее время имеет смысл для этого взять вместо node*.

Но если это действительно указатель, значит ли это, что он должен будет указывать на определенный адрес памяти?

Как правило, указатели, которые передаются в качестве параметра, не должны указывать на действительный адрес памяти. Они также могут быть нулевыми указателями, и функция может обнаружить это и действовать соответствующим образом.

В этом случае, допустимый указатель должен быть передан, однако, потому что функция пытается изменить объект, по крайней мере, если head == NULL:

n->next = NULL;

Если n не указывают на действительное значение node, это неопределенное поведение и, скорее всего, приведет к сбою программы или даже к худшему.

0
ответ дан Blaze 16 January 2019 в 11:29
поделиться

Не должен ли параметр функции addatEnd () иметь тип int?

Нет.

Связанный список состоит из узлов. Каждый узел будет косвенно связывать (то есть ссылаться, то есть указывать) со следующим узлом до последнего узла, который завершает список. Целое число не может косвенно указывать на следующий узел, поэтому узлы связанного списка не могут быть целыми числами.

Но если это действительно указатель, значит ли это, что он должен будет указывать на определенный адрес памяти?

Да. Он должен будет указывать на некоторый node экземпляр (потому что функция косвенно указывает через указатель). Этот экземпляр будет сохранен в некотором адресе памяти.

<час>

П.С. Функция нарушена.

Устанавливает n->next в ноль, только если это единственный элемент списка. Не удается установить n->next, когда есть другие узлы.

Кроме того, объявлено, что он возвращает int, но не может этого сделать. Поведение программы не определено.

0
ответ дан eerorika 16 January 2019 в 11:29
поделиться

node представляет собой отдельную структуру данных. И node* n означает, что тот, кто вызывает addatEnd(node* n), передает адрес узла в качестве аргумента. Callee (вызывающий вашу функцию) выполняет:

Node n;//Instaniating node data structure
addatEnd(&node);//Passing the address of the node data structure to your function

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

Мы хотим выполнить операции с исходной структурой данных узла, следовательно, передавая адрес узла, чтобы мы могли выполнять операции в той области памяти, где был создан экземпляр узла.

0
ответ дан Rhnbmpl 16 January 2019 в 11:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: