Проблема «Администратора устройства» в том, что этот режим даёт приложению кучу полномочий сразу, без возможности выборочной отмены. Получается вы выводите пользователю эту статистику и просите его разрешить админку. Он думает — «Почему бы и нет?», открывается системное окно и там написано, что приложение получит возможность «удалять данные устройства», «запрещать использование камеры»,… «увести жену», «забрать кота» и вот на этом шаге у многих может возникнуть недоверие. Я бы точно не стал давать приложению такие полномочия только ради уведомлений, разве что это приложение написано мной лично.
Вообще тот же gcm ведь по сути вроде как держит соединение и в wakelock может принимать пуши. Что мешает сделать тоже самое?
Не путайте сторонние приложения, системные приложения и системные компоненты, для всех разные условия. GSM — это системный компонент, он вполне может работать в обход ограничений API, потому что сам является его частью.
Мне что то подсказывает, что проблема может решиться api для приложений связанное с администратором устройства.
Не факт. В любом случае тут всё упирается в необходимость запросить у пользователя разрешение на администрирование устройства для вашего приложения. С большой долей вероятности пользователь просто удалит приложение за такую наглость.
Для меня данная информация выглядит сомнительно. Не указаны ни версии Android ни конкретные модели устройств на которых это заработало. В противовес могу привести несколько ссылок на stackoverflow, где утверждается обратное:
Скорее всего, как обычно, поведение очень сильно зависит от конкретного устройства и версии ОС. Для меня невозможность получить данные от сокета в режиме сна без WakeLock'а выглядит абсолютно логично — процессор в режиме сна просто прекращает обработку процесса вашего приложения, а без доступного процессорного времени как понять что на сокет что-то прилетело?
Согласен, жесть, но во многих ситуациях иначе никак. Знаете ли вы, например, что поддержка карт памяти появилась в Android SDK только в API 4.4 (KitKat)? Все приложения, поддерживающие более ранние версии операционки используют хаки и костыли чтобы понять по какому пути смонтирована карта памяти, ведь каждый вендор монтирует куда ему вздумается. Как у разработчика, у тебя есть выбор: либо писать хаки и костыли и потом страдать от последствий ради того, чтобы предоставить пользователю функционал, который он хочет, либо мягко послать его в пеший эротический тур, сославшись на «извините, злой Google не даёт нам так делать». Во втором случае, вам, мягко говоря, не поверят, ведь всегда найдётся кто-то, кто не постесняется накидать хаков и костылей ради функционала и тогда пользователи справедливо возразят — «Но у Васьки то работает». И после этого попробуйте втолковать людям что так делать нехорошо. Sad but true.
Только вместе с WakeLock'ом, а это автоматически означает работающий на-полную процессор. Более того, на некоторых устройствах нужно (кто бы сомневался) использовать грязнейший хак, описанный тут — Reception of UDP packets in sleep mode.
Я хоть сам не храплю, но стало интересно как эта штука работает если человек спит на боку или на животе? Или храп появляется только когда на спине спишь?
Не любитель грубить людям даже в комментариях, но что за чушь вы вообще несёте?
Чтобы создать что-то мирового уровня, нужно огромное количество денег. Невозможно снять в фильм в подвале и получить Оскар.
Серьёзно? Вы оцениваете фильмы только по бюджету и количеству полученных наград? Фильмы с бюджетом меньше 10 млн.$ по-умолчанию не могут быть хорошими? «Безумный Макс», «Карты, деньги, два ствола», «Ночь живых мертвецов» — плохие фильмы? Актёров также оцениваете? Ставший уже меметичным Леонардо ДиКаприо, который так и не получил ни одного Оскара — плохой актёр? Музыка, не собирающая миллионные стадионы — 100% плохая? Что это за фееричный бред оценивать то, что с давних пор привыкли называть искусством в сухих цифрах?
Поставьте себя на место музыкантов, писателей, и т.д.
Поставил. Возьмём к примеру музыкантов. Верхушку шоу-бизнеса. Для простоты представим, что в нынешней ситуации 100% их песен пиратятся. Однако, если верить нашим «гламурным» передачам, их доходов вполне хватает, чтобы купить себе собственный остров в тихом океане, а на сдачу новый феррари. И этим людям мало, им нужен второй остров, поэтому они всеми силами будут стараться выдоить из населения каждую причитающуюся им копейку. Наплевав на здравый смысл, собирают дань с продажи устройств, на которые теоретически можно записать пиратские копии их интеллектуального «труда», банят видео со звуками природы за нарушение авторских прав, запрещают мысленное проигрывание «произведения»… Ой, это я, кажется, в будущее заглянул, простите.
Здесь вроде никто не утверждает, что у автора не должно быть возможности заработать на своём труде, отвращение вызывают исключительно методы. Цензура, безумные запреты, «налоги на воздух» и далее по списку. При этом для вас, потребителя данного вида товара, до сих пор не существует законов, гарантирующих вам хотя бы право на возврат денежных средств за некачественный товар. Купили вы новый альбом любимого исполнителя, а он там пердит в микрофон в 10 трэках — какая жалость, послушать заранее нельзя.
Никто не утверждал обратного. Предложение игнорировать ведь связано не с тем, что книги исключительно плохие, а с варварскими методами борьбы с неугодными. Закрывать весь ресурс пожизненно за наличие на нём нелегального контента — это примерно как сажать пожизненно всю семью за мелкую кражу, совершённую несовершеннолетним ребёнком. Тем более рутрэкер даже https не использовал.
Ну вот у меня и дома и на работе винда, для меня оно тоже бесполезно? Если вы своим комментарием имели ввиду «бесполезно для меня лично», то могу лишь сказать — держите нас в курсе. Минусы я полагаю не за слово linux, не обольщайтесь, а за категоричное высказывание про «бесполезность» софта.
Согласен с r_ii за тем лишь исключением, что неплохо было бы всё таки объяснить, почему же решение является ужасным. Использовать в данном случае AsyncTask — это всё равно, что стрелять из пушки по воробьям. Данный класс предназначен для выполнения кода в другом потоке. Все методы класса, кроме doInBackground(Params...), выполняются в главном потоке приложения. В вашем AsyncTask'е, единственное, что выполняется в рабочем потоке — его остановка на 1 секунду для последующего отложенного выполнения кода в основном потоке — нерационально. Обратите внимание на класс Handler, который используется авторами приложения для отложенного завершения работы сервиса.
There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.
Ну еще добавить изменение padding у LineraLayout. И будет совсем точь в точь)
Воооот, я как раз надеялся, что вы подскажете как это сделать с использованием данного фреймворка.
Конечно, если потребуется более сложное поведение, то без customviewgroup не обойтись.
Тут дело скорее не в ViewGroup, как я уже отвечал выше, в данном конкретном случае всё то же самое можно сделать с помощью обычного FrameLayout, даже практически onMeasure и onLayout переписывать не придётся. Это уже я заморочился с прицелом на более сложное расположение элементов в будущем.
Но вы умолчали о самом интересном — как именно вы заставляете EditText «разъезжаться» по всей ширине контейнера?
PS: возможно вы просто не заметили на видео — изначально ширина и высота EditText'а меньше родительского контейнера. Когда он получает фокус — он не только уезжает своей правой границей на место исчезнувшей кнопки, он занимает собой весь родительский контейнер.
Кажется, вы не совсем верно понимаете процедуру размещения элементов. Сама по себе вьюха не имеет возможности разместить себя внутри контейнера, она только может намекнуть ему, что хочет расположиться вот здесь и иметь вот такой размер. А в обязанности контейнера входит задать вьюхе размер в соответствии с запрошенным (или просто по своему усмотрению), вычислить координаты для её размещения и сказать этой вьюхе «теперь ты имеешь вот такой размер и расположена вот по таким координатам». Другими словами, чтобы на самом деле изменить размер любого компонента, нужно заново выполнить measure+layout+draw на его контейнере. Вот материал на эту тему — How Android draws views.
не было бы проще одновременно менять padding и margin у вьюхи URL'а?
Было бы проще, но тогда на каждый шаг анимации приходилось бы по вызову onMargin+onLayout, что, на мой взгляд, не оптимально.
ps: в чем сакральный смысл наследоваться от ViewGroup, а не RelativeLayout? все эти onMeasure и тд.
В данном конкретном случае исключительно в том, чтобы иметь полный контроль над тем, как дочерние вьюхи измеряются и располагаются. В принципе, я бы мог реализовать всё тоже самое с использованием FrameLayout не потеряв в производительности. Но это только потому, что разметка достаточно простая. Чем сложнее разметка, тем ощутимей выгода от использования таких вот ViewGroup. Я как раз собираюсь перевести замечательную статью по этому поводу как только смогу достучаться до автора. Пока можете самостоятельно ознакомится с оригиналом.
Кстати, почему вы упомянули именно RelativeLayout?
Не факт. В любом случае тут всё упирается в необходимость запросить у пользователя разрешение на администрирование устройства для вашего приложения. С большой долей вероятности пользователь просто удалит приложение за такую наглость.
Скорее всего, как обычно, поведение очень сильно зависит от конкретного устройства и версии ОС. Для меня невозможность получить данные от сокета в режиме сна без WakeLock'а выглядит абсолютно логично — процессор в режиме сна просто прекращает обработку процесса вашего приложения, а без доступного процессорного времени как понять что на сокет что-то прилетело?
Серьёзно? Вы оцениваете фильмы только по бюджету и количеству полученных наград? Фильмы с бюджетом меньше 10 млн.$ по-умолчанию не могут быть хорошими? «Безумный Макс», «Карты, деньги, два ствола», «Ночь живых мертвецов» — плохие фильмы? Актёров также оцениваете? Ставший уже меметичным Леонардо ДиКаприо, который так и не получил ни одного Оскара — плохой актёр? Музыка, не собирающая миллионные стадионы — 100% плохая? Что это за фееричный бред оценивать то, что с давних пор привыкли называть искусством в сухих цифрах?
Поставил. Возьмём к примеру музыкантов. Верхушку шоу-бизнеса. Для простоты представим, что в нынешней ситуации 100% их песен пиратятся. Однако, если верить нашим «гламурным» передачам, их доходов вполне хватает, чтобы купить себе собственный остров в тихом океане, а на сдачу новый феррари. И этим людям мало, им нужен второй остров, поэтому они всеми силами будут стараться выдоить из населения каждую причитающуюся им копейку. Наплевав на здравый смысл, собирают дань с продажи устройств, на которые теоретически можно записать пиратские копии их интеллектуального «труда», банят видео со звуками природы за нарушение авторских прав, запрещают мысленное проигрывание «произведения»… Ой, это я, кажется, в будущее заглянул, простите.
Здесь вроде никто не утверждает, что у автора не должно быть возможности заработать на своём труде, отвращение вызывают исключительно методы. Цензура, безумные запреты, «налоги на воздух» и далее по списку. При этом для вас, потребителя данного вида товара, до сих пор не существует законов, гарантирующих вам хотя бы право на возврат денежных средств за некачественный товар. Купили вы новый альбом любимого исполнителя, а он там пердит в микрофон в 10 трэках — какая жалость, послушать заранее нельзя.
Вам понадобятся методы postDelayed(java.lang.Runnable, long) и removeCallbacks(java.lang.Runnable).
Тут дело скорее не в ViewGroup, как я уже отвечал выше, в данном конкретном случае всё то же самое можно сделать с помощью обычного FrameLayout, даже практически onMeasure и onLayout переписывать не придётся. Это уже я заморочился с прицелом на более сложное расположение элементов в будущем.
И эффект выходит немного другой
Однако для простых анимаций, конечно, гораздо удобней и быстрее пользоваться именно LayoutTransitions.
Допустим, компоненты отресайзились и мы получили следующее:
Теперь при получении фокуса мы скрываем кнопку. При вашем подходе EditText расползётся вправо на место пропавшей кнопки, то есть станет 380x40px.
Моя же задача — сделать так, чтобы он стал по размеру родительского контейнера — 400x60px, хотя-бы визуально.
PS: возможно вы просто не заметили на видео — изначально ширина и высота EditText'а меньше родительского контейнера. Когда он получает фокус — он не только уезжает своей правой границей на место исчезнувшей кнопки, он занимает собой весь родительский контейнер.
В данном конкретном случае исключительно в том, чтобы иметь полный контроль над тем, как дочерние вьюхи измеряются и располагаются. В принципе, я бы мог реализовать всё тоже самое с использованием FrameLayout не потеряв в производительности. Но это только потому, что разметка достаточно простая. Чем сложнее разметка, тем ощутимей выгода от использования таких вот ViewGroup. Я как раз собираюсь перевести замечательную статью по этому поводу как только смогу достучаться до автора. Пока можете самостоятельно ознакомится с оригиналом.
Кстати, почему вы упомянули именно RelativeLayout?