treze ferramentas/frameworks para desenvolvimento android

Post on 27-Jan-2015

325 Views

Category:

Software

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

Palestra sobre treze ferramentas/frameworks para desenvolvimento em Android, realizada no dia 18/09/14, no Senai CTAI em Florianópolis (evento do Grupo de usuários Java de SC - http://www.gujavasc.org).

TRANSCRIPT

Treze ferramentas/frameworks para desenvolvimento Android

AndroidKickstartR

● SaaS útil para criar um novo projeto Android;

AndroidKickstartR

● SaaS útil para criar um novo projeto Android;● Acesse www.androidkickstartr.com...

ActionBar-PullToRefresh

● Framework open-source;

ActionBar-PullToRefresh

● Framework open-source;● Compatível com ActionBar e

ActionBarSherlock;

ActionBar-PullToRefresh

● Framework open-source;● Compatível com ActionBar e

ActionBarSherlock;● Roda no Android API level 14 ou superior

(para API level inferior a 14, utilize a ActionBarCompact);

ActionBar-PullToRefresh

● Framework open-source;● Compatível com ActionBar e

ActionBarSherlock;● Roda no Android API level 14 ou superior

(para API level inferior a 14, utilize a ActionBarCompact);

● Nativo a partir da API 20 (L Preview): SwipeRefreshLayout.

GSon

● Framework open-source da Google;

GSon

● Framework open-source da Google;● Converte objetos Java em uma

representação Json, e vice-versa.

User user = new User();

user.setId(123456);

user.setName("Ricardo Longa");

Gson gson = new Gson();

String json = gson.toJson(user);

User user = gson.fromJson(json, User.class);

SmoothProgressBar

● Framework open-source;

SmoothProgressBar

● Framework open-source;● Permite criar uma barra de progresso mais

suave;

SmoothProgressBar

● Framework open-source;● Permite criar uma barra de progresso mais

suave;● App de exemplo:

https://play.google.com/store/apps/details?id=fr.castorflex.android.smoothprogressbar.sample;

SmoothProgressBar

● Framework open-source;● Permite criar uma barra de progresso mais

suave;● App de exemplo:

https://play.google.com/store/apps/details?id=fr.castorflex.android.smoothprogressbar.sample;

● Yahoo Mail (+50.000.000), Photo Editor by Aviary (+50.000.000), Tinder (+10.000.000), etc.

EventBus

● Framework open-source;

EventBus

● Framework open-source;● Publish/Subscribe model;

EventBus

● Framework open-source;● Publish/Subscribe model;● Simplifica a comunicação entre

componentes (Activities, Fragments, BroadcastReceivers,

Threads, Services);

EventBus

● Framework open-source;● Publish/Subscribe model;● Simplifica a comunicação entre

componentes (Activities, Fragments, BroadcastReceivers,

Threads, Services);● “Menos código, maior qualidade”.

EventBus

● Framework open-source;● Publish/Subscribe model;● Simplifica a comunicação entre

componentes (Activities, Fragments, BroadcastReceivers,

Threads, Services);● “Menos código, maior qualidade”;● Camera360 (+50.000.000), Path (+10.000.000),

Pinterest (+10.000.000), etc.

public class XyzActivity extends Activity {public void onCreate() {

EventBus.getDefault().register(this);}

public void onEvent(ConnectividadeReceiver.ConectividadeAlterada evento) {// Verifico conexão com a internet e notifico usuário...}

public void onPause() {EventBus.getDefault().unregister(this);

}}

public class ConnectividadeReceiver extends BroadcastReceiver {public void onReceive(Context context, Intent intent) {

EventBus.getDefault().post(new ConectividadeAlterada());}

public static class ConectividadeAlterada {// Pode até enviar informações por aqui.

}}

BroadcastReceiver

Activity

Android Asynchronous Http Client

● Framework open-source;

Android Asynchronous Http Client

● Framework open-source;● Encapsula a biblioteca HttpClient da

Apache;

Android Asynchronous Http Client

● Framework open-source;● Encapsula a biblioteca HttpClient da

Apache;● A requisição acontece fora da UI Thread;

Android Asynchronous Http Client

● Framework open-source;● Encapsula a biblioteca HttpClient da

Apache;● A requisição acontece fora da UI Thread;● O callback é executado na UI Thread;

Android Asynchronous Http Client

● Framework open-source;● Encapsula a biblioteca HttpClient da

Apache;● A requisição acontece fora da UI Thread;● O callback é executado na UI Thread;● Pode ser executado em um Service;

Android Asynchronous Http Client

● Framework open-source;● Encapsula a biblioteca HttpClient da

Apache;● A requisição acontece fora da UI Thread;● O callback é executado na UI Thread;● Pode ser executado em um Service;● A biblioteca identifica automaticamente o

contexto em que foi disparada;

Android Asynchronous Http Client

● Framework open-source;● Encapsula a biblioteca HttpClient da

Apache;● A requisição acontece fora da UI Thread;● O callback é executado na UI Thread;● Pode ser executado em um Service;● A biblioteca identifica automaticamente o

contexto em que foi disparada;● Instagram (+100.000.000), MercadoLibre (+10.000.000),

Duolingo (+10.000.000), etc.

AsyncHttpClient client = new AsyncHttpClient();client.get("http://www.google.com", new AsyncHttpResponseHandler() {

@Override public void onStart() { // called before request is started }

@Override public void onSuccess(int statusCode, Header[] headers, byte[] response) { // called when response HTTP status is "200 OK" }

@Override public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) { // called when response HTTP status is "4XX" (eg. 401, 403, 404) }

@Override public void onRetry(int retryNo) { // called when request is retried

}});

AndroidAnnotations

● Framework open-source;

AndroidAnnotations

● Framework open-source;● Simplifica a codificação (reduz boilerplate);

AndroidAnnotations

● Framework open-source;● Simplifica a codificação (reduz boilerplate);● Facilita a manutenção;

AndroidAnnotations

● Framework open-source;● Simplifica a codificação (reduz boilerplate);● Facilita a manutenção;● Permite a injeção de dependências (views,

resources, system services, etc);

AndroidAnnotations

● Framework open-source;● Simplifica a codificação (reduz boilerplate);● Facilita a manutenção;● Permite a injeção de dependências (views,

resources, system services, etc);● Facilita o trabalho com threads;

AndroidAnnotations

● Event binding, sem mais listeners anônimos;

AndroidAnnotations

● Event binding, sem mais listeners anônimos;● Rest client através da criação de interfaces

(o framework irá implementar as interfaces);

AndroidAnnotations

● Event binding, sem mais listeners anônimos;● Rest client através da criação de interfaces

(o framework irá implementar as interfaces);● Não impacta na performance em runtime;

AndroidAnnotations

● Event binding, sem mais listeners anônimos;● Rest client através da criação de interfaces

(o framework irá implementar as interfaces);● Não impacta na performance em runtime;● Tudo isso com menos de 50kb;

AndroidAnnotations

● Event binding, sem mais listeners anônimos;● Rest client através da criação de interfaces

(o framework irá implementar as interfaces);● Não impacta na performance em runtime;● Tudo isso com menos de 50kb;● Call of Duty (+1.000.000), Magic Piano by Smule

(+10.000.000), etc.

ListView bookmarkList = (ListView) findViewById(R.id.bookmarkList);

@ViewById

ListView bookmarkList;

ListView bookmarkList = (ListView) findViewById(R.id.bookmarkList);

Button buttonOne = (Button) findViewById(R.id.updateBookmarksButton1);buttonOne.setOnClickListener(new OnClickListener() {

public void onClick(View v) { updateBookmarksClicked();}});Button buttonTwo = (Button)

findViewById(R.id.updateBookmarksButton2);buttonTwo.setOnClickListener(new OnClickListener() {public void onClick(View v) {

updateBookmarksClicked();}});

@Click({R.id.updateBookmarksButton1, R.id.updateBookmarksButton2})

void updateBookmarksClicked() {

...

}

Button buttonOne = (Button) findViewById(R.id.updateBookmarksButton1);buttonOne.setOnClickListener(new OnClickListener() {

public void onClick(View v) { updateBookmarksClicked();}});Button buttonTwo = (Button)

findViewById(R.id.updateBookmarksButton2);buttonTwo.setOnClickListener(new OnClickListener() {public void onClick(View v) {

updateBookmarksClicked();}});

void updateBookmarksClicked() {new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId());

}

void updateBookmarksClicked() {new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId());

}

private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}";

void updateBookmarksClicked() {new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId());

}

