Flisol 2012
-
Upload
marlon-carvalho -
Category
Technology
-
view
630 -
download
1
description
Transcript of Flisol 2012
DESENVOLVENDO PARA ANDROIDCOM FERRAMENTAS LIVRES
MARLON SILVA CARVALHO domingo, 29 de abril de 12
twitter.com/marlonscarvalho
marlon.silvacarvalho.net
domingo, 29 de abril de 12
domingo, 29 de abril de 12
domingo, 29 de abril de 12
domingo, 29 de abril de 12
o inevitável para os desenvolvendores......era surgir uma grande quantidade de ferramentas opensource
domingo, 29 de abril de 12
domingo, 29 de abril de 12
vamos começar do começo...
...ao criar seu projeto.
domingo, 29 de abril de 12
dependências para bibliotecas
domingo, 29 de abril de 12
lib-dep-1.1 lib-dep-1.2
lib-xml lib-json
domingo, 29 de abril de 12
domingo, 29 de abril de 12
ou você pode usar o:
e gerenciar seu projeto por ele!
domingo, 29 de abril de 12
o processo de build é complexo? requer muitas regras?
por que usar?
domingo, 29 de abril de 12
testar
compilar
empacotar
deploy
gerar um tags no repositório
empacotar com certificados diferentes
testes unitários, com BDD, com seilaoquê!
domingo, 29 de abril de 12
sua aplicação possui muitas dependências para bibliotecas externas?
por que usar?
domingo, 29 de abril de 12
quer automatizar tarefas repetitivas no seu processo de build?
por que usar?
domingo, 29 de abril de 12
você usa um servidor de integração contínua?
por que usar?
domingo, 29 de abril de 12
sua aplicação está dividida em vários módulos?
por que usar?
domingo, 29 de abril de 12
foi feito para você!
então,
domingo, 29 de abril de 12
dependency injectionevents, logs, factories, fragments, services, resources
http://roboguice.googlecode.com/
domingo, 29 de abril de 12
- =
a simples equação
+AOP
domingo, 29 de abril de 12
“Dependency injection is a software design pattern that allows a choice of component to be made at run-time rather than compile time.”
domingo, 29 de abril de 12
com DI eu não faço isso:
MinhaInterface objeto =
new UmaClasseQueImplementaInterface();
domingo, 29 de abril de 12
com DI eu faço apenas isso:
@InjectUmaInterface obj;
domingo, 29 de abril de 12
class AndroidWay extends Activity { TextView name; ImageView thumbnail; LocationManager loc; Drawable icon; String myName;
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); name = (TextView) findViewById(R.id.name); thumbnail = (ImageView) findViewById(R.id.thumbnail); loc = (LocationManager) getSystemService(Activity.LOCATION_SERVICE); icon = getResources().getDrawable(R.drawable.icon); myName = getString(R.string.app_name); name.setText( "Hello, " + myName ); } }
código repetitivoo modo “android nativo” de programar:
domingo, 29 de abril de 12
class RoboWay extends RoboActivity { @InjectView(R.id.name) TextView name; @InjectView(R.id.thumbnail) ImageView thumbnail; @InjectResource(R.drawable.icon) Drawable icon; @InjectResource(R.string.app_name) String myName; @Inject LocationManager loc;
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); name.setText( "Hello, " + myName ); } }
código não-repetitivoo modo “RoboGuice” de programar:
domingo, 29 de abril de 12
@Inject
domingo, 29 de abril de 12
public class MyActivity extends RoboActivity { @Inject protected Listeners listeners;}
class Listeners { public void doOnResume(@Observes OnResumeEvent e) { } public void doOnCreate(@Observes OnCreateEvent e) { } }
eventos pra cá, eventos pra láo modo “RoboGuice” de programar:
domingo, 29 de abril de 12
quem usa isso?será que presta mesmo?
domingo, 29 de abril de 12
eliminar código repetitivopor que usar?
domingo, 29 de abril de 12
focar no negócio da aplicação
por que usar?
domingo, 29 de abril de 12
ter os benefícios da injeção de dependência no
desenvolvimento mobile
por que usar?
domingo, 29 de abril de 12
o maldito context não precisa mais caminhar
entre as diversas camadas da sua aplicação
por que usar?
domingo, 29 de abril de 12
código mais limpo, claro e focado no negócio da sua
aplicação
enfim:
domingo, 29 de abril de 12
testes unitários em qualquer jvm
http://roboletric.org/
domingo, 29 de abril de 12
o maldito emulador!
domingo, 29 de abril de 12
testes rodando na própria IDE
por que usar?
domingo, 29 de abril de 12
testes rodando em servidores de integração
por que usar?
domingo, 29 de abril de 12
@RunWith (RobolectricTestRunner.class)public class MyActivityTest { private Activity activity; private Button pressMeButton; private TextView results;
@Before public void setUp() throws Exception { activity = new MyActivity(); activity.onCreate(null);
pressMeButton = (Button) activity.findViewById(R.id.press_me_button); results = (TextView) activity.findViewById(R.id.results_text_view); }
@Test public void shouldUpdateResultsWhenButtonIsClicked() throws Exception {
pressMeButton.performClick(); String resultsText = results.getText().toString(); assertThat(resultsText, equalTo("Testing Android Rocks!")); }}
domingo, 29 de abril de 12
mas... um rápido parênteses... (
domingo, 29 de abril de 12
por que você faz testes unitários em android?
domingo, 29 de abril de 12
regras de negócio em serviços
domingo, 29 de abril de 12
dados nas nuvens
domingo, 29 de abril de 12
)
domingo, 29 de abril de 12
e a maldita persistência de dados?
domingo, 29 de abril de 12
class MeuHelper extends SQLiteOpenHelper {
public void onCreate(SQLiteDatabase db) { }
public void onUpgrade(SQLiteDatabase db, int old, int newV) { }
}
faça um extends de SQLiteOpenHelpero modo android nativo de programar:
domingo, 29 de abril de 12
Cursor cursor = database.rawQuery("select * from tabela");
MeuHelper helper = new MeuHelper();SQLiteDatabase database = helper.getWritableDatabase();
domingo, 29 de abril de 12
ContentValues values = new ContentValues();values.put(“coluna1”, comment);database.insert(“tabela”, null, values);
MeuHelper helper = new MeuHelper();SQLiteDatabase database = helper.getWritableDatabase();
domingo, 29 de abril de 12
database.delete(“tabela”, “_id” + " = " + id, null);
MeuHelper helper = new MeuHelper();SQLiteDatabase database = helper.getWritableDatabase();
domingo, 29 de abril de 12
aliendroid-activerecord para diminuir a dor da persistência de dados
https://github.com/marloncarvalho/aliendroid-activerecord
domingo, 29 de abril de 12
public class Item extends Model { public String atributo1; public String atributo2; public String atributo3;}
defina seu model
domingo, 29 de abril de 12
List<Item> itens = Model.!ndAll(Item.class);item.insert();
Item item = Model.load(Item.class, 1L);
item.delete();
item.update();Model.where(...);
domingo, 29 de abril de 12
tabela criada automaticamente
domingo, 29 de abril de 12
colunas mapeadas para os atributos
domingo, 29 de abril de 12
minimiza a necessidade de códigos SQL
por que usar?
domingo, 29 de abril de 12
automatiza tarefas repetitivaspor que usar?
domingo, 29 de abril de 12
integração contínuaserá que você precisa de um?
domingo, 29 de abril de 12
por que usar?sua equipe é de média a grande?
domingo, 29 de abril de 12
por que usar?quer garantir que a cada commit seu projeto continua funcionando?
domingo, 29 de abril de 12
por que usar?você precisa de resposta instantânea
para erros de integração?
domingo, 29 de abril de 12
use o jenkins com seu projeto androidroda tanto com o roboletric como com o emulador
domingo, 29 de abril de 12
domingo, 29 de abril de 12
tem como usar BDD no android?behavior driven development
domingo, 29 de abril de 12
calabash-android
https://github.com/calabash/calabash-android
domingo, 29 de abril de 12
calabash-android
Feature: Login feature Scenario: As a valid user I can log into my app Given I am a valid user And I enter my username And I enter my password And I press "Login" Then I see "Welcome to coolest app ever"
domingo, 29 de abril de 12
calabash-android
domingo, 29 de abril de 12
ter os benefícios do BDD em seu projeto android
por que usar?
domingo, 29 de abril de 12
e quando dá pau na sua app?como saber quando isso aconteceu
domingo, 29 de abril de 12
Google Playeles lhe dão uma forcinha, mas...
...e se você quiser mais informações?e um relatório personalizado?
domingo, 29 de abril de 12
Application Crash Report for Android
http://acra.googlecode.com/
domingo, 29 de abril de 12
ACRA is a library enabling Android Application to automatically post their
crash reports to a Google Docs form. It is targetted to android applications developers to help them get data from
their applications when they crash or behave erroneously.
domingo, 29 de abril de 12
import org.acra.*;import org.acra.annotation.*;
@ReportsCrashes(formKey = "dGVacG0ydVHnaNHjRjVTUTEtb3FPWGc6MQ") public class MyApplication extends Application {
@Override public void onCreate() { ACRA.init(this); super.onCreate(); }
}
domingo, 29 de abril de 12
domingo, 29 de abril de 12
domingo, 29 de abril de 12
você não está satisfeito com as opções do Google Play
por que usar?
domingo, 29 de abril de 12
você quer personalizar seu relatório
por que usar?
domingo, 29 de abril de 12
você quer dar um feedback mais elegante para o
usuário
por que usar?
domingo, 29 de abril de 12
você quer mais detalhes sobre o erro
por que usar?
domingo, 29 de abril de 12
é só isso!
domingo, 29 de abril de 12
androidbahia.info
domingo, 29 de abril de 12