• Как сделать сервис который будет запускаться каждую минуту и отправлять координаты в Firebase?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Я не буду досконально описывать. Слова, которые надо гуглить:
    AlarmManager
    BroadcastReceiver, WakefulBroadcastReceiver
    Service, IntentService
    Doze mode
    Ответ написан
    Комментировать
  • Платное приложение предоставить пользователю бесплатно?

    @onepavel
    Консультация и разработка мобильных приложений
    Это называется промо коды
    https://support.google.com/googleplay/android-deve...
    Ответ написан
    Комментировать
  • Хорошо ли работают PUSH уведомления в Firebase?

    @Fixid
    GCM/FCM нативны для андроид, свой сервер жрет батарею при неаккуратном использовании.
    FCM работает примерно так же как и GCM в плане скорости
    На девайсе который не ограничивает фоновые соединения нет задержек в доставке, максимум 3-4 сек при плохом интернете
    Ответ написан
    Комментировать
  • Зачем нужен Dependency Injection в Android разработке?

    artemgapchenko
    @artemgapchenko
    Начать неплохо бы с понимания того, что такое DI. Обратимся к википедии:

    Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту.

    Если выражаться не канцеляритом, а обычным русским языком, то DI - это когда вы своему компоненту (например, классу) предоставляете нужные для него зависимости извне, а не создаете их сами в конструкторе, или через инициализацию в месте объявления поля. То есть не так:

    public class Api {
    	....
    	private final HttpClient client = new OkClient();
    }

    А, например, так:

    public class Api {
    	....
    	private final HttpClient client;
    
    	public Api(@NonNull HttpClient client) {
    		this.client = client;
    	}
    }


    И что нам это даёт?

    Ну, очевидно, нам теперь проще менять зависимости. Нужна вам другая реализация абстрактного класса HttpClient - взяли, и передали её через конструктор, или через метод-setter. В случае с первым куском кода, вам пришлось бы ещё и класс Api переписывать, что в случаях, отличных от тривиальных, может привести к ошибкам. Получается, что ваш класс теперь закрыт от изменений (смотрим Open/Closed Principle).

    Окей, а на практике-то какие бенефиты?

    Во-первых, вы теперь можете написать инициализацию вашей программы через конфигурационные файлы. Скажем, на старте будет читаться простенький текстовый файл, который определяет, какой httpclient использовать, какие настройки доступа к бд применять и так далее, и, исходя из этого, будут определяться зависимости.
    Во-вторых, вам теперь существенно проще писать тесты. Написали вы, скажем, какой-нибудь парсер, который принимает InputStream, содержащий в себе данные json-объекта, как-то хитро его парсит, и выдаёт вам объект вашей бизнес-модели. В приложении этот парсер будет принимать на вход реализацию InputStream'а, которая берёт данные из сети, а в тестах - реализацию, которая просто читает файл с диска (потому что тесты должны выполняться часто и быстро, и ваша задача в тесте - протестировать ваш парсер, а не скорость сетевого соединения).

    Вот, в общем-то, и всё. А Dagger - это просто библиотека, которая автоматизирует ручное внедрение зависимостей, равно как и другие DI-библиотеки.

    P.S. В некоторых случаях чрезмерное увлечение DI может привести к нежелательным эффектам, вроде чрезмерного усложнения кода, поэтому внедряйте аккуратно. Понимание приходит с опытом.
    Ответ написан
    Комментировать
  • Штатные программисты или аутсорсинг?

    По своему опыту работы как на аутсорсе так и в штате могу сказать следующее:
    аутсорсеры могут легко и внезапно свалить из проекта, часто не говоря ни слова
    могут откровенно халтурить (писать говнокод например), так как нет менеджеров/начальника стоящих за спиной
    могут работать ночью в полусонном состоянии, так как днем жена и дети мешают работать
    и много чего еще. Хорошего аутсорсера найти легко, но он будет стоить гораздо дороже.
    UPD: для остальных членов команды это означает следующее:
    - сплошной и вездесущий говнокод
    - отсутствие единого стиля программирования
    - долгое вникание в исходный код
    А в общем это называется бардак.
    Ответ написан
    1 комментарий
  • Штатные программисты или аутсорсинг?

    @evikbook
    DevOps
    У меня в компании есть опыт работы с штатными и оутсорсерами. Раздолбаи есть везде. Все зависит от человека и как построите рабочие процессы (постановка задачи, контроль временных ресурсов и тп). Поэтому первый мой совет "Посмотрите, что проще Вам будет контролировать: удаленного или штатного". Мы в итоге выбрали путь "штатный удаленный сотрудник". Так как продукты у нас сложные и иногда месяца мала, чтобы въехать во все процессы. Тут преимущества в том, что если Вы в Москве, то можно найти хорошего компетентного коллегу за умеренную зп. Плюс не требуется разжевывания задачи или детального тз, человек в теме и по названию тикета уже понимает 80% всех работ. Да, через 3-4 месяца с удаленным сотрудником мы стали общаться практический только через тикетную систему. Что с оутсорсерами выглядит мало вероятным (если они будут часто меняться) Так-же оутсорсер на Вас "жениться не обязан", то есть он и другими проектами может заниматься и быть в них погружен больше чем в Ваши проблемы.
    Ответ написан
    Комментировать
  • Как вставить необычный фрагмент во ViewPager?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Можно сделать так:
    Некий интерфейс:
    interface Item {
        Fragment getFragment()
    }

    и две его реализации:
    class StepItemImpl implements Item {
        private StepsMenuItem data;
        StepItemImpl(StepsMenuItem data) {
            this.data = data;
        }
        @Override
        public Fragment getFragment() {
            return StepFragment.newInstance(data.getFileName());
        }
    }
    
    class WhatNextImpl implements Item {
        @Override
        public Fragment getFragment() {
            return WhatNextFragment.newInstance(...);
        }
    }


    далее, вы оборачиваете в эти класс свои данные и у вас получается список:
    List<Item> mItems;
    ...
        @Override
        public Fragment getItem(int position) {
            return mItems.get(position).getFragment();
        }
    ...
        @Override
        public int getCount() {
            return mItems.size()+1;
        }
    /code>
    Как-то так.
    Ответ написан
    Комментировать
  • Как поддерживать две версии приложения (платная и бесплатная)?

    @Tiberal
    Одна ветка, но разные product flavors в билде. Изменяете какие то куски кода для разных флейворов. Так можно в одном проекте поддерживать и демо и платную версию
    developer.android.com/intl/ru/tools/building/confi...
    тут расписано все
    Ответ написан
    4 комментария
  • Почему люди не нажимают на рекламу?

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

    Попробуйте перевести свою кампанию от денег за переходы к деньгам за показы, и это (возможно) будет гораздо эффективнее.
    Ответ написан
    1 комментарий
  • Как лучше разбивать классы Android-проекта?

    Махач Имангазалиев , вы бы воспользовались поиском на форуме для начала. Совсем недавно задавался подобный вопрос. Вот пример моей структуры в простом проекте:
    ru.mycompany.myapp
    ├─ activities
    ├─data
       └─  dao
    ├─views
       ├─ adapters
       ├─ customview
       ├─ fragments
       └─ widgets
    ├─ network
       └─api
         └─responce
    ├─ models
    └─utils
    Ответ написан
    1 комментарий
  • * Restarting nginx nginx [fail]. Где смотреть логи?

    alexclear
    @alexclear
    A cat
    Сделайте для начала nginx -t - это тест конфига, он покажет ошибки
    А логи смотрите в /var/log/nginx/error.log, обычно они там
    Ответ написан
    Комментировать