private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}"; class UpdateBookmarksTask extends AsyncTask<String, Void, Bookmarks> {

}

void updateBookmarksClicked() {new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId());

}

private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}"; class UpdateBookmarksTask extends AsyncTask<String, Void, Bookmarks> {

protected Bookmarks doInBackground(String... params) {// Recebe parâmetros// Cria o RestTemplate// Cria o HttpHeaders// Cria o HttpEntity// Invoca o método exchange// Obtém e retorna o Bookmarks

}

}

void updateBookmarksClicked() {new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId());

}

private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}"; class UpdateBookmarksTask extends AsyncTask<String, Void, Bookmarks> {

protected Bookmarks doInBackground(String... params) {// Recebe parâmetros// Cria o RestTemplate// Cria o HttpHeaders// Cria o HttpEntity// Invoca o método exchange// Obtém e retorna o Bookmarks

}

protected void onPostExecute(Bookmarks result) { // Atualiza a UI Thread

}

}

void updateBookmarksClicked() {new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId());

}

private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}"; class UpdateBookmarksTask extends AsyncTask<String, Void, Bookmarks> {

protected Bookmarks doInBackground(String... params) {// Recebe parâmetros// Cria o RestTemplate// Cria o HttpHeaders// Cria o HttpEntity// Invoca o método exchange// Obtém e retorna o Bookmarks

}

