Конференція Highload fwdays'19 — Autoscale, MySQL 8.0, Neo4j, Kafka and AWS Lambda | 05.10 | Київ
×Закрыть

Разработка под Android

Интересует как складывается ситуация у нас в Украине в этом сегменте. (больше интересует Харьков)

Много всего пишут в инете на эту тему. Одни пишут, что перспективно, другие наоборот.

В данном топике хотелось бы узнать от людей, _занимающихся_ в данном направлении примерно следующее:
— насколько просто/сложно начать писать под андроид,
— реально ли после пары месяцев освоения начать работать,
— приблизительный уровень зп,


Пожалуйста, БФ.

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
А вот с такой хренью никто не сталкивался? Создаем в IDEA community edition новый проект, package name у него по умолчанию com.example Пытаюсь изменить при рефакторинге на типа com.xxx.appname — а он сообщает, типа package name не может таким быть (после example считает за ошибку). Ну, думаю, ладно. Запускаю дебажить — а получаю ошибку, мол, активити com.example/com.xxx.appname не найдено :( Смотрю workspace.xml — а там моя активити указана как com.xxx.appname.myactivity. Ничего другого не нашел, как руками исправить в файле Блокнотом, после загружаю снова проект — и ошибка, что-то вроде content не может быть in prolog. Смотрю workspace.xml в HEX, и наблюдаю появившийся мусор (от блокнота?) несколько левых байт перед началом знак_меньше?xml (оппа — в комент нельзя вставить этот символ и вопросительный знак?)
Перегружаю проект — все загрузилось, package name остался com.example. Просто под Эклипсом с таким не сталкивался :)

КТо может подсказать, как задать package name такого типа?

Смотрю workspace.xml в HEX, и наблюдаю появившийся мусор (от блокнота?) несколько левых байт

Решил проблему: idea не читает UTF-8 signature. А стандартный notepad.exe его генерит. Вот этот баг — youtrack.jetbrains.net/...ssue/IDEA-27063 а вот решение: virgo47.wordpress.com/...m-and-notepad2 (хрень, конечно :)

А кто из гуру может подсказать, что лучше: если мне нужно через интент передать данные в пределах приложения (тупо в соотв. броадкаст ресивер) — че лучше использовать: прописывать ключ\значение все в интенте через putExtra, или создать parcellable класс-хранитель, а его уже впихнуть в интент? parcelable — он для IPC был задуман, или чтоб избежать гемора с фантазированием имен ключей?

я не гуру но голосую за

parcelable

. Хотя надо посмотреть что за объект. Если 2 поля — то можно и так обойтись.

Можно сделать проще — объявить ваш объект как Serializable и запихивать его в extras интента. И извлекать соответственно

Ооо... Так а вроде Parcelable — это спецом рекомендуют использовать вместо Serializable, чтоб уменьшить накладные расходы на высериализацию / десереализацию ...

Нуда, но для поэкспериментировать-попрототипировать можно сначала и Serializable-модель опробовать, а потом уж и Parcelable. Вдруг окажется, что вполне достаточно двух-трех простых параметров в интенте...

Так меня мучает вопрос именно универсальности решения! А то по-привычке начал сразу писать константы ключей, а потом оппа — вспомнил про parcelable. И вот сижу и думаю — с parcelable все сработало, только полчаса времени потерял, можно было и не заморачиваться на 4 ключа, а с другой стороны — а не моветон ли это? Или это — обсуждение какой молоток лучше-железный или чугунный? Хотя... Все молотки делаются для определенных целей

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

Цю задачу насправді треба розбити на дві підзадачі.

1) Спочатку визначіться з тим яка абстракція краще моделює ваші дані. Попросту кажучи, чи доцільно ці дані представляти як екземпляр якогось custom класу який в собі інкапсулює всю потрібну інформацію. Якщо ці дані не є сутністю яку «хочеться» оформити за допомогою класу, тоді краще обійтися парами ключ/значення. Тобто тут треба відштовхуватися від самих даних (того чи «варті» вони окремого класу).

2) Якщо ж ви, проаналізувавши ваші дані, все-таки вирішите що для них потрібно створити окремий клас, то в такому разі я думаю що краще використовувати Parcelable. А не Serializable. Так як Parcelable за великим рахунком і був спроектований для задач типу тієї яку ви вирішуєте. Це найбільш природний інструмент зі всіма витікаючими перевагами.

Через parcellable удобнее, хотя если данные простые то первый способ тоже подойдет.

Що значить «удобнее» і «тоже подойдет»?

Якщо мої дані — це екземпляр мого custom класу, то які в мене ще альтернативи крім роблення цього класу Parcelable?
Якщо ж мої дані — екземпляри вбудованих примітивних або вже Parcelable типів, то які в мене ще альтернативи крім пар ключ/значення?

