- Сетевой стек в BIOS — что это?
- Сетевой стек в BIOS — что это такое?
- Взаимодействие Android-устройств в локальной сети
- О чем это и для кого это?
- Какие возможные способы решения существуют?
- Network stack андроид что это
- Tasks и Back Stack в Android
- Маленький итог
- Управление тасками
- Атрибут launchMode
- Флаги
- Affinity
- Чистка стека
Сетевой стек в BIOS — что это?
Приветствую. BIOS — микропрограмма, которая установлена на материнской плате, обычно в виде распаянного чипа. Нужна для тонкой настройки железа, а также для мониторинга температур (процессор, материнка). Сегодня пойдет речь об одной уникальной настройке.
Сетевой стек в BIOS — что это такое?
Предположительно настройка, включающая загрузку операционной системы по сети.
Предположительно полное название — Enable UEFI Network Stack. Одно из расположений — раздел Advanced Boot Configuration (Расширенная конфигурация загрузки) на вкладке General (Общие).
Опция возможно нужна для следующих задач:
- Установка ОС по сети. Скорее всего сетевая карта должна также поддерживать эту технологию. Суть — на обычный ПК устанавливается Windows, но для этого не используется ни флешка ни CD/DVD, а только кабель интернета. В биосе активируется опция, после при помощи boot-меню выбирается загрузочное устройство — network/сеть (обычно упоминается слово LAN).
- Удаленная работа. Применимо в офисных ПК, когда работа идет в удаленной Windows. При этом вся работа пользователя производиться на сервере, на котором работают и другие пользователи. Компьютер, на котором работает пользователь — может обозначаться как терминал/клиент. По факту пользователь только видит Windows на экране, а фактически все действия производятся удаленно (на сервере).
При отключенной опции могут быть проблемы при попытке загрузиться с устройства, подключенного через USB-C.
Биос Asus содержит данную настройку (расположение — раздел Advanced\Network Stack Configuration):
Другие биосы, Gigabyte, AsRock — также поддерживают опцию.
Источник
Взаимодействие Android-устройств в локальной сети
Предположим, мы пишем игру для Android, которая подразумевает некое сетевое взаимодействие между устройствами. Причем наши устройства находятся в одной сети и мы хотим, чтобы взаимодействие между ними осуществлялось быстро, а значит вариант с обменом данными через интернет нам не подходит. Ах да, еще одна маленькая ложка дегтя — мы хотим охватить максимально возможную аудиторию, для чего нам необходимо поддерживать Android 2.3.
Что же нам делать? Давайте поговорим об этом, а заодно рассмотрим относительно новые возможности Android SDK для соединения двух и более устройств.
О чем это и для кого это?
Как-то раз, уйдя с предыдущего места работы и погрузившись в заслуженный отдых, я принялся писать сетевую игру, в которую могут играть люди, находящиеся в одной локальной сети. И сразу же столкнулся с тем, что для нормального функционирования подобной игры нам мало соорудить сетевое взаимодействие — нам нужно сделать нормальное и быстрое обнаружение устройств в сети. Собственно, в данной статье я поделюсь своим опытом в реализации решения для данной задачи.
Сразу оговорюсь, что статья предназначена в большей мере для тех, кто имеет опыт Android-разработки, написал несколько приложений и хочет расширить свой кругозор, а также улучшить профессиональные навыки.
Какие возможные способы решения существуют?
- Android Network Service Discovery. Простой и эффективный способ обнаружения устройств. На Android Developer есть пошаговое руководство по подключению NSD, есть пример NsdChat, который можно скачать там же. Но есть один существенный минус — данный метод поддерживается только начиная с API Level 16, то есть с Android 4.1 Jelly Bean;
- Второе решение, предлагаемое нам на сайте Android Developer — Wi-Fi Peer-to-Peer. Проблема этого метода та же самая — поддерживается он только начиная с API Level 16;
- Есть странное решение, которое предлагается некоторыми программистами на Stack Overflow — самостоятельно сканировать локальную сеть на предмет наличия сервера. То есть проходить по всем адресам сети. Это уже сейчас звучит как странный велосипед, а теперь представьте, что порт нашего сервера назначается автоматически. Таким образом, сканирование даже самую небольшой сети становится достаточно долгой и трудоемкой задачей;
- Наконец, мы можем обратить внимание на Java-библиотеки и написать что-нибудь с их использованием. Например, JmDNS.
Последний способ выглядит вполне адекватным и, кажется, может обеспечить нас требуемой скоростью и удобством обнаружения устройств в сети для конечного пользователя.
Я вооружился JmDNS и решил попробовать соорудить несколько классов, которые по максимуму упростят написание описанных выше приложений. Но для начала пришлось немного повырезать дубликаты .class-файлов из jar-пакета JmDNS (проблема описана здесь):
Далее я взял исходный код NsdChat с Android Developer и изменил его служебный класс, который отвечает за инициализацию сокетов и организацию сетевого взаимодействия. Также я написал wrapper для JmDNS
Здесь размещены 4 основные функции для работы Network Discovery:
- startServer для создания сервера и регистрации соответствующего сервиса в локальной сети;
- findServers для поиска серверов;
- reset для окончания работы с Network Discovery и последующего освобождения ресурсов;
- wifiLock для запроса блокировки Wi-Fi.
В завершении я написал универсальный класс ConnectionWrapper для полноценной организации обнаружения, а также обмена сообщениями в локальной сети. Таким образом, создание сервера в конечном приложении выглядит следующим образом:
А вот и mServerHandler, использующийся для приема и обработки сообщений:
Отправка сообщений еще проще:
И, наконец, метод для обнаружения и подключения к серверу:
Как видите, все очень просто. А главное, все это работает в любой версии Android для максимум двух устройств. Но сделать так, чтобы это работало для условно неограниченного числа устройств очень легко, и очевидное решение придет к вам почти сразу после детального изучения класса Connection. Пусть это будет в качестве домашнего задания.
Ах, да, весь код доступен для изучения и использования всеми желающими в моем репозитории на GitHub.. И, конечно, не исключаю то, что некоторые вещи можно сделать лучше и проще, поэтому не стесняйтесь форкать и делать pull request’ы.
Источник
Network stack андроид что это
Краткое описание:
Мониторинг входящих/исходящих соединений.
Описание:
Мощный инструмент для просмотра и мониторинга (отслеживания) всех входящих и исходящих соединений Вашего Android-устройства. Низкоуровневый модуль перехвата соединений обеспечивает наилучшую производительность при минимальном расходе заряда батареи. Работает и на НЕРУТОВАННЫХ телефонах.
Network Connections должен быть у каждого фаната Android и является идеальным дополнением к приложению Anti Spy Mobile, выявляющему «секреты» установленных у Вас приложений.
ОСНОВНЫЕ ФУНКЦИИ:
— Отслеживает все интернет-соединения Вашего Android-устройства, и входящие, и исходящие.
— Показывает уведомления, когда скрытые приложения подключаются к удалённым серверам.
— Показывает подробную информацию протокола IP для каждого соединения — IP-адрес, обратное разрешение (обратную запись PTR), номер AS (номер автономной системы ASN), данные из «чёрных списков» (Abuse RBL), административную информацию и т.д.
— Получает подробные сведения о каждом приложении, которое подключается к удалённым серверам, и об используемых им сетевых подключениях — разрешения, предоставленные каждому перехваченному пакету, и все IP-адреса, которые оно использует.
— В режиме реального времени сортирует по «наиболее активным», «последним соединениям» или по «имени пакета».
— Протоколирует и экспортирует полученные данные.
ПРИМЕЧАНИЕ: Это БЕСПЛАТНО-Пробное приложение и некоторые его функции ограничены определённым количеством попыток. Если приложение Вам понравилось и Вы хотите им пользоваться, пожалуйста, загрузите Ключ Разблокировки для него.
Соединения, Используемые Самим Приложением:
Google IPs — Статистика и Карты
RIPE, ARIN — информация об IP
Требуется Android: 4.0 и выше
Русский интерфейс: Неизвестно
версия 1.3.3 Unlocked Rus: Network Connections (Пост #82505196)
версия 1.3.3 Unlocked: Network Connections (Пост #82498460)
версия 1.3.3: Network Connections (Пост #81997237)
версия 1.3.2: Network Connections (Пост #81882357)
Unlock Key 1.0.1: Network Connections (Пост #33125783)
версия 1.2.0: Network Connections (Пост #78695688)
версия 1.1.2 Unlocked Rus: Network Connections (Пост #60542256)
версия 1.1.2 Unlocked: Network Connections (Пост #51077646)
версия 1.1.1 Unlocked: Network Connections (Пост #46797142)
версия 1.0.11 Unlocked: Network Connections (Пост #36948906)
версия 1.0.11 Rus: Network Connections (Пост #39987413)
версия 1.0.11: Network Connections (Пост #33125783)
версия 1.0.9 Unlocked Rus: Network Connections (Пост #33130043)
версия 1.0.9 Unlocked: Network Connections (Пост #27593031)
версия 1.0.6 Unlocked Rus: Network Connections (Пост #26155389)
версия 1.0.8 Unlocked: Network Connections (Пост #26882289)
версия 1.0.7 Unlocked: Network Connections (Пост #26304119)
версия 1.0.6 Unlocked: com.antispycell.connmonitor_1.0.6_U_if.apk ( 457.76 КБ )
Разблокированы функции полной версии. Анлокер не нужен.
версия 1.0.6 Unlocked Rus: Network Connections (Пост #26155389)
Сообщение отредактировал iMiKED — 22.09.20, 11:08
Русифицированная Network Connections
Версия: 1.0.6
Перевод мой.
NetworkConnections_v1.0.6_RUS.apk ( 440.69 КБ )
Источник
Tasks и Back Stack в Android
Итак. Каждое Android приложение, как минимум, состоит из фундаментальных объектов системы — Activity. Activity — это отдельный экран который имеет свою отдельную логику и UI. Количество Activity в приложении бывает разное, от одного до много. При переходах между различными Activity пользователь всегда может вернуться на предыдущую, закрытую Activity при нажатии кнопки back на устройстве. Подобная логика реализована с помощью стека (Activity Stack). Его организация «last in, first out» — т.е. последний вошел, первый вышел. При открытии новой Activity она становится вершиной, а предыдущая уходит в режим stop. Стек не может перемешиваться, он имеет возможность добавления на вершину новой Activity и удаление верхней текущей. Одна и та же Activity может находиться в стеке, сколько угодно раз.
Task — это набор Activity. Каждый таск содержит свой стек. В стандартной ситуации, каждое приложение имеет свой таск и свой стек. При сворачивании приложения, таск уходит в background, но не умирает. Он хранит весь свой стек и при очередном открытии приложения через менеджер или через launcher, существующий таск восстановится и продолжит свою работу.
Ниже покажу картинку, как работает стек.
Если продолжать нажимать кнопку back, то стек будет удалять Activity до того, пока не останется главная корневая. Если же на ней пользователь нажмет back, приложение закроется и таск умрет. Кстати, я говорил о том, что когда мы сворачиваем наше приложение и запускам например новое, то наш таск просто уходит в background и будет ждать момента, пока мы его вызовем. На самом деле есть одно «но». Если мы будем иметь много задач в background или же просто сильно нагружать свое устройство, не мала вероятность того, что таск умрет из за нехватки системных ресурсов. Это не война конечно, но то что мы потеряем все наши текущие данные и наш стек очистится — это точно. Кстати для избежания потери данных в таком случаи, вам стоит почитать про SavingActivityState.
Маленький итог
Управление тасками
Существует два пути для изменения стандартной организации тасков. Мы можем устанавливать специальные атрибуты в манифесте для каждой Activity. Также мы можем устанавливать специальные флаги для Intent, который запускает новую Activity с помощью startActivity(). Заметьте, что иногда атрибуты в манифесте и флаги в Intent могут противоречить друг другу. В этом случаи флаги Intent будут более приоритетны.
Атрибут launchMode
Для каждой Activity в манифесте можно указать атрибут launchMode. Он имеет несколько значений:
- standard — (по умолчанию) при запуске Activity создается новый экземпляр в стеке. Activity может размещаться в стеке несколько раз
- singleTop — Activity может распологаться в стеке несколько раз. Новая запись в стеке создается только в том случаи, если данная Activity не расположена в вершине стека. Если она на данный момент является вершиной, то у нее сработает onNewIntent() метод, но она не будет пересоздана
- singleTask — создает новый таск и устанавливает Activity корнeвой для него, но только в случаи, если экземпляра данной Activity нет ни в одном другом таске. Если Activity уже расположена в каком либо таске, то откроется именно тот экземпляр и вызовется метод onNewIntent(). Она в свое время становится главной, и все верхние экземпляры удаляются, если они есть. Только один экземпляр такой Activity может существовать
- singleInstance — тоже что и singleTask, но для данной Activity всегда будет создаваться отдельный таск и она будет в ней корневой. Данный флаг указывает, что Activity будет одним и единственным членом своего таска
На самом деле не важно, в каком таске открыта новая Activity. При нажатии кнопки back мы все равно вернемся на предыдущий таск и предыдущие Activity. Единственный момент, который нужно учитывать — это параметр singleTask. Если при открытии такой Activity мы достанем ее из другого background таска, то мы полностью переключаемся на него и на его стек. на картинке ниже это продемонстрировано.
Флаги
Как и говорил, мы можем устанавливать специальный флаги для Intent, который запускает новую Activity. Флаги более приоритетны, чем launchMode. Существует несколько флагов:
- FLAG_ACTIVITY_NEW_TASK — запускает Activity в новом таске. Если уже существует таск с экземпляром данной Activity, то этот таск становится активным, и срабатываем метод onNewIntent().
Флаг аналогичен параметру singleTop описанному выше - FLAG_ACTIVITY_SINGLE_TOP — если Activity запускает сама себя, т.е. она находится в вершине стека, то вместо создания нового экземпляра в стеке вызывается метод onNewIntent().
Флаг аналогичен параметру singleTop описанному выше - FLAG_ACTIVITY_CLEAR_TOP — если экземпляр данной Activity уже существует в стеке данного таска, то все Activity, находящиеся поверх нее разрушаются и этот экземпляр становится вершиной стека. Также вызовется onNewIntent()
Affinity
Стандартно все Activity нашего приложения работают в одном таске. По желанию мы можем изменять такое поведение и указывать, чтобы в одном приложении Activity работали в разных тасках, или Activity разных приложений работали в одном. Для этого мы можем в манифесте для каждой Activity указывать название таска параметром taskAffinity. Это строковое значение, которое не должно совпадать с названием package, т.к. стандартный таск приложения называется именно как наш пакет. В общем случаи данный параметр указывает, что Activity будет гарантированно открываться в своём отдельном таске. Данный параметр актуален, если мы указываем флаг FLAG_ACTIVITY_NEW_TASK или устанавливаем для Activity атрибут allowTaskReparenting=«true». Этот атрибут указывает, что Activity может перемещаться между тасками, который её запустил и таском, который указан в taskAffinity, если один из них становится активным.
Чистка стека
Если таск долгое время находится в background, то система сама чистит его стек, оставляя только корневую Activity. Данное поведение обусловлено тем, что пользователь может забыть, что он делал в приложении до этого и скорее всего зашел в него снова уже с другой целью. Данная логика также может быть изменена с помощью нескольких атрибутов в манифесте.
- alwaysRetainTaskState — если флаг установлен в true для корневой Activity, то стек не будет чиститься и полностью восстановится даже после длительного времени
- clearTaskOnLaunch — если установить флаг в true для корневой Activity, то стек будет чиститься моментально, как только пользователь покинет таск. Полная противоположность alwaysRetainTaskState
- finishOnTaskLaunch — работает аналогично clearTaskOnLaunch, но может устанавливаться на любую Activity и удалять из стека именно её
Это всё для данного топика. Статья не импровизированная, а по сути является вольным переводом официальной документации. Рекомендую собрать легкий пример и поэксперементировать с флагами и атрибутами. Некоторые моменты, лично для меня были, неожиданно интересными. любые ошибки и недоработки учту в лс. Спасибо.
Источник