protected void onPostExecute(Bookmarks result) { // Atualiza a UI Thread

}

}

XyzActivity.java

void updateBookmarksClicked() {new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId());

}

private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}"; class UpdateBookmarksTask extends AsyncTask<String, Void, Bookmarks> {

protected Bookmarks doInBackground(String... params) {// Recebe parâmetros// Cria o RestTemplate// Cria o HttpHeaders// Cria o HttpEntity// Invoca o método exchange// Obtém e retorna o Bookmarks

}

protected void onPostExecute(Bookmarks result) { // Atualiza a UI Thread

}

}

XyzActivity.java

Inner class

@Rest("http://www.bookmarks.com")

public interface BookmarkClient {

}

BookmarkClient.java

@Rest("http://www.bookmarks.com")

public interface BookmarkClient {

@Get("/bookmarks/{userId}?search={search}")

Bookmarks getBookmarks(String search, String userId);

} BookmarkClient.java

@RestService BookmarkClient restClient;

@Rest("http://www.bookmarks.com")

public interface BookmarkClient {

@Get("/bookmarks/{userId}?search={search}")

Bookmarks getBookmarks(String search, String userId);

}

XyzActivity.java

BookmarkClient.java

@RestService BookmarkClient restClient;

@Backgroundvoid searchAsync(String searchString, String userId) {

Bookmarks bookmarks = restClient.getBookmarks(searchString, userId);

updateBookmarks(bookmarks);}

@Rest("http://www.bookmarks.com")

public interface BookmarkClient {

@Get("/bookmarks/{userId}?search={search}")

Bookmarks getBookmarks(String search, String userId);

}

XyzActivity.java

BookmarkClient.java

@RestService BookmarkClient restClient;

@Backgroundvoid searchAsync(String searchString, String userId) {

Bookmarks bookmarks = restClient.getBookmarks(searchString, userId);

updateBookmarks(bookmarks);} @UiThreadvoid updateBookmarks(Bookmarks bookmarks) {

// Atualiza a UI Thread}

@Rest("http://www.bookmarks.com")

public interface BookmarkClient {

@Get("/bookmarks/{userId}?search={search}")

Bookmarks getBookmarks(String search, String userId);

}

XyzActivity.java

BookmarkClient.java

Universal Image Loader

● Framework open-source;

Universal Image Loader

● Framework open-source;● Biblioteca flexível para carregamento, cache

e exibição de imagens;

Universal Image Loader

● Framework open-source;● Biblioteca flexível para carregamento, cache

e exibição de imagens;● Multithread (async ou sync);

Universal Image Loader

● Framework open-source;● Biblioteca flexível para carregamento, cache

e exibição de imagens;● Multithread (async ou sync);● Cache em memória ou SD card;

Universal Image Loader

● Framework open-source;● Biblioteca flexível para carregamento, cache

e exibição de imagens;● Multithread (async ou sync);● Cache em memória ou SD card;● API level 5 ou superior;

Universal Image Loader

● Framework open-source;● Biblioteca flexível para carregamento, cache

e exibição de imagens;● Multithread (async ou sync);● Cache em memória ou SD card;● API level 5 ou superior;● Clean Master (+100.000.000), Camera360

(+50.000.000), etc.

public class MyActivity extends Activity {

@Override

public void onCreate() {

super.onCreate();

// Criar configuração global e inicializa o ImageLoader

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)

...

.build();

ImageLoader.getInstance().init(config);

...

}}

