A 1 day NTU workshop for kickstarting Android development. Includes using the newest & better IDE - Android Studio - and a thorough process from developing you idea > mockup > coding > polishing > distributing.
36. dpi = dots per inch
dp = density independent pixels
for graphics
(1dp might be 1 pixel or 2 pixels, depending on the dpi)
sp = scale independent pixels
for fonts
45. Activity
• Launch an Activity by calling
startActivity(intent)
Launch a known Activity
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
Launch a system Activity
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);
46. Activity
•
Activity must be declared in AndroidManifest.xml
<manifest ... >
<application ... >
<activity android:name=".HelloWorldActivity" />
...
</application ... >
...
</manifest >
.HelloWorldActivity is shorthand for com.just2us.helloworld.HelloWorldActivity
47. Service
•
Service runs in the background, even when user is not
interacting with your app
•
•
•
Service or Thread ?
To start, call startService()
Similar to Activity, has its lifecycle and various event
callbacks
48. ContentProvider
• A way to share data across applications,
including apps such as phonebook,
calendar, etc.
• You can access the phonebook data using a
ContentResolver
• Have query, insert, delete methods (SQLite)
ContentResolver cr = getContentResolver();
cr.query(“content://android.provider.Contacts.Phones.CONTACT_URI”,
projection,
selection, selectionArg,
sortOrder)
49. BroadcastReceiver
• Responds to system-wide broadcast
announcements such as incoming phone
call, SMS sent, picture captured, etc
57. User Interfaces
• 3 ways to construct UI
1. Drag-and-drop interface builder
2. XML
3. Code
58. The way of XML
/res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
looks in /res/values/string.xml, and
find the value for the key “hello”
Equivalently..
android:text="Hello world too!"
59. The way of XML
/res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
setContentView() inflate main.xml and set the views
60. The way of Code
package com.just2us.helloandroid;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textview = new TextView(this);
textview.setText("Hello, Android");
setContentView(textview);
}
}
Creating a TextView and set the text
Similarly to the way of XML, setContentView()
61. Preferences
• The easiest way to store information
• NOT only store preferences/settings, but
also arbitrary key-value pairs
• SharedPreference class
• getBoolean, setBoolean, etc..
62. Preferences
public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
}
// Restore preferences
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
@Override
protected void onStop(){
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Commit the edits!
editor.commit();
}
}
63. Network
• Connect to web services over HTTP
• Permission needed in Manifest
<uses-permission android:name="android.permission.INTERNET" />
• A few different ways to connect
• HttpClient is most robust
64. Network - GET
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://www.myserver.com/script1.php");
// Execute HTTP GET request and get response
HttpResponse response = client.execute(request);
InputStream is = response.getEntity().getContent();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
// Do what you need with content StringBuffer sb = new StringBuffer("");
String line = "";
String NL = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
sb.append(line + NL);
}
in.close();
String content = sb.toString();
// Do what you need with content
...
65. Network - POST
HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost("http://www.myserver.com/login_script.php");
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("username", "samwize"));
nameValuePairs.add(new BasicNameValuePair("password", "123456"));
request.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP POST Request
HttpResponse response = httpclient.execute(request);
67. Multimedia - Camera
• 2 ways to capture photo
• Using capture intent
• Using Camera class directly
68. Multimedia - Camera
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
Capture photo
69. Multimedia - Camera
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//create new Intent
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); // create a file to save the video
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high
// start the Video Capture Intent
startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
}
Capture video
70. Multimedia - Camera
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Image captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Image saved to:n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
}
if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Video captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Video saved to:n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the video capture
} else {
// Video capture failed, advise user
}
}
Handling after photo/video is captured by camera app
71. Multimedia - MediaPlayer
• Play audio and video from:
• /res/raw/
• File system (internal or external)
• Stream over Internet
• MediaPlayer class
91. The steps in brief..
• Edit layout
• Add background image
• Custom font
• Button with background image
• Button with states
Refer to hand-out 3 notes
94. Database
public class DictionaryOpenHelper extends SQLiteOpenHelper {
private
private
private
static final int DATABASE_VERSION = 2;
static final String DICTIONARY_TABLE_NAME = "dictionary";
static final String DICTIONARY_TABLE_CREATE =
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
KEY_WORD + " TEXT, " +
KEY_DEFINITION + " TEXT);";
DictionaryOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DICTIONARY_TABLE_CREATE);
}
95. Database
• Call getWritableDatabase() or
getReadableDatabase() to get an
SQLiteDatabase object
• With SQLiteDatabase, call query() to
execute SQL queries
96. More Topics
• Location (GPS) and Map
• Bluetooth
• USB host and accessory
• Animation
• OpenGL ES
• Push Messaging (GCM)