Palestra de Neto Marin no InterCon Dev - Android, em setembro de 2013, sobre Next Level Apps. Saiba mais em: http://intercon.imasters.com.br/dev/android/
11. Destaque de Apps Android
11
• Seguir os guidelines Android
- http://developer.android.com/distribute/
googleplay/quality
- http://developer.android.com/design/index.html
• Ser relevante
• Funcionar !
11terça-feira, 10 de setembro de 13
12. Como o Google fica sabendo do meu App?
12
Fale com esse cara...
netomarin@google.com
google.com/+NetoMarin
12terça-feira, 10 de setembro de 13
14. O que tem de errado nessa imagem ?
14
14terça-feira, 10 de setembro de 13
15. Como retirar o menu sem uso ?
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="18" />
15
AndroidManifest.xml
15terça-feira, 10 de setembro de 13
18. Actions
Podem estar na parte
inferior da tela (split action
bar)
Navigation
<activity
android:uiOptions="splitActionBarWhenNarrow">
Rough
Sizes
Phone
Phone
landscape
Tablet
Bar height 48dp 40dp 56dp
Item width 56dp 56dp 64dp
Organização Geral
18terça-feira, 10 de setembro de 13
19. Up caret
Navigation drawer
indicator
Empty (home only)
<item name="android:displayOptions">...homeAsUp...</
item>
// OR
ActionBar.setDisplayHomeAsUpEnabled(true);
// OR
<activity parentActivityName=”...”>
ActionBarDrawerToggle
Organização Geral
19terça-feira, 10 de setembro de 13
20. Logo
Ícone
Empty (avoid)
e.g. Clock
<application android:logo="@drawable/
actionbar_logo">
<style name="ActionBar" parent="...">
<item
name="android:displayOptions">...useLogo...</item>
<item name="android:logo">@drawable/
actionbar_logo</item>
</style>
Organização Geral
20terça-feira, 10 de setembro de 13
21. Title
Spinner
TABS TABS TABS
[custom layout]
“Stacked bar” separate
row in portrait
e.g. Breadcrumbs in
Google Drive
actionBar.setNavigationMode(ActionBar.NAVIGATI
ON_MODE_LIST);
actionBar.setListNavigationCallbacks(adapter,
this);
actionBar.setNavigationMode(ActionBar.NAVIGATI
ON_MODE_TABS);
actionBar.addTab(actionBar.newTab()
.setText(R.string.title_my_schedule)
.setTabListener(this));
Organização Geral
21terça-feira, 10 de setembro de 13
22. COM TEXTO SÓ TEXTO showAsAction="...|withText|..."
Pode ter um
submenu
Long-press
mostra tooltip
Custom layout
actionViewClass="android.widget.SearchView"
-- OR --
actionLayout="@layout/foo"
Action providers
actionProviderClass="android.widget.ShareActionProvider"
Expanded/collapsed
showAsAction="...|collapseActionView|..."
Organização Geral
22terça-feira, 10 de setembro de 13
26. Deixe as coisas um
pouco mais animadas !
26terça-feira, 10 de setembro de 13
27. Janelas
Transição entre activities
Views
Alpha, escala, rotação, translação
Fragments
Transição enquanto adiciona, remove,
or substitui fragments
Desenhos animáveis
Animações em quadros ou rotações,
escala, etc. outros desenhos
Layouts
Transição quando filhos são adicionados,
removidos
ou suas posições ou tamanhos mudam
Propriedades + valores
objetos
Modifique propriedades como cor de
fundo com o passar do tempo
Coisas que podem ser animadas
27terça-feira, 10 de setembro de 13
28. Não imponha ao usuário como ele
deve segurar o próprio telefone !
(salvo em casos específicos)
28terça-feira, 10 de setembro de 13
30. Tratando a mudança de configuração
30
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
Activity
30terça-feira, 10 de setembro de 13
31. Retendo um objeto na mudança
31
@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}
Activity
31terça-feira, 10 de setembro de 13
32. Recuperando objeto
32
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final MyDataObject data = (MyDataObject)
getLastNonConfigurationInstance();
if (data == null) {
data = loadMyData();
}
...
}
Activity
32terça-feira, 10 de setembro de 13
34. Avise o usuário e o leve para a sua app !
34
http://developer.android.com/guide/topics/ui/
notifiers/notifications.html
34terça-feira, 10 de setembro de 13
35. E saia do básico !
35
35terça-feira, 10 de setembro de 13
37. O que é o GCM ?
37
Serviço para enviar
mensagens de um
servidor para
dispositivos Android.
37terça-feira, 10 de setembro de 13
38. Porque GCM ?
38
GCM cuida do servdor backend, cliente móvel, e
mantém uma conexão persistente entre os dois.
Economia significante de bateria, o oposto de cada
app manter o seu framework de sincronização.
Free Sem
Quota
38terça-feira, 10 de setembro de 13
39. Dê ao usuário, formas diferentes
de acessar o conteúdo da app.
39terça-feira, 10 de setembro de 13
41. E também os Lockscreen Widgets
41
41terça-feira, 10 de setembro de 13
42. E é bem simples....
42
<app-widget-provider ..."
....
android:widgetCategory="keyguard|home_screen"
</app-widget-provider>
AndroidManifest.xml
42terça-feira, 10 de setembro de 13
43. Customizando o layout
43
Bundle opt = appWidgetManager.getAppWidgetOptions(widgetId);
int cat = opt.getInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, -1);
boolean keyguard = cat = AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD;
int baseLayout = isKeyguard ? R.layout.keyguard_widget_layout :
R.layout.widget_layout;
MyAppProvider
43terça-feira, 10 de setembro de 13
45. Quais as vantagens ?
45
Facilita o login do usuário,
poupando digitação e
memorização de novas
senhas.
Permita que os usuários
compartilhem conteúdo do
seu app e assim seja
descoberto por mais usuários.
O botão +1 ajuda os
usuários darem sua
aprovação pública ao seu
app, tornando seu conteúdo
mais relevante e confiável.
45terça-feira, 10 de setembro de 13