String imageUri = "http://site.com/image.png"; // da Web

String imageUri = "file:///mnt/sdcard/image.png"; // do SD card

String imageUri = "content://media/external/audio/albumart/1"; // de um content provider

String imageUri = "assets://image.png"; // dos assets

String imageUri = "drawable://" + R.drawable.img; // dos drawables (non-9patch images)

// Carrega a imagem em uma ImageView

imageLoader.displayImage(imageUri, imageView);

// Carregar imagem, decodificá-lo para Bitmap e retorna o Bitmap pro callback

imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {

@Override

public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

// Faça o que quiser

}});

GreenDAO

● Framework open-source;

GreenDAO

● Framework open-source;● Facilita a comunicação com SQLite;

GreenDAO

● Framework open-source;● Facilita a comunicação com SQLite;● API simples;

GreenDAO

● Framework open-source;● Facilita a comunicação com SQLite;● API simples;● Otimizado para Android;

GreenDAO

● Framework open-source;● Facilita a comunicação com SQLite;● API simples;● Otimizado para Android;● Consumo mínimo de memória;

GreenDAO

● Framework open-source;● Facilita a comunicação com SQLite;● API simples;● Otimizado para Android;● Consumo mínimo de memória;● Biblioteca pequena (menos de 100k);

GreenDAO

● Framework open-source;● Facilita a comunicação com SQLite;● API simples;● Otimizado para Android;● Consumo mínimo de memória;● Biblioteca pequena (menos de 100k);● Disponibiliza um gerador de código;

GreenDAO

● Framework open-source;● Facilita a comunicação com SQLite;● API simples;● Otimizado para Android;● Consumo mínimo de memória;● Biblioteca pequena (menos de 100k);● Disponibiliza um gerador de código;● Camera360 (+50.000.000), Pinterest (+10.000.000),

ICQ (+10.000.000), etc.

public static void main(String[] args) throws Exception { Schema schema = new Schema(1, "br.com.ricardolonga.todo");

Entity item = schema.addEntity("Item"); item.addIdProperty(); item.addStringProperty("title").notNull();

new DaoGenerator().generateAll(schema, "../todo/src-gen");}

DaoGenerator.java

Processing schema version 1...Written /home/longa/dev/workspace/todo/src-gen/br/com/ricardolonga/todo/ItemDao.javaWritten /home/longa/dev/workspace/todo/src-gen/br/com/ricardolonga/todo/Item.javaWritten /home/longa/dev/workspace/todo/src-gen/br/com/ricardolonga/todo/DaoMaster.javaWritten /home/longa/dev/workspace/todo/src-gen/br/com/ricardolonga/todo/DaoSession.javaProcessed 1 entities in 113ms

Resultado...

DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "todo", null);SQLiteDatabase db = helper.getWritableDatabase();DaoMaster daoMaster = new DaoMaster(db);DaoSession daoSession = daoMaster.newSession();ItemDao itemDao = daoSession.getItemDao();

Obtendo o ItemDao...

Item item = new Item(null, itemTitle);

itemDao.insert(item);itemDao.deleteAll();itemDao.deleteByKey(id);

Exemplos...

DroidParts

● Injeção de Dependência para Views, Fragments, Services, qualquer coisa;

DroidParts

● Injeção de Dependência para Views, Fragments, Services, qualquer coisa;

● ORM - Uso eficiente de persistência com Cursor e API fluente;

DroidParts

● Injeção de Dependência para Views, Fragments, Services, qualquer coisa;

● ORM - Uso eficiente de persistência com Cursor e API fluente;

● EventBus para subscrever e postar eventos;

DroidParts

● Injeção de Dependência para Views, Fragments, Services, qualquer coisa;

● ORM - Uso eficiente de persistência com Cursor e API fluente;

● EventBus para subscrever e postar eventos;● Simples (des)serialização JSON capaz de

lidar com objetos aninhados;

DroidParts

● Injeção de Dependência para Views, Fragments, Services, qualquer coisa;

● ORM - Uso eficiente de persistência com Cursor e API fluente;

● EventBus para subscrever e postar eventos;● Simples (des)serialização JSON capaz de

lidar com objetos aninhados;● Mesma coisa com XML;

DroidParts

● Injeção de Dependência para Views, Fragments, Services, qualquer coisa;