Чи ви хочете сказати, що просто впадло впихувати і випихувати якісь конкретні пари ключ/значення і краще створити для них всіх окремий клас? Ну так якщо цих пар дуже багато або якщо вони впихуються й випихуються в багатьох місцях, то це швидше за все показник того що вони вже давно повинні були знаходитися в окремому класі. І не тому що так їх буде легше передавати, а тому що саме така абстракція є для них правильною моделлю.

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

Хм...

Ось тут наприклад є деякі аргументи за Parcelable і проти глобального стану:

stackoverflow.com/...tatic-variables

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

Если хотите задачку на эту тему (использую на интервью) — есть Activity, у нее есть AsynchTask который допустим делает операцию занимающу около 5 секунд (и нигде за предемами активити не нужную, например он создает новый комент на доу :) ), Во время его работы происходит смена ориентация экрана (убивается старая->создается новая активити). И как это нормально обработать? Эта задача тоже сводится к передачи обьектов между активити, но как вы это сделаете?

смена ориентация экрана (убивается старая->создается новая активити)

Так я бы ответил, что это — провтык в манифесте :) Помнится, если в манифест добавить android:configChanges="orientation", то активити не будет убиваться, и мы не будем заморачиваться с восстановлением состояний. оверрайдим onConfigurationChanged и узнаем, какие конфигурации, из перечисленных в аттрибуте изменились, ну и обрабатываем соотв. UI. Или я завалил интервью? :)

а как ты

onConfigurationChanged

обработаеш? если иконки и лейауты разные? Слишком сложно получится.

обработаеш? если иконки и лейауты разные? Слишком сложно получится.

At the time this method is called, your activity’s Resources object is updated to return resources based on the new configuration, so you can easily reset elements of your UI without the system restarting your activity.

Та вроде не слишком сложно. Вы ведь в xml описании лэйаута не указываете значения в абсолютных величинах? Скажем, FillParent и так растянется что в портретной, что в альбомной ориентации. А RelativeLayout вообще все по боку, потому что позиционируется относительно чего-то. Лично мне больше нравится способ указания в манифесте атрибута android:screenOrientation, т.е. жестко захардкодить ориентацию экрана :)

Или вы имели ввиду перед убийством активити послать PendingIntent с данными из предыдущего состояния, а при пересоздании активити его впоймать?

возможно вы меня не поняли, допустим мы пишем клиент для форума, он посылает сообщение в фомум в отдельном потоке используя AsyncTask, в момент отсылки происходит смена ориентации экрана. И как вы предлагаете передать AsyncTask между старой и новой активитями? В парселебл тоже не засунеш.
Вариант запретить такое поведение — а зачем? тогда нужно будут лайауты править вручную, а представте что оне не идентичны по контролам — напримем в лендскейпе ще показывается дополнительня панелька сбоку. Зачем это если можно просто держать разные файлы в layout & layout-land?

Вообщем если прогама не используею фрагменты, то описание от «гуру» здесь commonsware.com/...n-rotation.html

а в более новых версиях, и в случае FragmentActivity — onRetainNonConfigurationInstance уже депрекейтед и самый простой способ глобальный SparceArray + передавать индекс обьекта в нем через интент.

Большое человеческое спасибо за инфу про overheat и использование индекса в интенте :)

Вариант запретить такое поведение — а зачем?

Мне кажется, не всегда оно и нужно, чтобы лэйаут подстраивался под текущий угол поворота экрана (на микрософтовских мобильных ОС до семерки этого не было, и никто как-бы не жаловался). Автоматом ведь он не запоминает значения в интерфейсе, прийдется сохранять каждый, и восстанавливать, и теоретически можно сделать баг. Самостоятельно система ведь не может сохранить/восстановить значения каждого элемента? Энгры Бёрдс как бы тоже лэйаут не меняет :)

Зачем это если можно просто держать разные файлы в layout & layout-land?

Ну так вы их будете и так держать, насколько я понимаю, с одинаковыми именами. Просто, R.layout.somelayout будет указывать или на портретный xml с таким именем, или на альбомный,в зависимости от угла поворота. Ну и если запихнуть в onConfigurationChanged вызов setContentView(R.layout.somelayout) у нас ведь будет меняться лэйаут. Вот чел динамически меняет лэйаут просто вызовом из меню: stackoverflow.com/...7755584#7755584

И как вы предлагаете передать AsyncTask между старой и новой активитями?

Мне чего-то не нравится применять AsyncTask, потому что реально загромождает исходник, а тут напрашивается отдельный слой, а не лепить в активити. А мы можем не использовать AsyncTask, а вынести отправку комента в поток в сервисе? Пока активити убивается/пересоздается — сервис ведь будет работать? А обратную связь с сервисом (типа прогресс выполнения, если он конечно нужен для комента) сделать через броадкаст. Мне кажется, это было бы лучше.

