Primeiros passeios no código Java para Android Manifest <manifest ....... package="br.ufrj.nce.prog1" .... <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="15" /> <application .... <activity android:name="br.ufrj.nce.prog1.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> O que ocorre ao início do programa? • Launcher lê AndroidManifest.xml – Descobre qual é a classe Activity principal Java • Aquela que atende ao Intent chamado " MAIN" com categoria " LAUNCHER " – Descobre a classe da atividade e instancia – O Método onCreate é executado • Ali, o método setContentView " infla automaticamente" o XML de uma view escolhida para ser o conteúdo interativo inicial e exibe na tela. – Se escolhe geralmente a view activity_main como conteúdo interativo inicial. Java minimalista package br.ufrj.nce.prog1; import ...... public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } Se dispositivo for virado, onCreate é novamente chamado. Layout inicial <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="br.ufrj.nce.prog1.MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout> Loop interno scheduler do Android • Para sempre faz – Se houve algum evento de hardware (ex. click, rede, etc.) • Acorda • Chama rotina de callback registrada (listener) – Algumas são Override • Muitas precisam criar objetos • Muitas vezes precisam chamar o método pai. • Muitas precisam do ApplicationContext ou similar. • Dorme Especificação de uma callback // Criação de uma callback de click para o botão meuBotao.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { meuBotao.setText(“Mudei de nome!"); } }); Trabalhando com as views (botões, rótulos, etc.) • Método mais simples: usar editor gráfico – Especificar todos os atributos interativamente • Atributo especial de botões: click – Permite especificar o nome de um método – Criar método assim: public void onClickBotaoX(View v) { ... executa algo a partir do botão apertado } Problemas quando se gira celular Como usar uma view específica • Pegar instância da View, usando algo assim: button = (Button) findViewById(R.id.button1); TextView t_rotulo; EditText e_nome; String x; ... t_rotulo = (TextView) findViewById(R.id.textView1); e_nome = (EditText) findViewById(R.id.editText1); ... X = t_rotulo.getText().toString(); e_nome.setText(x); Layout criado por programa LinearLayout ll = new LinearLayout(this); Button b = new Button(this); b.setText (“Meu botão”); ll.addView(b); EditText e = new EditText(this); e.setHint(“escreva aqui seu nome”); ll.addView(e); setContentView(ll); Menu (criação e seleção) @Override public boolean onCreateOptionsMenu(Menu menu) { // Apenas infla o menu getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { //... Faz qualquer coisa ... return true; } return super.onOptionsItemSelected(item); } Para descontrair: texto para fala TextToSpeech tts = new TextToSpeech (app_context, new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status == TextToSpeech.ERROR) { Toast.makeText(getApplicationContext(), "Erro ao inicializar a síntese de voz”, Toast.LENGTH_SHORT).show(); } } }); ... if (tts != null) tts.speak(nome, TextToSpeech.QUEUE_FLUSH, null); Serviços: são todos mais ou menos parecidos em termos de uso TXXX gerente = GetSystemService(XXX_SERVICE); gerente.fazAlgo(parametros) Ver manual... ACCESSIBILITY_SERVICE ACCOUNT_SERVICE ACTIVITY_SERVICE ALARM_SERVICE APP_OPS_SERVICE AUDIO_SERVICE BLUETOOTH_SERVICE CAPTIONING_SERVICE CLIPBOARD_SERVICE CONNECTIVITY_SERVICE CONSUMER_IR_SERVICE DEVICE_POLICY_SERVICE DISPLAY_SERVICE DOWNLOAD_SERVICE DROPBOX_SERVICE INPUT_METHOD_SERVICE INPUT_SERVICE KEYGUARD_SERVICE LAYOUT_INFLATER_SERVICE LOCATION_SERVICE MEDIA_ROUTER_SERVICE NFC_SERVICE NOTIFICATION_SERVICE NSD_SERVICE POWER_SERVICE PRINT_SERVICE SEARCH_SERVICE SENSOR_SERVICE STORAGE_SERVICE TELEPHONY_SERVICE TEXT_SERVICE S_MANAGER_SERVICE UI_MODE_SERVICE USB_SERVICE USER_SERVICE VIBRATOR_SERVICE WALLPAPER_SERVICE WIFI_P2P_SERVICE WIFI_SERVICE WINDOW_SERVICE Exemplo: vibrador Vibrator vib = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); long[] SOS = { // código morse SOS 0, // Inicia automaticamente 200,200, 200,200, 200,200, // s ponto _ ponto _ ponto 500, 500,200, 500,200, 2600,200, // o traço _ traço _ traço 500 , 200,200, 200,200, 200,200, // s ponto _ ponto _ ponto 1000 }; vib.vibrate(SOS, -1); // -1 = vibra uma vez só, agora