● ORM - Uso eficiente de persistência com Cursor e API fluente;

● EventBus para subscrever e postar eventos;● Simples (des)serialização JSON capaz de

lidar com objetos aninhados;● Mesma coisa com XML;● Melhor forma de lidar com AsyncTask e

IntentService com Exceções;

DroidParts

● Logger que descobre sua TAG e registra qualquer objeto;

DroidParts

● Logger que descobre sua TAG e registra qualquer objeto;

● RESTClient para GET, PUT, POST, DELETE & InputStream-getting, e também conversa com JSON;

DroidParts

● Logger que descobre sua TAG e registra qualquer objeto;

● RESTClient para GET, PUT, POST, DELETE & InputStream-getting, e também conversa com JSON;

● ImageFetcher para anexar de forma assíncrona imagens para ImageViews, com caching, cross-fade e apoio transformação;

DroidParts

● Logger que descobre sua TAG e registra qualquer objeto;

● RESTClient para GET, PUT, POST, DELETE & InputStream-getting, e também conversa com JSON;

● ImageFetcher para anexar de forma assíncrona imagens para ImageViews, com caching, cross-fade e apoio transformação;

● Muito mais...

Robotium

● Framework para automação de testes;

Robotium

● Framework para automação de testes;● Robotium Recorder (trial);

Robotium

● Framework para automação de testes;● Robotium Recorder (trial);● Suporta aplicações nativas e híbridas;

Robotium

● Framework para automação de testes;● Robotium Recorder (trial);● Suporta aplicações nativas e híbridas;● Foco em testes de caixa preta;

Robotium

● Framework para automação de testes;● Robotium Recorder (trial);● Suporta aplicações nativas e híbridas;● Foco em testes de caixa preta;● Similar ao Selenium (aplicações web);

Robotium

● Framework para automação de testes;● Robotium Recorder (trial);● Suporta aplicações nativas e híbridas;● Foco em testes de caixa preta;● Similar ao Selenium (aplicações web);● Integração com Ant/Maven/Gradle para a

execução dos testes na integração contínua.

Genymotion

● Emulador Android alternativo;

Genymotion

● Emulador Android alternativo;● Rápido e intuitivo (fácil de usar);

Genymotion

● Emulador Android alternativo;● Rápido e intuitivo (fácil de usar);● Utilizado por mais de 1.500.000 devs;

Genymotion

● Emulador Android alternativo;● Rápido e intuitivo (fácil de usar);● Utilizado por mais de 1.500.000 devs; ● Possibilita controle total do AVD (bateria,

GPS, acelerômetro, etc);

Genymotion

● Emulador Android alternativo;● Rápido e intuitivo (fácil de usar);● Utilizado por mais de 1.500.000 devs; ● Possibilita controle total do AVD (bateria,

GPS, acelerômetro, etc);● Integra-se ao Eclipse através de um plugin;

Genymotion

● Emulador Android alternativo;● Rápido e intuitivo (fácil de usar);● Utilizado por mais de 1.500.000 devs; ● Possibilita controle total do AVD (bateria,

GPS, acelerômetro, etc);● Integra-se ao Eclipse através de um plugin;● Roda em Windows, MacOS e Linux.

HAXM

● Acelera o funcionamento do emulador do Android para processadores Intel;

HAXM

● Acelera o funcionamento do emulador do Android para processadores Intel;

● É necessário baixar a imagem x86 no Android SDK;

HAXM

● Acelera o funcionamento do emulador do Android para processadores Intel;

● É necessário baixar a imagem x86 no Android SDK;

● Não tem suporte nativo para Google Play;

Referências

● http://www.appbrain.com/stats/libraries/dev● http://www.tutecentral.com/android-pull-to-ref

resh/● https://github.com/greenrobot/EventBus● https://code.google.com/p/google-gson/● https://github.com/castorflex/SmoothProgres

sBar● http://sharedstate.net/archives/pull-to-refresh● http://loopj.com/android-async-http/● http://viewpagerindicator.com/

Referências

● https://github.com/nostra13/Android-Universal-Image-Loader

● https://github.com/excilys/androidannotations

● http://androidkickstartr.com/● http://greendao-orm.com/● https://software.intel.com/pt-br/android● http://www.genymotion.com/● https://code.google.com/p/robotium/

Obrigado!

@ricardolongahttp://about.me/ricardo.longaricardo.longa@gmail.com

@driflashhttp://www.creativedev.com.brcontato@creativedev.com.br

top related