В деяких випадках концептуально неправильно використовувати сервіс замість AsyncTask. Як на мене, не можна просто так взяти й використати сервіс просто тому, що так більше подобається. В сервіса й AsyncTask різні ніші. Тому питання про те, а якже правильно використати AsyncTask, є дійсно актуальним.

Большое человеческое спасибо за инфу про overheat и использование индекса в интенте :)

Незачто, часть этой инфы есть в книжках от
commonsware.com/books

Кажется в «The Busy Coders Guide to Advanced Android Development» но только описаный там метод сейчас уже не совсем хорош, вызываемая ф-ция стала depricated (а жаль) и вариант с индексом в интенте подсказали в где-то на форумах. Может в следующих их книжках что-то подбное опишут.

Самостоятельно система ведь не может сохранить/восстановить значения каждого элемента?

Не правильно. Андроид это делает автоматом. Просто создайте примитивную активити с одним едитом (из лейаута), запустити на девайсе, введите текст, потом попробуйте перевернуть экран — активити по умлчанию будет пересоздаватся, но текст в едите останется и дополнительный код для этого писать не нужно :)

введите текст, потом попробуйте перевернуть

В этом случае — да, простые состояния элементов сохранятся и восстановятся, я провтыкал, точно :) А вот недавно делал разноцветную кнопку, у которой в коде меняется background, с изменяющимся текстом, так цвет, увы, не сохранялся. И текст по-моему тоже, если ничего не путаю. Чтоб не заморачиваться — захардкодил ориентацию.

Ні, ви неуважно читали той текст, на який я вказував. Не суть в тому, змінна це чи ні. І у вашому випадку глобальний стан звичайно ж буде. А аргументи проти (не всі, але більшість) підходять ще й як.

Тепер стосовно вашої задачки. Скажу так, що я ще не випрацював для себе канонічну стратегію поведінки в даній ситуації. Але це в мене на порядку денному. Як би там не було, я думаю, цією задачею ви ставите правильне питання. Хоча тема ця специфічна, і вона значно вужча ніж тема передавання даних в activity загалом. Деякі люди взагалі говорять що ідея перестворення activity при зміні конфігурації є невдалим архітектурним рішенням команди розробників Android.

Ні, ви не уважно читали той текст, на який я вказував. Не суть в тому, змінна це чи ні. І у вашому випадку глобальний стан звичайно ж буде.

Нет его там. Есть масив, он глобальный, а в нем лежать ЛОКАЛЬНЫЕ обьекты, которые привязаны к конкретной активити через индекс, при пересоздании активити просто передается этот индекс (тоесть подразумевается что фактически передается внутренее состояние ), фактически это позволяет иметь без проблем несколько экземпляров одной активити. Так где здесь “Глобальный Стан”?

хм, вужча? допустим вы хотите передать обьект в котором штук 20 битмапок. Вы действительно думаете что использовать сериализацию/десериализацию разработаную для IPC подходящее решение?

Скажу так, що я ще не випрацював для себе канонічну стратегію поведінки в даній ситуації.

Когда придумаете, поделитесь, а я постояно пользуюсь тем, что описал.

Деякі люди взагалі говорять що ідея перестворення activity при зміні конфігурації є невдалим архітектурним рішенням команди розробників Androi

Нормальное решение и легко отключается когда нужно. Ге

Есть масив, он глобальный

А це що по-вашому не варіація на тему глобального стану?

Над рештою подумаю.

нет, не вариация.
Что такое этот «глобальний стан»?

Допустим будет два инстанса одной активити, где у них общий «глобальный стан» в описаном случае? Если вас смущает статическая переменная — можно обойтись без нее — хранить все в Application (что-то вроде псевдокода):

MyApp extents Application{

private SparseArray<object> temporaryObjects;

//add to temporaryObjects and return index

public int storeObject(object){}

//get from temporaryObjects by index

public Object getStoredObject(int){}

}
При перевороте экрана просто вызвать
getApplication.storeObject(...) и передать в екстрасах интента полученый Id.

Этот метод можно использовать и при передачи сложных данных между Activities.

Дивіться, я не кажу що те що ви пропонуєте є поганим. Я кажу що можливо воно не таке вже й хороше. Тобто воно має свої недоліки (глобальність стану) і відповідно не може бути якоюсь панацеєю. Бо мені здалося що ви подаєте цей спосіб як мало не єдиноправильний у випадку одного процесу, хоча він напевно підходить все-таки для окремих ситуацій. [А глобальність стану полягає в тому що дані які ви хочете передати є глобальними в рамках аплікації а не локальними для activity.]

