Share
Embed
Android Training Program - Portugal, Aula 2
Aula #2: Fundações I 🏗
Depois de criarem a vossa primeira aplicação, o que se segue? O que são estes ficheiros e classes? O que é uma Activity?
- Activities e Fragments
- Arquitetura Android
- Manifest
- Intents
- Navigation
ATP Portugal
October 28, 2020
Transcript
101 slides
-
• Sejam excelentes uns para os outros • Fale mais
alto se vir ou ouvir alguma coisa • O assédio não é tolerado • Pratique "Sim e" um ao outro Código de conduta Mais informações: http://bit.ly/2IhF0l3 -
Andres-Leonardo Martinez-Ortiz Google Carlos Mota Formador Renato Almeida Formador @davilagrau
@cafonsomota @tallnato Equipa Daniela Ferreira Gestora de comunidades -
• 12 aulas • 1h30 cada aula • ~1 aula
por semana • 14 Outubro a 16 Dezembro • YouTube live • Suporte assíncrono contínuo via Discord/email • Todo o código disponível no GitHub Photo by Arif Riyanto on Unspla O programa -
#0 14 de Outubro Pronto para começar #1 21 de
Outubro Bem-vindos ao Android #2 28 de Outubro Fundações I #3 04 de Novembro Fundações II #4 11 de Novembro Fundações III #5 18 de Novembro Listas, listas e mais listas #6 25 de Novembro Jetpack, Jetpack, Jetpack! #7 - #8 02 - 03 de Dezembro Firebase #9 - #10 09 - 10 de Dezembro MLKit & TensorFlow #11 16 de Dezembro Resumo Semana Semana Calendário ✅ Direto ✅ -
Sumário Photo by Mika Baumeister on Unsplash • Resumo da
aula anterior • Passaporte para a Google • Uma pausa com Android 4.4 • Kotlin para principiantes • Doce ou travessura -
Aula #1 • Plataforma Android • Passaporte para a Google
• Criar uma aplicação • Kotlin para principiantes • Doce ou travessura -
• Descrição da aplicação (ícon, nome, tema) • Definição dos
componentes da aplicação (activities, serviços, etc.) • Permissões • Requisitos de hardware • E mais…. Application Manifest -
AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="pt.atp.bobi"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true"
android:theme="@style/Theme.Bobi"> ... </application> </manifest> -
Package <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="pt.atp.bobi"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true"
android:theme="@style/Theme.Bobi"> ... </application> </manifest> -
Application <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="pt.atp.bobi"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true"
android:theme="@style/Theme.Bobi"> ... </application> </manifest> -
Activity <manifest ...> <application ...> <activity android:name="pt.atp.bobi.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> -
Activity <manifest ...> <application ...> <activity android:name="pt.atp.bobi.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> -
Activity <manifest ...> <application ...> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> -
Activity <manifest ...> <application ...> <activity android:name="pt.atp.bobi.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> -
Permissões <manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission
android:name="android.permission.RECORD_AUDIO" /> ... </manifest> -
Serviços <manifest ...> <application ...> <service android:name=".CanineService" ...> ... </service>
... </application> </manifest> -
Outros elementos... <manifest ...> <supports-screens .../> <uses-configuration .../> <uses-feature />
<supports-screens /> <application ...> <receiver ... /> ... </application> </manifest> -
• Representa um ecrã da aplicação • Providencia uma interface
gráfica para o utilizador interagir • Podem ser lançadas de diferentes formas ◦ Ao carregar no ícone da aplicação ◦ Ao navegar entre diferentes ecrãs ◦ Por uma aplicação externa ◦ etc. Activity -
Características: • Primeiro método a ser executado • É executado
uma única vez Utilizado para: • Define a interface gráfica ◦ O layout que vai ser carregado (imagens, texto, botões, etc.) • Inicialização de variáveis imutáveis onCreate() Início onCreate -
onResume() Início onCreate onResume Características: • Último método executado antes
da aplicação estar pronta para o utilizador interagir • Pode ser executado várias vezes Utilizado para: • Registo de listeners • Início de funcionalidades contínuas (mapa, vídeo, etc) -
onPause() Início onCreate onResume App a correr onPause Características: •
Primeiro método executado quando a aplicação deixa de estar disponível • Também pode ser executado várias vezes • “Oposto” do onResume() Utilizado para: • Cancelar o registo de listeners • Parar as tarefas iniciadas no onResume() -
onDestroy() Início onCreate onResume App a correr onPause onDestroy Fim
☠ Características: • Último método a ser executado antes da Activity ser destruída Utilizado para: • Limpar recursos que estejam ainda a ser utilizados -
Para criar uma Activity • Classe que estenda Activity //
BobiActivity.kt class BobiActivity : Activity() { ... } utilizamos “//” para colocarmos comentários no código -
Para criar uma Activity • Classe que estenda Activity •
Adicionar a Activity no AndroidManifest // AndroidManifest.xml <manifest ...> <application ...> <activity android:name=".BobiActivity"> </activity> </application> </manifest> -
• Classe que estenda Activity • Adicionar a Activity no
AndroidManifest • Layout Para criar uma Activity // activity_bobi.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> ... </LinearLayout> -
• Representa um comportamento ou porção da interface do utilizador
• Permite isolar e reutilizar partes gráficas e lógica • Contida sempre numa activity • Podemos ter múltiplos fragments numa activity e um fragmento pode ser utilizado por várias activities • Tem o seu próprio ciclo de vida, muito parecido com o de uma Activity Fragment -
• onCreateView() ◦ Chamado quando é necessário desenhar a interface
de utilizador • onAttach() ◦ Quando o fragment é colocado numa Activity • onDettach() ◦ Quando o fragment é removido de uma Activity • onPause(), onResume(), etc Ciclo de vida Início onAttach onCreateView Fragmento visível onDestroy onDetach Fim -
Intents • Uma abstração de uma operação a ser executada
por outro componente ◦ Iniciar uma nova activity ◦ Iniciar um serviço ◦ Enviar mensagem para outra aplicação • Um intent é definido de acordo com os seguintes parâmetros: ◦ Ação - A ação a ser executada (ACTION_VIEW, ACTION_DIAL, etc) ◦ Dados - Os dados necessários para a ação -
Intents diferentes tipos de ações fun openDialer(phone: String){ val intent
= Intent(Intent.ACTION_DIAL) startActivity(intent) } ACTION_DIAL -
Intents diferentes tipos de ações fun openDialer(phone: String){ val intent
= Intent(Intent.ACTION_DIAL) intent.data = Uri.parse("tel:$phone") startActivity(intent) } ACTION_DIAL +351990000001 -
Intents diferentes tipos de ações fun openWebsite(phone: String){ val intent
= Intent(Intent.ACTION_VIEW) intent.data = Uri.parse("https://www.android.com") startActivity(intent) } ACTION_VIEW -
Intents lançar uma nova activity fun openSecondActivity(){ val intent =
Intent(this, SecondActivity::class.java) startActivity(intent) } -
Intents lançar uma nova activity private const val REQUEST_CAMERA =
100 fun takePicture() { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) startActivityForResult(intent, REQUEST_CAMERA) } -
Intents lançar uma nova activity private const val REQUEST_CAMERA =
100 fun takePicture() { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) startActivityForResult(intent, REQUEST_CAMERA) } override fun onActivityResult(req: Int, result: Int, data: Intent?) { if (resultCode == RESULT_OK && requestCode == REQUEST_CAMERA) Toast.makeText(context, "Nova foto disponível", LENGTH_SHORT).show() } -
Navegação • Diferentes tipos de navegação ◦ Lançando activities da
própria aplicação ◦ Entre diferentes fragmentos ◦ Acedendo a outras aplicações -
1. Self-reflection 2. Job searching 3. Your resume 4. Apply
online 5. Interviews 6. Decision and offer Our hiring process careers.google.com/how-we-hire/ -
It’s tempting to take your last resume and update it,
tweaking it a bit here and there to include your latest work. But we’d like to suggest that you go a little deeper — we think you’ll feel much better about your hiring process if you do. For each position do the following to build your job-specific resume: • Align your skills and experience with the job description. Tie your work directly to the role qualifications (and don’t forget to include data). • Be specific about projects you’ve worked on or managed. What was the outcome? How did you measure success? When in doubt, lean on the formula, “accomplished [X] as measured by [Y], by doing [Z].” • If you've had a leadership role, tell us about it. How big was the team? What was the scope of your work? • If you're a recent university graduate or have limited work experience, include school-related projects or coursework that demonstrate relevant skills and knowledge. • Keep it short. Your resume careers.google.com/how-we-hire/ -
Resources Google’s Tech Dev Guide g.co/techdevguide Excellent resources for interview
and resume prep + skills development “Google Students” YouTube Channel Watch our videos to receive tips and information from other Googlers Careers OnAir careersonair.withgoogle.com On-demand and live events to learn more about life, culture, and work at Google Additional Resource g.co/buildyourfuture -
Dog bobi = new Dog("Bobi"); Dog lacy = new Dog("Lacy");
Log.d("O meu cão é o "+ bobi.getName()); val bobi = Dog("Bobi") val lacy = Dog("Lacy") Log.d("O meu cão é o " + bobi.name) Strings interpolação -
Dog bobi = new Dog("Bobi"); Dog lacy = new Dog("Lacy");
Log.d("O meu cão é o "+ bobi.getName()); val bobi = Dog("Bobi") val lacy = Dog("Lacy") Log.d("O meu cão é o ${bobi.name}") Strings interpolação -
Dog bobi = new Dog("Bobi"); Dog lacy = new Dog("Lacy");
Log.d("O meu cão é o "+ bobi.getName()); val bobi = Dog("Bobi") val lacy = Dog("Lacy") Log.d("O meu cão é o $bobi") Strings interpolação -
Dog bobi = new Dog("Bobi"); val bobi: Dog = Dog("Bobi")
Variáveis declaração -
Dog bobi = new Dog("Bobi"); val bobi: Dog = Dog("Bobi")
Variáveis declaração -
Imports import android.content.Intent val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) startActivityForResult(intent, CAMERA_REQUEST) Sugestão:
Preferences → Editor → General → Auto Import Selecciona: ✅ Optimize imports on the fly ✅ Add unambiguous imports on the fly -
Trabalho para casa • Ao carregar num botão ◦ Mostrar
um AlertDialog ◦ Mostrar uma Snackbar