Android Crashcourse
@AlexeyBuzdin 15.06.2013
Android
Java SE + Android.jar
Dalvik runtime
Component based MVC
Project Structure
Project Structure
Source code in Java
Images, gradients, etc
UI written in XML
Reference Data (Strings, colors, arrays)
App config file
Activity
Activity
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.main);
}
}
Activity states
Context
Interface to global information about an
application environment.
Up-calls for application-level operations such
as launching activities, broadcasting and
receiving intents, etc.
Context examples
TextView text = new TextView(context);
new ArrayAdapter(context, R.layout.item, myList)
context.getExternalCacheDir()
context.getResources()
context.startActivity(navigationIntent)
R.java
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.main);
}
}
R.java (resource)
Auto generated interface between src and android
resources. Used only for compilation time.
R.java
Project Structure
Views
Views
Views - TextView, EditText, Button ...
ViewGroup - LinearLayout, RelativeLayout ...
AdapterView - Spinner, Gallery, ListView ...
res/layout/
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.
android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
res/layout/
<LinearLayout xmlns:android="http://schemas.
android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/textView"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/app_name"/>
</LinearLayout>
res/layout/
Views. Java part
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView text = (TextView) findViewById(R.id.textView);
}
Views. Java part
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView text = (TextView) findViewById(R.id.textView);
text.findViewById(0); // same method invocation
}
Under the hood. LayoutInflater
LayoutInflater inflater = context.getLayoutInflater();
View view = inflater.inflate(R.layout.main, null);
Under the hood. LayoutInflater
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = context.getLayoutInflater();
View view = inflater.inflate(R.layout.main, null);
setContentView(view);
TextView text = (TextView) view.findViewById(R.id.textView);
}
Event Handling
Button button = new Button(context);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Toast.makeText(MyActivity.this, "Hello
World", Toast.LENGTH_SHORT).show();
}
});
Event Handling
For Views
OnLongClickListener
OnSelectListener
OnHoverListener
.....
For AdapterView
OnItemClickListener
OnItemLongClickListener
TextView
ListView
?
Adapter
AdapterView
Gallery gallery = (Gallery) findViewById(R.id.gallery);
ArrayList<String> list = new ArrayList<String>();
gallery.setAdapter(new ArrayAdapter<String>(this, 0, list){
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
// 1. Check if view already exists
// 2. If not - Inflate view
// 3. Populate view
return view;
}
});
Intent
Abstract description of an operation to be performed.
External Intents
Open URL
Call a Person
Share an Image
Internal Intents
Start Activity
Example
Intent intent = new Intent(context, SecondActivity.class);
startActivity(intent);
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("url", url);
intent.putExtra("bean", serializable);
startActivity(intent);
Example
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.article_detail);
String s = getIntent().getStringExtra("url");
Bean b = (Bean)getIntent().getSerializableExtra("bean");
}
AndroidManifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="lv.ldn.rssreader"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:icon="@drawable/starred" android:label="@string/app_name">
<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>
AndroidManifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="lv.ldn.rssreader"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:icon="@drawable/starred" android:label="@string/app_name">
<activity android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"/>
</application>
</manifest>
AsyncTask
public class MyTask extends AsyncTask<Integer, Void, String>{
protected void onPreExecute() {
}
protected String doInBackground(Integer... integers) {
return null;
}
protected void onPostExecute(String result) {
}
}
AsyncTask
MyTask task = new MyTask();
task.execute(value)

Android crashcourse