А в чем конкретно в данном случая проблема с «глобальностью стану»? Вы ее можете описать?
Это не единственно правильный, и даже не самый универсальный. Это просто один из простых способов передачи данных всередине программы. Я его привел как альтернативу использования Parcelable который фактически создает копию ваших данных. А кто-то тут вообще в курсе, каковы лимиты памяти у джавишной програмы на андроиде? :) Даже если памяти у девайса 512мб, то на на большинстве девайсов доступно будет не больше 48мб

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

как выглядит MVC на этой платформе

Зашевелилась тема :)
А как выглядит MVC на этой платформе? Были у меня мысли, что controller нужно реализовывать в Application, и реализовывать логику в нем по возможности, а активити по возможности использовать только для представления данных, а как говорят гуру?

Ну и где место модели? :)

Не знаю як говорять гуру, але в мене стосовно MVC наступна думка. Первинним є розділення view і model. Controller є вторинним.

Зокрема я вважаю що activity — це «товсте» view. Клас який є макетом використовуваних в аплікації даних — це model (тут як і всюди, нічого нового). А от контроллера може й не бути. Хоча якщо в аплікації є всякі сервіси, асинк таски, ресівери, то я розглядаю їх як елементи контроллера.

А в чем конкретно в данном случая проблема с «глобальностью стану»? Вы ее можете описать?

Інформація на цю тему доступна й в інтернеті. Якщо поцікавитеся, легко знайдете. Але я не кажу що глобальність тут є кінцем світу, просто напевно це все-таки недолік (хоча в деяких випадках можливо й оправданий).

Я его привел как альтернативу использования Parcelable

Я думаю що мейнстрімом для виклику activity є саме Parcelable. І якщо хтось буде використовувати описаний вами підхід в тій більшості випадків, де має бути використаний Parcelable, то це буде погано. Тобто наголос саме на цій ідеї.

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

Це обговорення почалося з першого поста в якому звучало питання. Я особисто був трохи не згідний з постановкою питання. Бо постановка підрозумівала те що групу величин можна об’єднати в клас тільки для того щоб їх було легше передавати. Тоді як я кажу що те об’єднані величини в клас чи не об’єднані за великим рахунком не є НАСЛІДКОМ того чи вони кудись передаються. Об’єднання/необ’єднання величин в клас є по суті фундаментальним рішеням (ПРИЧИНОЮ) без якого взагалі не можливе існування правильної моделі даних в аплікації. (А розмова про все решта — то вже потім...)

А в чем конкретно в данном случая проблема с «глобальностью стану»? Вы ее можете описать?

Багато чого наведено тут c2.com/...VariablesAreBad

Від себе додам ще таку річ. Давайте абстрагуємося і проведемо деяку паралель. Виклик activity замінимо на виклик метода, а передачу даних в activity — на передачу даних в метод.

Тоді варіант з Parcelable перетворився б на щось таке (Варіант 1):
void doSomething(Type argPassedByValue) {
...

}

А ваш варіант із SparseArray перетворився б на таке (Варіант 2):
void doSomething() {
Type argPassedByReferenceValue = Global.Get();
...

}

Цей другий варіант звичайно можна було б покращити, явно виразивши залежність в сигнатурі методу (Варіант 3):
void doSomething(Type argPassedByReferenceValue) {
...

}

АЛЕ це покращення можливе тільки в нашому спрощеному прикладі, бо тут ми оперуємо звичайним методом. У випадку ж з activity ми не можемо собі такого дозволити і залишаємося з гіршим варіантом — Варіантом 2. Але ми повинні розуміти що це дійсно нехороший варіант. І якщо нам тим не менше треба до нього прибігати, то значить ми свідомо йдемо на певні жертви. Хоча ці жертви можливо й оправдані (бо інакше ми просто не розв’язжемо поставлену задачу).

Багато чого наведено тут c2.com/...VariablesAreBad

Non-locality -
No Access Control or Constraint Checking.
Concurrency issues
Namespace pollution
Memory allocation issues
Testing and Confinement
И? Вы читали этот список? Он вообще не имеет отношения к нашей ситуации, все пункты из него в случае джавы андроида и передачи данных между активитями НЕ АКТУАЛЬНЫ, особено в случае описаного мной способа

Нельзя брать за константку «статически переменных плохо» если не можете обьяснить чем они плохи. Все эти «плохо» были выведены опытом, но этот опыт полученый в разработке под с/с++ не всегдя релевантен к джава разработке. И по факту имеем, что ни один из пунктов из списка не подходит.

и передать в екстрасах интента полученый Id.

