Introduction to Android Development
Activities and UI
Intents
Services
Broadcast Receivers
Activities and UI
Activities and UI
A screen
Application = Σ activity
Activity Lifecycle
Managed by ActivityManager
Activity Lifecycle
Developer says what happens at each state
$
¢
Activity Lifecycle
Managed by ActivityManager
D/MyActivity( 1146): onCreateD/MyActivity( 1146): onStartD/MyActivity( 1146): onResume
First time run
D/MyActivity( 1146): onClickAnotherActivityD/MyActivity( 1146): onPauseD/MyActivity( 1146): onStopD/MyActivity( 1146): onRestartD/MyActivity( 1146): onStartD/MyActivity( 1146): onResume
Open another activity, then Back button
Activity Lifecycle
D/MyActivity( 1146): onPauseD/MyActivity( 1146): onStopD/MyActivity( 1146): onDestroyD/MyActivity( 1146): onCreateD/MyActivity( 1146): onStartD/MyActivity( 1146): onResume
Rotate screen
Activity Lifecycle
D/MyActivity( 1146): onPauseD/MyActivity( 1146): onStop
Home Button
D/MyActivity( 1146): onPauseD/MyActivity( 1146): onStopD/MyActivity( 1146): onDestroyD/MyActivity( 1146): onCreateD/MyActivity( 1146): onStartD/MyActivity( 1146): onResume
Rotate screen
Activity Lifecycle
package ro.gdgcluj.demoapp;
import android.app.Activity;import android.os.Bundle;import android.util.Log;
public class MyActivity extends Activity {
static final String TAG = MyActivity.class.getSimpleName();
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); Log.d(TAG, "onCreate"); }
@Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart"); }
@Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); }
@Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); }
@Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart"); }
@Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop"); }
@Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); }
}
Activity Lifecycle
package ro.gdgcluj.demoapp;
import android.app.Activity;import android.os.Bundle;import android.util.Log;
public class MyActivity extends Activity {
static final String TAG = MyActivity.class.getSimpleName();
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); Log.d(TAG, "onCreate"); }
@Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart"); }
@Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); }
@Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); }
@Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart"); }
@Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop"); }
@Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); }
}
Declaring the Activity
<manifest ... > <application ... > <activity android:name=".MyActivity" /> ... </application ... > ...</manifest >
Let your application know about your Activity into the AndroidManifest.xml
For your main activity use Intent Filters
<manifest ... > <application ... > <activity android:name=".MyActivity" > <intent-filter> <action android:name= "android.intent.action.MAIN" /> <category android:name= "android.intent.category.LAUNCHER" /> <intent-filter /> <activity /> </application ... > ...</manifest >
<manifest ... > <application ... > <activity android:name=".MyActivity" /> ... </application ... > ...</manifest >
Let your application know about your Activity into the AndroidManifest.xml
Declaring the Activity
Building Android UI
XML
Declare UI in XML
Inflate XML in Java files
Building Android UI
Programmatically
Initialize new widgets
Customize properties for each
VS.
XML
Declare UI in XML
Inflate XML in Java files
Use them both
Programmatically
Initialize new widgets
Customize properties for each
VS.
XML
Declare UI in XML
Inflate XML in Java files
Building Android UI
Layouts and views hierarchy
Intents
Used to start activities, start/stop services, or send broadcasts
Intents
startActivity(Intent activity);
startService(Intent service);
stopService(Intent service);
sendBroadcast(Intent intent);
Using Intents
startActivity(new Intent(this, TargetActivity.class));
startService(new Intent(this, TargetService.class));
Explicit Intents
startService(new Intent("example.intent.action.IntentService"));
sendBroadcast(new Intent("example.intent.action.Receiver"));
Implicit Intents
startActivity(new Intent(this, TargetActivity.class));
startService(new Intent(this, TargetService.class));
Explicit Intents
<service android:name=".IntentService"> <intent-filter> <action android:name="example.intent.action.IntentService" /> </intent-filter></service>
<receiver android:name=".Receiver"> <intent-filter> <action android:name="example.intent.action.Receiver" /> </intent-filter></receiver>
startService(new Intent("example.intent.action.IntentService"));
sendBroadcast(new Intent("example.intent.action.Receiver"));
Implicit Intents
startActivity(new Intent(this, TargetActivity.class));
startService(new Intent(this, TargetService.class));
Explicit Intents
AndroidManifest.xml
Intent FiltersActivity
Service
Receiver
Action
<intent-filter> <action android:name="any.action.you.want" /></intent-filter>
Intent Filters
Action
Activity
Service
Receiver
AndroidManifeset.xml
Services
Run in background
Don’t have UI
Run on the UI thread
Services
UI Activity
Service
startService(); stopService();
Services
Run in background
Don’t have UI
Run on the UI thread
Service starts and "runs" until it gets a request to stop
To offload work from main thread, use intent service.
Intent service uses worker thread, stops when done with work.
Service Lifecycle
package ro.gdgcluj.demoapp;
import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;
public class MyService extends Service { static final String TAG = MyService.class.getSimpleName();
@Override public IBinder onBind(Intent arg0) { return null; }
@Override public void onCreate() { Log.d(TAG, "onCreate"); }
@Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand"); return START_STICKY; }
@Override public void onDestroy() { Log.d(TAG, "onDestroy"); }
}
Service Example
<service android:name=".ServiceDemo"></service>
Called via its class name
<service android:name=".IntentService"> <intent-filter> <action android:name="example.intent.action.IntentService" /> </intent-filter></service>
Declaring the Service
Called via action
Broadcast Receivers
Intent based publish-subscribe mechanism
Listening system events: incoming calls, SMS messages a.o.
Broadcast Receivers
Register for certain intents
Get notified when intent happens
Intent based publish-subscribe mechanism
Listening system events: incoming calls, SMS messages a.o.
Broadcast Receivers
package ro.gdgcluj.demoapp;
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;
public class Receiver extends BroadcastReceiver { static final String TAG = Receiver.class.getSimpleName();
@Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "onReceive action: "+intent.getAction() ); }
}
Broadcast Receiver Example
<receiver android:name=".ReceiverDemo"> <intent-filter> <action android:name="example.intent.action.Receiver" /> </intent-filter></receiver>
Declaring it in AndroidManifest.xml
Registering the Broadcast Receiver
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... // Create the receiver receiver = new Receiver(); filter = new IntentFilter( ANY_INTENT_ACTION );}
protected void onResume() { super.onResume(); super.registerReceiver(receiver, filter);}
@Overrideprotected void onPause() { super.onPause(); unregisterReceiver(receiver);}
Registering the Broadcast Receiver
Registering Programmatically
QuestionsThat’s all!
Recommended