O documento discute ferramentas livres para desenvolvimento Android, incluindo Gradle para gerenciamento de projetos, RoboGuice para injeção de dependência, Robolectric para testes unitários e Calabash para testes funcionais baseados em comportamento. Ele também aborda persistência de dados com AlienDroid ActiveRecord e integração contínua com Jenkins. Por fim, fala sobre relatórios de crashes de aplicativos com ACRA.
12. ou você pode usar o:
e gerenciar seu projeto por ele!
domingo, 29 de abril de 12
13. por que usar?
o processo de build é complexo?
requer muitas regras?
domingo, 29 de abril de 12
14. compilar
testar
testes unitários, com BDD, com seilaoquê!
empacotar
empacotar com certificados diferentes
deploy
gerar um tags no repositório
domingo, 29 de abril de 12
15. por que usar?
sua aplicação possui muitas dependências
para bibliotecas externas?
domingo, 29 de abril de 12
16. por que usar?
quer automatizar tarefas repetitivas no seu
processo de build?
domingo, 29 de abril de 12
17. por que usar?
você usa um servidor de integração
contínua?
domingo, 29 de abril de 12
18. por que usar?
sua aplicação está dividida em vários
módulos?
domingo, 29 de abril de 12
19. então,
foi feito para você!
domingo, 29 de abril de 12
20. http://roboguice.googlecode.com/
dependency injection
events, logs, factories, fragments, services, resources
domingo, 29 de abril de 12
22. “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
23. com DI eu não faço isso:
MinhaInterface objeto =
new
UmaClasseQueImplementaInterface();
domingo, 29 de abril de 12
24. com DI eu faço apenas isso:
@Inject
UmaInterface obj;
domingo, 29 de abril de 12
25. código repetitivo
o modo “android nativo” de programar:
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 );
}
}
domingo, 29 de abril de 12
26. código não-repetitivo
o modo “RoboGuice” de programar:
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 );
}
}
domingo, 29 de abril de 12
28. eventos pra cá, eventos pra lá
o modo “RoboGuice” de programar:
public class MyActivity extends RoboActivity {
@Inject protected Listeners listeners;
}
class Listeners {
public void doOnResume(@Observes OnResumeEvent e) {
}
public void doOnCreate(@Observes OnCreateEvent e) {
}
}
domingo, 29 de abril de 12
29. quem usa isso?
será que presta mesmo?
domingo, 29 de abril de 12
30. por que usar?
eliminar código repetitivo
domingo, 29 de abril de 12
31. por que usar?
focar no negócio da
aplicação
domingo, 29 de abril de 12
32. por que usar?
ter os benefícios da injeção
de dependência no
desenvolvimento mobile
domingo, 29 de abril de 12
33. por que usar?
o maldito context não
precisa mais caminhar
entre as diversas camadas
da sua aplicação
domingo, 29 de abril de 12
34. enfim:
código mais limpo, claro e
focado no negócio da sua
aplicação
domingo, 29 de abril de 12
45. e a maldita persistência de dados?
domingo, 29 de abril de 12
46. faça um extends de SQLiteOpenHelper
o modo android nativo de programar:
class MeuHelper extends SQLiteOpenHelper {
public void onCreate(SQLiteDatabase db) { }
public void onUpgrade(SQLiteDatabase db,
int old, int newV) { }
}
domingo, 29 de abril de 12
47. MeuHelper helper = new
MeuHelper();
SQLiteDatabase database =
helper.getWritableDatabase();
Cursor cursor =
database.rawQuery("select *
from tabela");
domingo, 29 de abril de 12
48. MeuHelper helper = new MeuHelper();
SQLiteDatabase database =
helper.getWritableDatabase();
ContentValues values = new
ContentValues();
values.put(“coluna1”, comment);
database.insert(“tabela”, null,
values);
domingo, 29 de abril de 12
49. MeuHelper helper = new MeuHelper();
SQLiteDatabase database =
helper.getWritableDatabase();
database.delete(“tabela”,
“_id” + " = " + id, null);
domingo, 29 de abril de 12
51. defina seu model
public class Item extends Model {
public String atributo1;
public String atributo2;
public String atributo3;
}
domingo, 29 de abril de 12
52. Item item =
Model.load(Item.class, 1L);
item.insert();
List<Item> itens = Model.findAll(Item.class);
item.delete();
item.update();
Model.where(...);
domingo, 29 de abril de 12
53. tabela criada
automaticamente
domingo, 29 de abril de 12
65. 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
71. 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
72. 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