Кстати, а перед убийством активити будет вызываться onSavedInstanceState ? Нет в данный момент среды разработки под рукой, чтоб отдебажить :( Просто, ничего плохого не будет ли, если индекс массива поместить в bundle, прооверрайдив этот метод, а потом при создании новой активити — в методе onCreate мы этот индекс считаем?

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

Не стоит выполнять сетевые операции в контексте активити, создавайте для этого Сервис. IntentService оч четко подходит как раз для этого.

Кроме переворота может входящий звонок прийти, та и много чего другого.

есть четкое видео с google io 2010

А никто не в курсе, как дела у Гугла с Ораклом по поводу лицензий java в Андроиде? Без троллинга, мне интересно что будет если Оракл все же выиграет этот патентный бой?

Тяжба тянется. Самый справедливый суд в мире www.kommersant.ua/news/1840985 достаточно непредсказуем.

Ораклу выгоднее дружить с гуглом, отжав немного денег, которые пошли на покупку Sun, и которые Гугл пожмотился отстегнуть-купить Sun , и не иметь проблем. (5 миллиардов — ёлыпалы, за Sun).

судятся, если интересны детали — читать фостпатенты

fosspatents.blogspot.com/...ch/label/Dalvik

что будет если Оракл все же выиграет этот патентный бой?

Делов то — будем писать натив код, используя NDK :)

Врядли тут будут серьезные проблемы. Просто Oracle денег решил поднять. Давить Android, который качает JVM им скорее всего нет смысла .

Oracle отозвал лицензии на JDK из Debian/Ubuntu — тоже никакого смысла это делать не было. Проблема то решается самостоятельной установкой JDK, но чем это не прецедент на то, что у Oracle свой взгялд на развитие и распространение Java?

это сц%%ки достали уже своими «лицензиями». Последний раз ставил на виртуалку с убунтой — из репозитария ставится только openjdk совместимость с которым никто не гарантирует(и по слухам у ентерпрайз разработчиков проблемы регулярно вылазят). Пришлось искать в чем проблема и как поставить из альтарнативных месть.

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

Но на данный момент на линукс сервере с openjdk6 андроид приложения собираются.

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

Вот как то так.

Гугел чекаут на эту тему говорил, что по своему соображению может потребовать при валидации TaxID, номер водительских прав и т.д. При этом естественно все всплывет, и они отрежут яйца прекратят с тобой сотрудничать. ИМХО, не стОит себя выдавать за американского гражданина.

Еще один вопрос.
правильно ли я понимаю, что если я регистрируюсь Google как разработчик из Украины, то могу выкладывать игры/программы только в категорию бесплатные?

И эти игры/программы будут доступны для всех стран?

Кто то знает. как обойти ограничение на размещение платных приложение из «неподдерживаемых» стран?
Вот например сейчас нельзя из Украины размещать платные приложения доступные для скачивания в США.

Варианты найти себе партнера из числа «поддерживаемых» стран, или воспользоваться услугами паблишера — уже знаю. Интересует именно как из Украины собственными силами разместить платное приложение в андроид маркете. Есть ли какой то воркэраун?

Есть воркэраунд — fortumo.com.ua

Регишься и получаешь библиотеки для монетизации по СМС

могу помочь с паблишингом при минимальных потерях бабла.

Это интересно. Как можешь помочь? Сколько потери?

Ищем программистов под Android, готовых переехать в Канаду.
Минимальные требования: Опыт разработки программных продуктов от 5 лет (С++ под Linux желательно), минимальный опыт с Android, английский на рабочем уровне (могу писать, говорить, понимать). С разрешением на работу, визами, переездом компания работодатель помогает успешным кандидатам.
В ближайшее время представитель компании будет проводить собеседования в Киеве.
Если есть заинтересованность: zymnyao@talgroup.net

p.s. ЗП достаточная для достойного проживания в Торонто.

А Эклипс продолжает херить xml layout’ы, и в упор не видит DTD для menu :(

IDEA 10 CE — бесплатна, и хорошо допилена под Андроид.

Там нет DDMS и прочих Эклипсовых прелестей, однако.

IDEA 11 — ТО ЧТО НАДО, спасибо, чувак!

эге-ж)) они апдейтнулись,

удачи!

не замечал. разве что при изменение типа контрола, иногда бывал неожиданный эфект, но легко исправляется руками. А что с дтд для меню? сморю проект — там даже ворнингов на менюшку не пишет.

Может, после включения фолдинга появился такой эффект, но эффект — довольно неприятный: тупо пропадает строчка. А потом — появляется. А потом снова пропадает. Ужас. Соотв., xml становится невалидным. На моей версии у меня стабильно воспроизводится, на последнем апдейте Эклипса Галилео. А с DTD — так он не то, что не пишет ворнингов — у него не срабатывают выпадающие списки вариантов. А также, попробуйте в Эклипсе форматнуть XML (CTRL — Shift — F) и вы увидите, какая получается каша.
В общем, Idea все решила. Хоть визуального дизайнера лэйаутов у нее нет (оно в принципе и не надо, все руками хорошо набивается, были бы всплывающие варианты, чтобы поначалу ориентироваться в возможностях — по памяти все не упомнишь), но зато в окне визуализации он отображается корректно! Додправил айтемы в стилях — четко визуализация обновилась. Да, и попробуйте в эклипсе режиме дизайна лэйаута поработать с TabHost, TabPage. Не помню подробностей, но у вас выпадет ошибка по поводу ошибки в binary xml файле контрола. С ними нужно работать только кодом, и только на TabActivity :) И календарик, который работает только на третьем андроиде, а при указании второго апи появляется тоже. И тоже падает с ошибкой :)
ИМХО, Idea по удобству очень похожа на вижуал студию :)

А также, попробуйте в Эклипсе форматнуть XML (CTRL — Shift — F) и вы увидите, какая получается каша

У меня тоже в каких то версиях Эклипса были такие проблемы с автоформатированием. Но вот последняя(Indigo) приятно удивила. Очень хорошо и удобно форматирует, читабельно, ровненько, нет никаких нареканий. Так что постоянно пользуюсь Ctrl+Shift+F.

Меня в Эклипсе ужасно раздражает постоянное пропадание коннекта с эмулятором. Часто проблема решается только перезапуском самого Эклипса.

Самсунг набирает джавистов для разработки андроид-приложений. Мин. зарплата — 500$. Это нормальная зарплата для начинающего джуниора с квартирой. =) г.Киев

Скажите, пожалуйста, где можно найти информацию по этому поводу?

в Киевский офис самсунга отправь резюме

у самсы-же вроде своя отдельная байда, — BADA?
или они Андроидом — тоже занимаются.

Поделитесь инфой, плз.

Капитан очевидность сообщает, что самый популярный андроид смартфон самсунг гелакси 2 выпускает самсунг.

так то железо. под него пилят эмбеддеры.

В русский школа я ходилЪ! Эмбеддеры пилят из ZTE или таки в самсунге?

Вов, у меня на столе лежат гэлекси 2 таб и гэлекси 10″
и под них я пишу прикладной софт для нашей русской школы.
Вопрос задан о прикладном программировании а не эмбед.
Киевский Самсунг набирает джава андроидеров для разработки своих приложений?

Вот об этом хотелось бы узнать подробнее.

Вообще то Андроид это не только эмбеддед, но и фреймворк левел, который основательно перепилен самсунгом + апликейшен левел. И, что характерно, у самсунга есть свои апликухи.

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

— насколько просто/сложно начать писать под андроид,

При хорошем знании Кор Джава достаточно просто.

— реально ли после пары месяцев освоения начать работать,

Конечно, реально. Я устроилась джуниором (только со знанием Core Java) в небольшую фирму на маленькую ЗП и осваивала Андроид прямо «без отрыва от производства» — то есть изучала и тут же применяла знания на практике разработки . Через 4 мес сменила работу на более высокооплачиваемую и перспективную.

— приблизительный уровень зп,

Не владею полной информацией, не могу сказать.

наверно, ещё уместен вопрос: насколько интересно?
много проектов по портированию айфон-аппликух и игрушек, — это на любителя.
В продуктовых компаниях набираются тимы для создания андроид-морд к уже давно существующему продукту.
есть проекты с нуля — имхо, это возможность реализоваться.
в целом, как-то динамично .
Есть смысл стремиться, выбор направления нормальный.

З\п для джуна небольшая, а с 2-3 летним опытом на Джаве может чуть больше, х\з.

Влиться достаточно просто, главное внимательно изучить основные элементы системы. Иначе потом будете ронять челюсть, понимаю, сколько всего упустили(говорю по собственному опыту)))

Если есть опыт разработки(а лучше опыт в отрасли мобильных систем), то вполне не сложно устроиться, так как средний уровень не очень высокий — требовать тоже много не должны.

На счет зарплат ничего конкретного сказать, увы, не могу

А вот тут

— At least non-commercial experience working with Android

www.developers.org.ua/...droid-engineer

Ciklum сегондя повесил баннер в компаниях о том что ищет мобильных джава разработчиков с картинкой андроида:
www.developers.org.ua/company-db
Вакансия видимо
Mobile developer/eBuddy.com

С требованиями:

• 3+ years of experience with Java
• Experience with Java on BlackBerry, Android and J2ME
• Experience with client-server based frameworks
• Object-orientated design patterns are your second nature
• Passionate about internet and mobile technologies
• You love writing efficient, artistic code with attention to detail

• English (upper-intermediate)

Вопрос к людям, которые зарабатывают этим на жизнь. Это вообщe реально?
Просто я в данный момент имею стабильную работу, пишу на Java. Но хочется попробовать фриланс вариант работы под мобильные платформы. Есть Android дивайс, базовые знания платформы, опыт в Java. Но как начать зарабатывать на этом? Почитал описания маркета, отзывы людей. Слишком уж много ограничений, муторная система размещения приложений. Многие пишут что работают себе в убыток. Правда ли это?

Есть еще вариант, to be hired. Но для этого ставят зачастую условие «несколько аппов на маркете». Получается замкнутый круг.

Под Android выгодно программировать, фрилансить и аутсорсить, но только не пытаться заработать самостоятельно с продаж своего продукта. При удачном стечении обстоятельств заработаешь вагон опыта (который увеличит размер ЗП) и скопишь на ноутбук за пол года продаж. К сожалению деньги проще заработать (с продаж своего продукта) на iOS a не на Андроиде. Именно «проще» а не «просто»! :)

>> Под Android выгодно программировать, фрилансить и аутсорсить, но только не пытаться заработать самостоятельно с продаж своего продукта

Так и хочется спросить-а на чем тогда зарабатывают те,кто приложения аутсорсят? Илт мы просто чего-то не знаем?

Ага, не пытаться, а отдать это профессионалам вроде вас? :))
А обосновать?

Тут такая штука — во первых смартфоны/планшеты, это устройства потребления контента. Тоесть сама программа на них никого не интересует (за исключением утилит), интересует контент, который предоставляется через программу. А это значит что разработка програмы, у которой контента нет лишена смысла. А контент — это сайт и многое другое. Получается что мобильный клиент это часть большого проекта, который проще сразу сделать под айфон/андроид. А расчитывать на кучу бабла с простой поделки наивно.

Второй полюс — разработка игр, но их тоже имеет смысл делать сразу под 2 платформы.

ишком уж много ограничений, муторная система размещения приложений. Многие пишут что работают себе в убыток. Правда ли это?

В андроид маркете самая демократичная и простая система размещения из всех что есть. И самая быстрая. Попробуй что-то разместить под айфон или симбиан и сравни впечатления. Хз, в убыток себе никто работать не станет. Но заработать ощутимую сумму действительно проще заказной разработкой, чем размещая платные приложения (особено учитывая что в Украину они деньги не выводят, хотя в РФ это уже возможно) или размещая рекламу в бесплатных.

Есть еще вариант, to be hired. Но для этого ставят зачастую условие «несколько аппов на маркете». Получается замкнутый круг.

Так напиши пару простых приложений и выложи их для портфолио. В чем тут проблема?

Про IDE — нет, на самом деле ide не требуется

Ага, у нас тут есть пацан, он мерсы одной отвёрткой ремонтирует, Копіпаст — форева.

Про IDE — нет, на самом деле ide не требуется. Можно и в vi все писать или в не-эклипсе все настроить (у меня, например — NetBeans)

ide не требуется. Можно и в vi все писать или в не-эклипсе..... например — NetBeans

Это такая шутка или NetBeans и вообще все , что «не-эклипс» уже не ide?

я разве чему-то противоречу?

или этот ответ здесь по ошибке?

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

да, очевидно недопонимание

зачем этот садо-мазо с вимом или нетбинсом? еще понятно, елибы Idea заточеную для андроида использовали. Еклипса — родная среда разработки, ей и нужно пользоватся.

Раз уж Эклипс упомянули... Вот у меня стоит Eclipse Helios, последние апдейты накатываются автоматом. Только привык к нему и его хоткеям — вчера увидел ужасный баг: тупо скрывает некоторые строки, может, это связано с тем, что у меня включен Folding (аналог разворачивающихся регионов в Студии). Значит, смотрю — переменную я декларировал, А ЕЕ НА ТОМ МЕСТЕ НЕТ!!! Я делаю поиск — он не находит. И НЕТ ошибок при компиляции. Я фигею, и прописываю снова — он мне ругается, что, мол, дублирование. Я присмотрелся на номера строк, которые к счастью у меня выведены — А ТАМ — ТУПО НЕТ НЕКОТОРЫХ НОМЕРОВ СТРОК! Я начинаю от безнадеги удалять пустые места на предыдущей строке (мало ли, может куда закотилась) — и о чудо — появляется искомая строка, появляются сокрытые номера строк. А потом сделал пару раз открытие регионов — пля, опять пропадать начали. Это просто даже не ППЦ, а полный ППЦ. Гуглю — ничего не нахожу. Нахожу лишь туеву хучу багов в багтрекере Эклипса. Ужас.

Или такая херовина: возьмите, и поставьте брекпоинт на декларировании класса (в частности, на классе активити) А потом будете приятно удивлены, что активити при отладке не запускается, а внутри далвика стреляет эксепшн :)

для андроида юзаю две IDE: Идею и Эклипс.
Эклипса сакс, но она содержит родной гугловый плагин (драйвер),
который много чего может. Но навигация в Эклипсе — фу.

Потому кодить приятнее в Идее.

После Вижуал Студии, Эклипс — не просто фу, а даже буэ-эээээээ. Тем не менее,
www.allapplabs.com/...e_shortcuts.htm

Например, для выведения всех референсов всю жизнь нажимал правую мышу + Find all references, а в Жклипсе — это только додуматься: контрол, шифт и G

у меня вообще было сообщение с текстом «null» :) и всё! ещё бы стектрейс мне туда вывели.

хотя, это холивар, конечно. и дело вкуса.

зачем гемор с недописанной эклипсой ? андроид приложения легко собираются как антом так и мейвеном. а у нетбинса с этими вещами уж получше эклипса.

— насколько просто/сложно начать писать под андроид,
Там довольно хорошее Java API, по сравнению с другими мобильными платформами — просто сказка. Я небольшое приложение на Android (tariff-plan-optimizer: www.gradsoft.ua/...mizer_rus.html написал параллельно с осваиванием API где-то за месяц/два, параллельно с основной работой
— реально ли после пары месяцев освоения начать работать,
Да
— приблизительный уровень зп,

Этого не знаю (у меня другое структрирование доходов), мне кажеться на рынке сейчас что-то типа Android Buble, так что сейчас зарплаты должны расти, а потом упасть и стабилизироваться.

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

нету пузыря. если сравнить количество вакансий — под айфон их больше.
И работодатели не замечены в том, чтобы переплачивать за знание андроида.

А вот грамотных програмеров под андроид действительно еще не очень много, нанять сложно

согласен — это не пузырь.
андроид востребован реально.

там, где есть веб морда, прикручивают ещё и андроидальную.
ну и всякоразные игрушки-фигнюшки тоже.

2 Dwarf

Дело в том, что не захватят, потому что их маркет уже завален фигнёй как и у яблочников. Сама идея интернет-базара приводит к снижению планки ПО, и люди отворачиваются от этого запаха

Судя по тому что я видел по их планшетам, скоро они зохавают рынок сей.

можно только кусок логики засунуть в С++

Ну кусок на два метра и есть программа, на джаве за вас все написано

А там вроде ведь нельзя на чистом С++ писать, можно только кусок логики засунуть в С++, но джава тоже должна присутствовать?

на Си там под NDK пишут модули,
там, где требуется пифоманс — транскодеры, sip, итп
посмотри опенсорсный Linphone, xuggle

если интересно.

а вообще Джаву SE надо сильно понимать, чтоб полностью приложение под Андроид создать. ещё TCP, Networking, mutithreading

Если быстрее писать, то джава с еклипсом
если быстрые проги, то С++ с тем же эклипсом

если отвращение к ИДЕ, тогда лучше не андроид

Есть еще такой вопрос: На какой среде разработки остановиться, да и что лучше для разработки под данную платформу? С++ или Java?

alon4ik, если еще есть интерес, и работу по Андроиду не нашел, постучи ко мне в скайп.:)

Обычный фрилансер врядли что-то заработает просто выложив на маркет, тут нужна реклама, связи с операторами, обзоры на специализированных сайтах, имидж разработчика, а маркеты и так засраны всяким трэшем.

И тем не менее, вот как приложению сделать 50 000 загрузок? Его нужно постоянно пиарить? нужно составить правильный промо-текст для маркета, который будет правильно хавать поисковик маркета? Видел дофигища бесплатных приложений, у которых скачка перевалила за 50 000

про j2ee естественно, просто подумалось, что что-то такое еще новенькое и не сильно распробованное. Пока новое — есть шанс занять свою нишу.
Просто в инете много противоречивых высказываний в сторону маркета и вообще...

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

1. кому как., но ничего сложного нету
2. реально. можно и быстрей, на осваивание андроида на базовом уровне у меня ушло 2 недели, паралельно с основной работой, но у меня было опыт работы с другими мобильными платформами.

3. не в курсе про Харьков, но работы под андроид намного меньше чем под j2ee.

Меня как-то заставляли (верней настаивали) писать под Андроид на работе, поэтому могу сказать что:

можно относительно быстро начать и без знаний джавы (но со знаниями другого ЯП и опытом программинга). Тогда 2−4 недели на джаву, и 2−3 недели на Андроид (и на закрепление джавы), в общем через 1−1, 5 месяца можно приступать.

Сам месяц назад начал писать, за этот месяц написал две программы и пишу сейчас игру :) Хотя раньше писал на С++ и С# которые вообще к мобильным платформам не имели отношения.

— просто как два пальца обосцать — с жаба бекграундом можно начать через две недели, без него не советую вообще — 0, 5 — 4 кб зависит от того что вы можете и на кого вы работаете

Подписаться на комментарии