Contents
Android Tutorial ..............................................................................................................................7
Audience...........................................................................................................................................7
Prerequisites.....................................................................................................................................7
What is Android?............................................................................................................................8
Why Android ?................................................................................................................................9
Features of Android........................................................................................................................9
Android Applications.....................................................................................................................10
Categories of Android applications.................................................................................................10
History of Android.........................................................................................................................11
What is API level?.........................................................................................................................11
Android - Environment Setup............................................................................................................12
Set-up Java Development Kit (JDK).................................................................................................13
Android IDEs.................................................................................................................................13
Android - Architecture ......................................................................................................................13
Linux kernel..................................................................................................................................14
Libraries.......................................................................................................................................14
Android Libraries ..........................................................................................................................14
Android Runtime ..........................................................................................................................15
Application Framework.................................................................................................................15
Applications..................................................................................................................................16
Android - Application Components....................................................................................................16
Activities......................................................................................................................................16
Services........................................................................................................................................16
Broadcast Receivers......................................................................................................................17
Content Providers.........................................................................................................................17
Additional Components.................................................................................................................17
Android - Hello World Example..........................................................................................................18
Create AndroidApplication ...........................................................................................................18
Anatomy of Android Application....................................................................................................20
The Main Activity File....................................................................................................................22
The Manifest File..........................................................................................................................23
The Strings File .............................................................................................................................24
The R File .....................................................................................................................................24
The Layout File .............................................................................................................................25
Running the Application................................................................................................................26
Create AndroidApplication on Android studio................................................................................27
Android Resources Organizing & Accessing ........................................................................................27
Organize Resources in eclipse........................................................................................................28
Organize resource in Android Studio..............................................................................................28
Alternative Resources ...................................................................................................................29
Accessing Resources .....................................................................................................................30
Accessing Resourcesin Code......................................................................................................30
Example....................................................................................................................................30
Example....................................................................................................................................31
Example....................................................................................................................................31
Accessing Resourcesin XML.......................................................................................................32
Android - Activities...........................................................................................................................32
Example.......................................................................................................................................34
Android - Services.............................................................................................................................37
Example.......................................................................................................................................40
Android - Broadcast Receivers...........................................................................................................44
Creating the Broadcast Receiver....................................................................................................45
Registering Broadcast Receiver......................................................................................................45
Broadcasting Custom Intents.........................................................................................................46
Example.......................................................................................................................................47
Android - Content Providers..............................................................................................................53
Content URIs ................................................................................................................................54
Create Content Provider................................................................................................................55
Example.......................................................................................................................................56
Android - Fragments.........................................................................................................................66
Fragment Life Cycle.......................................................................................................................68
How to use Fragments?.................................................................................................................69
Types of Fragments.......................................................................................................................69
Android - Intents and Filters..............................................................................................................69
Intent Objects...............................................................................................................................71
Action.......................................................................................................................................71
Data .........................................................................................................................................71
Category...................................................................................................................................72
Extras.......................................................................................................................................73
Flags.........................................................................................................................................73
Component Name.....................................................................................................................73
Types of Intents............................................................................................................................74
Explicit Intents..........................................................................................................................74
Implicit Intents..........................................................................................................................75
Example.......................................................................................................................................76
Intent Filters.................................................................................................................................81
Example.......................................................................................................................................82
Android - UI Layouts .........................................................................................................................91
Android Layout Types....................................................................................................................92
Layout Attributes..........................................................................................................................93
View Identification........................................................................................................................94
Android - UI Controls........................................................................................................................94
Android UI Controls ......................................................................................................................95
Create UI Controls.........................................................................................................................96
Android - Event Handling..................................................................................................................97
Event Listeners & Event Handlers...................................................................................................97
Event Listeners Registration ..........................................................................................................98
Touch Mode.................................................................................................................................99
Focus...........................................................................................................................................99
onTouchEvent()............................................................................................................................99
Event Handling Examples ............................................................................................................ 100
Event Listeners Registration Using an Anonymous Inner Class.................................................... 100
Exercise......................................................................................................................................103
Android - Styles and Themes........................................................................................................... 104
Defining Styles............................................................................................................................ 104
Using Styles................................................................................................................................ 104
Style Inheritance......................................................................................................................... 105
Applying Colors to Theme Attributes............................................................................................ 106
Using a Custom Nine-Patch With Buttons..................................................................................... 107
Steps to create Nine-Patch Buttons.......................................................................................... 108
Android Themes ......................................................................................................................... 109
Styling the colour palette ............................................................................................................ 110
Default Styles & Themes.............................................................................................................. 111
Android - Custom Components........................................................................................................ 111
Creating a Simple Custom Component......................................................................................... 112
Instantiate using code inside activity class ................................................................................ 116
Instantiate using Layout XML file.............................................................................................. 117
Custom Component with Custom Attributes ................................................................................ 117
Step 1.....................................................................................................................................118
Step 2.....................................................................................................................................118
Step 3.....................................................................................................................................118
Android - Drag and Drop................................................................................................................. 119
The Drag/Drop Process ............................................................................................................... 119
The DragEvent Class.................................................................................................................... 120
Constants................................................................................................................................ 120
Methods.................................................................................................................................121
Listening for Drag Event .............................................................................................................. 121
Starting a Drag Event................................................................................................................... 122
Example.....................................................................................................................................122
Android - Notifications.................................................................................................................... 128
Create and Send Notifications......................................................................................................129
Step 1 - Create Notification Builder .......................................................................................... 130
Step 2 - Setting Notification Properties..................................................................................... 130
Step 3 - Attach Actions............................................................................................................. 130
Step 4 - Issue the notification...................................................................................................131
The NotificationCompat.Builder Class .......................................................................................... 131
Example.....................................................................................................................................132
Big View Notification................................................................................................................... 138
Android - Location Based Services ...................................................................................................139
The Location Object.................................................................................................................... 140
Get the Current Location............................................................................................................. 141
Get the Updated Location ........................................................................................................... 142
Location Quality of Service.......................................................................................................... 142
Displaying a Location Address......................................................................................................143
Example.....................................................................................................................................143
Install the Google Play Services SDK.......................................................................................... 143
Create AndroidApplication......................................................................................................144
Android - Sending Email.................................................................................................................. 153
Intent Object - Action to send Email............................................................................................. 154
Intent Object - Data/Type to send Email....................................................................................... 154
Intent Object - Extra to send Email............................................................................................... 154
Example.....................................................................................................................................155
Android - Sending SMS.................................................................................................................... 160
Example.....................................................................................................................................161
Using Built-in Intent to send SMS.................................................................................................166
Intent Object - Action to send SMS .............................................................................................. 166
Intent Object - Data/Type to send SMS ........................................................................................ 167
Intent Object - Extra to send SMS ................................................................................................ 167
Example.....................................................................................................................................167
Android - Phone Calls...................................................................................................................... 174
Intent Object - Action to make Phone Call.................................................................................... 174
Intent Object - Data/Type to make Phone Call.............................................................................. 174
Example.....................................................................................................................................174
Publishing Android Application........................................................................................................ 181
Export Android Application Process ............................................................................................. 182
Google Play Registration ............................................................................................................. 184
Signing Your App Manually.......................................................................................................... 185
Some of App markets.................................................................................................................. 186
Android - Alert Dialog Tutorial......................................................................................................... 188
Dialog fragment.......................................................................................................................... 189
List dialog...................................................................................................................................190
Single-choice list dialog............................................................................................................... 190
Example.....................................................................................................................................191
Android Tutorial
Android is an open source and Linux-based operating system for mobile devices such as
smartphones and tablet computers. Android was developed by the Open Handset Alliance, led by
Google, and other companies.
This tutorial will teach you basic Android programming and will also take you through some
advance concepts related to Android application development.
Audience
This tutorial has been prepared for the beginners to help them understand basic Android
programming. After completing this tutorial you will find yourself at a moderate level of
expertise in Android programming from where you can take yourself to next levels.
Prerequisites
Android programming is based on Java programming language so if you have basic
understanding on Java programming then it will be a fun to learn Android application
development.
What is Android?
Android is an open source and Linux-based Operating System for mobile devices such as
smartphones and tablet computers. Android was developed by the Open Handset Alliance, led by
Google, and other companies.
Android offers a unified approach to application development for mobile devices which means
developers need only develop for Android, and their applications should be able to run on
different devices powered by Android.
The first beta version of the Android Software Development Kit (SDK) was released by Google
in 2007 where as the first commercial version, Android 1.0, was released in September 2008.
On June 27, 2012, at the Google I/O conference, Google announced the next Android version,
4.1 Jelly Bean. Jelly Bean is an incremental update, with the primary aim of improving the user
interface, both in terms of functionality and performance.
The source code for Android is available under free and open source software licenses. Google
publishes most of the code under the Apache License version 2.0 and the rest, Linux kernel
changes, under the GNU General Public License version 2.
Why Android ?
Features of Android
Android is a powerful operating system competing with Apple 4GS and supports great features.
Few of them are listed below:
Feature Description
Beautiful UI AndroidOS basicscreenprovidesabeautiful andintuitiveuserinterface.
Connectivity GSM/EDGE, IDEN,CDMA, EV-DO,UMTS, Bluetooth,Wi-Fi,LTE,NFCandWiMAX.
Storage SQLite,a lightweightrelationaldatabase,isusedfordatastorage purposes.
Mediasupport H.263, H.264, MPEG-4 SP,AMR, AMR-WB, AAC,HE-AAC,AAC5.1, MP3, MIDI, Ogg
Vorbis,WAV,JPEG,PNG,GIF,and BMP
Messaging SMS and MMS
Webbrowser Basedon the open-source WebKitlayoutengine,coupledwithChrome'sV8
JavaScriptengine supportingHTML5 and CSS3.
Multi-touch Androidhasnative supportformulti-touchwhichwasinitiallymade available in
handsetssuchas the HTC Hero.
Multi-tasking User can jumpfromone taskto anotherand same time variousapplicationcanrun
simultaneously.
Resizable widgets Widgetsare resizable,souserscanexpandthemtoshow more contentor shrink
themto save space
Multi-Language Supportssingle directionandbi-directional text.
GCM Google CloudMessaging(GCM) isa service thatletsdeveloperssendshort
message datato theirusersonAndroiddevices,withoutneedingaproprietary
sync solution.
Wi-Fi Direct A technologythatletsappsdiscoverandpairdirectly,overahigh-bandwidthpeer-
to-peerconnection.
AndroidBeam A popularNFC-basedtechnologythat letsusersinstantlyshare,justbytouching
twoNFC-enabledphonestogether.
Android Applications
Android applications are usually developed in the Java language using the Android Software
Development Kit.
Once developed, Android applications can be packaged easily and sold out either through a store
such as Google Play,SlideME,Opera Mobile Store,Mobango,F-droid and the Amazon
Appstore.
Android powers hundreds of millions of mobile devices in more than 190 countries around the
world. It's the largest installed base of any mobile platform and growing fast. Every day more
than 1 million new Android devices are activated worldwide.
This tutorial has been written with an aim to teach you how to develop and package Android
application. We will start from environment setup for Android application programming and
then drill down to look into various aspects of Android applications.
Categories of Android applications
There are many android applications in the market. The top categories are:
History of Android
The code names of android ranges from A to L currently, such as Aestro, Blender, Cupcake,
Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream Sandwitch, Jelly Bean, KitKat and
Lollipop. Let's understand the android history in a sequence.
What is API level?
API Level is an integer value that uniquely identifies the framework API revision offered by a
version of the Android platform.
Platform Version API Level VERSION_CODE
Android5.1 22 LOLLIPOP_MR1
Android5.0 21 LOLLIPOP
Android4.4W 20 KITKAT_WATCH KitKatforWearablesOnly
Android4.4 19 KITKAT
Android4.3 18 JELLY_BEAN_MR2
Android4.2, 4.2.2 17 JELLY_BEAN_MR1
Android4.1, 4.1.1 16 JELLY_BEAN
Android4.0.3, 4.0.4 15 ICE_CREAM_SANDWICH_MR1
Android4.0, 4.0.1, 4.0.2 14 ICE_CREAM_SANDWICH
Android3.2 13 HONEYCOMB_MR2
Android3.1.x 12 HONEYCOMB_MR1
Android3.0.x 11 HONEYCOMB
Android 2.3.4
Android 2.3.3
10 GINGERBREAD_MR1
Android 2.3.2
Android 2.3.1
Android 2.3
9 GINGERBREAD
Android2.2.x 8 FROYO
Android2.1.x 7 ECLAIR_MR1
Android2.0.1 6 ECLAIR_0_1
Android2.0 5 ECLAIR
Android1.6 4 DONUT
Android1.5 3 CUPCAKE
Android1.1 2 BASE_1_1
Android1.0 1 BASE
Android - Environment Setup
You will be glad to know that you can start your Android application development on either of
the following operating systems −
 Microsoft Windows XP or later version.
 Mac OS X 10.5.8 or later version with Intel chip.
 Linux including GNU C Library 2.7 or later.
Second point is that all the required tools to develop Android applications are freely available
and can be downloaded from the Web. Following is the list of software's you will need before
you start your Android application programming.
 Java JDK5 or later version
 Android SDK
 Java Runtime Environment (JRE) 6
 Android Studio
 Eclipse IDE for Java Developers (optional)
 Android Development Tools (ADT) Eclipse Plug-in (optional)
Here last two components are optional and if you are working on Windows machine then these
components make your life easy while doing Java based application development. So let us have
a look how to proceed to set required environment.
Set-up Java Development Kit (JDK)
You can download the latest version of Java JDK from Oracle's Java site: Java SE Downloads.
You will find instructions for installing JDK in downloaded files, follow the given instructions to
install and configure the setup. Finally set PATH and JAVA_HOME environment variables to
refer to the directory that contains java and javac, typically java_install_dir/bin and
java_install_dir respectively.
If you are running Windows and installed the JDK in C:jdk1.6.0_15, you would have to put the
following line in your C:autoexec.bat file.
set PATH=C:jdk1.7.0_75bin;%PATH%
set JAVA_HOME=C:jdk1.7.0_75
Alternatively, you could also right-click on My Computer, select Properties, then Advanced, then
Environment Variables. Then, you would update the PATH value and press the OK button.
On Linux, if the SDK is installed in /usr/local/jdk1.6.0_15 and you use the C shell, you would
put the following code into your .cshrc file.
setenv PATH /usr/local/jdk1.7.0_75/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.7.0_75
Alternatively, if you use an Integrated Development Environment (IDE) Eclipse, then it will
know automatically where you have installed your Java.
Android IDEs
There are so many sophisticated Technologies are available to develop android applications, the
familiar technologies, which are predominantly using tools as follows
 Android Studio
 Eclipse IDE
Android - Architecture
Android operating system is a stack of software components which is roughly divided into five
sections and four main layers as shown below in the architecture diagram.
Linux kernel
At the bottom of the layers is Linux - Linux 3.6 with approximately 115 patches. This provides a
level of abstraction between the device hardware and it contains all the essential hardware
drivers like camera, keypad, display etc. Also, the kernel handles all the things that Linux is
really good at such as networking and a vast array of device drivers, which take the pain out of
interfacing to peripheral hardware.
Libraries
On top of Linux kernel there is a set of libraries including open-source Web browser engine
WebKit, well known library libc, SQLite database which is a useful repository for storage and
sharing of application data, libraries to play and record audio and video, SSL libraries
responsible for Internet security etc.
Android Libraries
This category encompasses those Java-based libraries that are specific to Android development.
Examples of libraries in this category include the application framework libraries in addition to
those that facilitate user interface building, graphics drawing and database access. A summary of
some key core Android libraries available to the Android developer is as follows −
 android.app − Provides access to the application model and is the cornerstone of all
Android applications.
 android.content − Facilitates content access, publishing and messaging between
applications and application components.
 android.database − Used to access data published by content providers and includes
SQLite database management classes.
 android.opengl − A Java interface to the OpenGL ES 3D graphics rendering API.
 android.os − Provides applications with access to standard operating system services
including messages, system services and inter-process communication.
 android.text − Used to render and manipulate text on a device display.
 android.view − The fundamental building blocks of application user interfaces.
 android.widget − A rich collection of pre-built user interface components such as
buttons, labels, list views, layout managers, radio buttons etc.
 android.webkit − A set of classes intended to allow web-browsing capabilities to be
built into applications.
Having covered the Java-based core libraries in the Android runtime, it is now time to turn our
attention to the C/C++ based libraries contained in this layer of the Android software stack.
Android Runtime
This is the third section of the architecture and available on the second layer from the bottom.
This section provides a key component called Dalvik Virtual Machine which is a kind of Java
Virtual Machine specially designed and optimized for Android.
The Dalvik VM makes use of Linux core features like memory management and multi-threading,
which is intrinsic in the Java language. The Dalvik VM enables every Android application to run
in its own process, with its own instance of the Dalvik virtual machine.
The Android runtime also provides a set of core libraries which enable Android application
developers to write Android applications using standard Java programming language.
Application Framework
The Application Framework layer provides many higher-level services to applications in the
form of Java classes. Application developers are allowed to make use of these services in their
applications.
The Android framework includes the following key services −
 Activity Manager − Controls all aspects of the application lifecycle and activity stack.
 Content Providers − Allows applications to publish and share data with other
applications.
 Resource Manager − Provides access to non-code embedded resources such as strings,
color settings and user interface layouts.
 Notifications Manager − Allows applications to display alerts and notifications to the
user.
 View System − An extensible set of views used to create application user interfaces.
Applications
You will find all the Android application at the top layer. You will write your application to be
installed on this layer only. Examples of such applications are Contacts Books, Browser, Games
etc.
Android - Application Components
Application components are the essential building blocks of an Android application. These
components are loosely coupled by the application manifest file AndroidManifest.xml that
describes each component of the application and how they interact.
There are following four main components that can be used within an Android application:
Components Description
Activities Theydictate the UI andhandle the userinteractiontothe smart phone
screen
Services They handle backgroundprocessingassociatedwithanapplication.
Broadcast Receivers Theyhandle communicationbetweenAndroidOSandapplications.
ContentProviders Theyhandle dataand database managementissues.
Activities
An activity represents a single screen with a user interface,in-short Activity performs actions on
the screen. For example, an email application might have one activity that shows a list of new
emails, another activity to compose an email, and another activity for reading emails. If an
application has more than one activity, then one of them should be marked as the activity that is
presented when the application is launched.
An activity is implemented as a subclass of Activity class as follows −
public class MainActivity extends Activity {
}
Services
A service is a component that runs in the background to perform long-running operations. For
example, a service might play music in the background while the user is in a different
application, or it might fetch data over the network without blocking user interaction with an
activity.
A service is implemented as a subclass of Service class as follows −
public class MyService extends Service {
}
Broadcast Receivers
Broadcast Receivers simply respond to broadcast messages from other applications or from the
system. For example, applications can also initiate broadcasts to let other applications know that
some data has been downloaded to the device and is available for them to use, so this is
broadcast receiver who will intercept this communication and will initiate appropriate action.
A broadcast receiver is implemented as a subclass of BroadcastReceiver class and each
message is broadcaster as an Intent object.
public class MyReceiver extends BroadcastReceiver {
public void onReceive(context,intent){}
}
Content Providers
A content provider component supplies data from one application to others on request. Such
requests are handled by the methods of the ContentResolver class. The data may be stored in the
file system, the database or somewhere else entirely.
A content provider is implemented as a subclass of ContentProvider class and must implement
a standard set of APIs that enable other applications to perform transactions.
public class MyContentProvider extends ContentProvider {
public void onCreate(){}
}
We will go through these tags in detail while covering application components in individual
chapters.
Additional Components
There are additional components which will be used in the construction of above mentioned
entities, their logic, and wiring between them. These components are −
Components Description
Fragments Representsaportionof userinterface inanActivity.
Views UI elementsthatare drawnon-screenincludingbuttons,listsformsetc.
Layouts View hierarchiesthatcontrol screenformatandappearance of the views.
Intents Messageswiringcomponentstogether.
Resources External elements,suchasstrings,constantsanddrawable pictures.
Manifest Configurationfile forthe application.
Android - Hello World Example
Let us start actual programming with Android Framework. Before you start writing your first
example using Android SDK, you have to make sure that you have set-up your Android
development environment properly as explained in Android - Environment Set-up tutorial. I also
assume that you have a little bit working knowledge with Eclipse IDE.
So let us proceed to write a simple Android Application which will print "Hello World!".
Create Android Application
The first step is to create a simple Android Application using Eclipse IDE. Follow the option
File -> New -> Project and finally select Android New Application wizard from the wizard
list. Now name your application as HelloWorld using the wizard window as follows:
Next, follow the instructions provided and keep all other entries as default till the final step.
Once your project is created successfully, you will have following project screen −
Anatomy of Android Application
Before you run your app, you should be aware of a few directories and files in the Android
project −
S.N. Folder, File & Description
1
src
This contains the .java source files for your project. By default, it includes an
MainActivity.java source file having an activity class that runs when your app is launched
using the app icon.
2
gen
This contains the .R file, a compiler-generated file that references all the resources found in
your project. You should not modify this file.
3
bin
This folder contains the Android package files .apk built by the ADT during the build
process and everything else needed to run an Android application.
4
res/drawable-hdpi
This is a directory for drawable objects that are designed for high-density screens.
5
res/layout
This is a directory for files that define your app's user interface.
6
res/values
This is a directory for other various XML files that contain a collection of resources, such as
strings and colours definitions.
7
AndroidManifest.xml
This is the manifest file which describes the fundamental characteristics of the app and
defines each of its components.
Following section will give a brief overview few of the important application files.
The Main Activity File
The main activity code is a Java file MainActivity.java. This is the actual application file which
ultimately gets converted to a Dalvik executable and runs your application. Following is the
default code generated by the application wizard for Hello World! application −
package com.example.helloworld;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Here, R.layout.activity_main refers to the activity_main.xml file located in the res/layout folder.
The onCreate() method is one of many methods that are figured when an activity is loaded.
The Manifest File
Whatever component you develop as a part of your application, you must declare all its
components in a manifest.xml which resides at the root of the application project directory. This
file works as an interface between Android OS and your application, so if you do not declare
your component in this file, then it will not be considered by the OS. For example, a default
manifest file will look like as following file −
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Here <application>...</application> tags enclosed the components related to the application.
Attribute android:icon will point to the application icon available under res/drawable-hdpi. The
application uses the image named ic_launcher.png located in the drawable folders
The <activity> tag is used to specify an activity and android:name attribute specifies the fully
qualified class name of the Activity subclass and the android:label attributes specifies a string to
use as the label for the activity. You can specify multiple activities using <activity> tags.
The action for the intent filter is named android.intent.action.MAIN to indicate that this activity
serves as the entry point for the application. The category for the intent-filter is named
android.intent.category.LAUNCHER to indicate that the application can be launched from the
device's launcher icon.
The @string refers to the strings.xml file explained below. Hence, @string/app_name refers to
the app_name string defined in the strings.xml file, which is "HelloWorld". Similar way, other
strings get populated in the application.
Following is the list of tags which you will use in your manifest file to specify different Android
application components:
 <activity>elements for activities
 <service> elements for services
 <receiver> elements for broadcast receivers
 <provider> elements for content providers
The Strings File
The strings.xml file is located in the res/values folder and it contains all the text that your
application uses. For example, the names of buttons, labels, default text, and similar types of
strings go into this file. This file is responsible for their textual content. For example, a default
strings file will look like as following file −
<resources>
<string name="app_name">HelloWorld</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
</resources>
The R File
The gen/com.example.helloworld/R.java file is the glue between the activity Java files like
MainActivity.java and the resources like strings.xml. It is an automatically generated file and you
should not modify the content of the R.java file. Following is a sample of R.java file −
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package com.example.helloworld;
public final class R {
public static final class attr {
}
public static final class dimen {
public static final int padding_large=0x7f040002;
public static final int padding_medium=0x7f040001;
public static final int padding_small=0x7f040000;
}
public static final class drawable {
public static final int ic_action_search=0x7f020000;
public static final int ic_launcher=0x7f020001;
}
public static final class id {
public static final int menu_settings=0x7f080000;
}
public static final class layout {
public static final int activity_main=0x7f030000;
}
public static final class menu {
public static final int activity_main=0x7f070000;
}
public static final class string {
public static final int app_name=0x7f050000;
public static final int hello_world=0x7f050001;
public static final int menu_settings=0x7f050002;
public static final int title_activity_main=0x7f050003;
}
public static final class style {
public static final int AppTheme=0x7f060000;
}
}
The Layout File
The activity_main.xml is a layout file available in res/layout directory, that is referenced by
your application when building its interface. You will modify this file very frequently to change
the layout of your application. For your "Hello World!" application, this file will have following
content related to default layout −
<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" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:padding="@dimen/padding_medium"
android:text="@string/hello_world"
tools:context=".MainActivity" />
</RelativeLayout>
This is an example of simple RelativeLayout which we will study in a separate chapter. The
TextView is an Android control used to build the GUI and it have various attributes like
android:layout_width, android:layout_height etc which are being used to set its width and height
etc.. The @string refers to the strings.xml file located in the res/values folder. Hence,
@string/hello_world refers to the hello string defined in the strings.xml file, which is "Hello
World!".
Running the Application
Let's try to run our Hello World! application we just created. I assume you had created your
AVD while doing environment set-up. To run the app from Eclipse, open one of your project's
activity files and click Run icon from the tool bar. Eclipse installs the app on your AVD and
starts it and if everything is fine with your set-up and application, it will display following
Emulator window −
Congratulations!!! you have developed your first Android Application and now just keep
following rest of the tutorial step by step to become a great Android Developer. All the very best.
Create Android Application on Android studio
There are so many tools are available to develop android applications. as per Google official
android development, they have launched android studio as official Android IDE
 Hello World
Android Resources Organizing & Accessing
There are many more items which you use to build a good Android application. Apart from
coding for the application, you take care of various other resources like static content that your
code uses, such as bitmaps, colors, layout definitions, user interface strings, animation
instructions, and more. These resources are always maintained separately in various sub-
directories under res/ directory of the project.
This tutorial will explain you how you can organize your application resources, specify
alternative resources and access them in your applications.
Organize Resources in eclipse
You should place each type of resource in a specific sub directory of your project's res/
directory. For example, here's the file hierarchy for a simple project:
MyProject/
src/
MyActivity.java
res/
drawable/
icon.png
layout/
activity_main.xml
info.xml
values/
strings.xml
The res/ directory contains all the resources in various sub directories. Here we have an image
resource, two layout resources, and a string resource file. Following table gives a detail about the
resource directories supported inside project res/ directory.
Organize resource in Android Studio
MyProject/
src/
main/
java/
MyActivity.java
res/
drawable/
icon.png
layout/
activity_main.xml
info.xml
values/
strings.xml
Directory Resource Type
anim/ XML filesthatdefinepropertyanimations.Theyare savedinres/anim/folderand
accessedfromthe R.anim class.
color/ XML filesthatdefineastate listof colors.Theyare savedinres/color/and
accessedfromthe R.color class.
drawable/ Image fileslike .png,.jpg,.gif orXML filesthatare compiledintobitmaps,state
lists,shapes,animationdrawable.Theyare savedinres/drawable/andaccessed
fromthe R.drawable class.
layout/ XML filesthatdefineauserinterface layout.Theyare savedinres/layout/and
accessedfromthe R.layout class.
menu/ XML filesthatdefineapplicationmenus,suchasan OptionsMenu, ContextMenu,
or Sub Menu.Theyare savedinres/menu/andaccessedfromthe R.menuclass.
raw/ Arbitraryfilestosave intheirraw form. Youneedto call
Resources.openRawResource() withthe resource ID,whichis R.raw.filenameto
opensuchraw files.
values/ XML filesthatcontainsimple values,suchasstrings,integers,andcolors.For
example,here are some filename conventionsforresourcesyoucancreate inthis
directory−
 arrays.xml for resource arrays, and accessed from the R.array class.
 integers.xml for resource integers, and accessed from the R.integer
class.
 bools.xml for resource boolean, and accessed from the R.bool class.
 colors.xml for color values, and accessed from the R.color class.
 dimens.xml for dimension values, and accessed from the R.dimen
class.
 strings.xml for string values, and accessed from the R.string class.
 styles.xml for styles, and accessed from the R.style class.
xml/ ArbitraryXML filesthatcan be readat runtime by callingResources.getXML().You
can save variousconfigurationfileshere whichwillbe usedatruntime.
Alternative Resources
Your application should provide alternative resources to support specific device configurations.
For example, you should include alternative drawable resources ( i.e.images ) for different screen
resolution and alternative string resources for different languages. At runtime, Android detects
the current device configuration and loads the appropriate resources for your application.
To specify configuration-specific alternatives for a set of resources, follow the following steps −
 Create a new directory in res/ named in the form <resources_name>-
<config_qualifier>. Here resources_name will be any of the resources mentioned in the
above table, like layout, drawable etc. The qualifier will specify an individual
configuration for which these resources are to be used. You can check official
documentation for a complete list of qualifiers for different type of resources.
 Save the respective alternative resources in this new directory. The resource files must be
named exactly the same as the default resource files as shown in the below example, but
these files will have content specific to the alternative. For example though image file
name will be same but for high resolution screen, its resolution will be high.
Below is an example which specifies images for a default screen and alternative images for high
resolution screen.
MyProject/
src/
main/
java/
MyActivity.java
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
layout/
activity_main.xml
info.xml
values/
strings.xml
Below is another example which specifies layout for a default language and alternative layout for
Arabic language.
MyProject/
src/
main/
java/
MyActivity.java
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
layout/
activity_main.xml
info.xml
layout-ar/
main.xml
values/
strings.xml
Accessing Resources
During your application development you will need to access defined resources either in your
code, or in your layout XML files. Following section explains how to access your resources in
both the scenarios −
AccessingResourcesinCode
When your Android application is compiled, a R class gets generated, which contains resource
IDs for all the resources available in your res/ directory. You can use R class to access that
resource using sub-directory and resource name or directly resource ID.
Example
To access res/drawable/myimage.png and set an ImageView you will use following code:
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
Here first line of the code make use of R.id.myimageview to get ImageView defined with id
myimageview in a Layout file. Second line of code makes use of R.drawable.myimage to get an
image with name myimage available in drawable sub-directory under /res.
Example
Consider next example where res/values/strings.xml has following definition:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello, World!</string>
</resources>
Now you can set the text on a TextView object with ID msg using a resource ID as follows:
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);
Example
Consider a layout res/layout/activity_main.xml with the following definition:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView" />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button" />
</LinearLayout>
This application code will load this layout for an Activity, in the onCreate() method as follows −
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
}
AccessingResourcesinXML
Consider the following resource XML res/values/strings.xml file that includes a color resource
and a string resource −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="opaque_red">#f00</color>
<string name="hello">Hello!</string>
</resources>
Now you can use these resources in the following layout file to set the text color and text string
as follows:
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="@color/opaque_red"
android:text="@string/hello" />
Now if you will go through previous chapter once again where I have explained Hello World!
example, and I'm sure you will have better understanding on all the concepts explained in this
chapter. So I highly recommend to check previous chapter for working example and check how I
have used various resources at very basic level.
Android - Activities
If you have worked with C, C++ or Java programming language then you must have seen that
your program starts from main() function. Very similar way, Android system initiates its
program with in an Activity starting with a call on onCreate() callback method. There is a
sequence of callback methods that start up an activity and a sequence of callback methods that
tear down an activity as shown in the below Activity life cycle diagram: (image courtesy :
android.com )
The Activity class defines the following call backs i.e. events. You don't need to implement all
the callbacks methods. However, it's important that you understand each one and implement
those that ensure your app behaves the way users expect.
Callback Description
onCreate() Thisis the firstcallbackand calledwhenthe activityisfirstcreated.
onStart() Thiscallbackis calledwhenthe activitybecomesvisible tothe user.
onResume() Thisis calledwhenthe userstartsinteractingwiththe application.
onPause() The pausedactivitydoesnotreceive userinputandcannotexecute anycode and
calledwhenthe currentactivityisbeingpausedandthe previousactivityisbeing
resumed.
onStop() Thiscallbackis calledwhenthe activityisnolongervisible.
onDestroy() Thiscallbackis calledbefore the activityisdestroyedbythe system.
onRestart() Thiscallbackis calledwhenthe activityrestartsafterstoppingit.
Example
This example will take you through simple steps to show Android application activity life cycle.
Follow the following steps to modify the Android application we created in Hello World
Example chapter:
Step Description
1
You will use eclipseIDEtocreate an Androidapplicationandname itas HelloWorld undera
package com.example.helloworld asexplainedinthe Hello World Examplechapter.
2 Modifymainactivityfile MainActivity.java asexplainedbelow.Keeprestof the filesunchanged.
3
Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file
src/com.example.helloworld/MainActivity.java. This file includes each of the fundamental life
cycle methods. The Log.d() method has been used to generate log messages:
package com.example.helloworld;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
public class MainActivity extends Activity {
String msg = "Android : ";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(msg, "The onCreate() event");
}
/** Called when the activity is about to become visible. */
@Override
protected void onStart() {
super.onStart();
Log.d(msg, "The onStart() event");
}
/** Called when the activity has become visible. */
@Override
protected void onResume() {
super.onResume();
Log.d(msg, "The onResume() event");
}
/** Called when another activity is taking focus. */
@Override
protected void onPause() {
super.onPause();
Log.d(msg, "The onPause() event");
}
/** Called when the activity is no longer visible. */
@Override
protected void onStop() {
super.onStop();
Log.d(msg, "The onStop() event");
}
/** Called just before the activity is destroyed. */
@Override
public void onDestroy() {
super.onDestroy();
Log.d(msg, "The onDestroy() event");
}
}
An activity class loads all the UI component using the XML file available in res/layout folder of
the project. Following statement loads UI components from res/layout/activity_main.xml file:
setContentView(R.layout.activity_main);
An application can have one or more activities without any restrictions. Every activity you define
for your application must be declared in your AndroidManifest.xml file and the main activity for
your app must be declared in the manifest with an <intent-filter> that includes the MAIN action
and LAUNCHER category as follows:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
If either the MAIN action or LAUNCHER category are not declared for one of your activities,
then your app icon will not appear in the Home screen's list of apps.
Let's try to run our modified Hello World! application we just modified. I assume you had
created your AVD while doing environment setup. To run the app from Eclipse, open one of
your project's activity files and click Run icon from the toolbar. Eclipse installs the app on
your AVD and starts it and if everything is fine with your setup and application, it will display
Emulator window and you should see following log messages in LogCat window in Eclipse
IDE:
07-19 15:00:43.405: D/Android :(866): The onCreate() event
07-19 15:00:43.405: D/Android :(866): The onStart() event
07-19 15:00:43.415: D/Android :(866): The onResume() event
Let us try to click Red button on the Android emulator and it will generate following events
messages in LogCat window in Eclipse IDE:
07-19 15:01:10.995: D/Android :(866): The onPause() event
07-19 15:01:12.705: D/Android :(866): The onStop() event
Let us again try to click Menu button on the Android emulator and it will generate following
events messages in LogCat window in Eclipse IDE:
07-19 15:01:13.995: D/Android :(866): The onStart() event
07-19 15:01:14.705: D/Android :(866): The onResume() event
Next, let us again try to click Back button on the Android emulator and it will generate
following events messages in LogCat window in Eclipse IDE and this completes the Activity
Life Cycle for an Android Application.
07-19 15:33:15.687: D/Android :(992): The onPause() event
07-19 15:33:15.525: D/Android :(992): The onStop() event
07-19 15:33:15.525: D/Android :(992): The onDestroy() event
Android - Services
tate Description
Started A service is startedwhenan applicationcomponent,suchasan activity,startsitby
callingstartService().Once started,aservice canrunin the background
indefinitely,evenif the componentthatstarteditisdestroyed.
Bound A service is boundwhenanapplicationcomponentbindstoitbycalling
bindService().A boundservice offersaclient-serverinterfacethatallows
componentstointeractwiththe service,sendrequests,getresults,andevendoso
across processeswithinterprocesscommunication(IPC).
A service has life cycle callback methods that you can implement to monitor changes in the
service's state and you can perform work at the appropriate stage. The following diagram on the
left shows the life cycle when the service is created with startService() and the diagram on the
right shows the life cycle when the service is created with bindService(): (image courtesy :
android.com )
To create an service, you create a Java class that extends the Service base class or one of its
existing subclasses. The Service base class defines various callback methods and the most
important are given below. You don't need to implement all the callbacks methods. However, it's
important that you understand each one and implement those that ensure your app behaves the
way users expect.
Callback Description
onStartCommand() The systemcallsthismethodwhenanothercomponent,suchasan activity,
requeststhatthe service be started,bycalling startService().If youimplement
thismethod,itisyour responsibilitytostopthe service whenitsworkisdone,by
callingstopSelf() orstopService()methods.
onBind() The systemcallsthismethodwhenanothercomponentwantstobindwiththe
service bycallingbindService().If youimplementthismethod,youmustprovide
an interface thatclientsuse tocommunicate withthe service,byreturningan
IBinderobject.You mustalwaysimplementthismethod,butif youdon'twant to
allowbinding,thenyoushouldreturn null.
onUnbind() The systemcallsthismethodwhenall clientshave disconnectedfromaparticular
interface publishedbythe service.
onRebind() The systemcallsthismethodwhennew clientshave connectedtothe service,
afterit had previouslybeennotifiedthatall haddisconnectedinits
onUnbind(Intent).
onCreate() The systemcallsthismethodwhenthe service isfirstcreatedusing
onStartCommand()oronBind().Thiscall isrequiredtoperformone-time set-up.
onDestroy() The systemcallsthismethodwhenthe service isnolongerusedandisbeing
destroyed.Yourservice shouldimplementthistocleanupanyresourcessuchas
threads, registeredlisteners,receivers,etc.
The following skeleton service demonstrates each of the life cycle methods −
package com.tutorialspoint;
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;
public class HelloService extends Service {
/** indicates how to behave if the service is killed */
int mStartMode;
/** interface for clients that bind */
IBinder mBinder;
/** indicates whether onRebind should be used */
boolean mAllowRebind;
/** Called when the service is being created. */
@Override
public void onCreate() {
}
/** The service is starting, due to a call to startService() */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return mStartMode;
}
/** A client is binding to the service with bindService() */
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/** Called when all clients have unbound with unbindService() */
@Override
public boolean onUnbind(Intent intent) {
return mAllowRebind;
}
/** Called when a client is binding to the service with bindService()*/
@Override
public void onRebind(Intent intent) {
}
/** Called when The service is no longer used and is being destroyed */
@Override
public void onDestroy() {
}
}
Example
This example will take you through simple steps to show how to create your own Android
Service. Follow the following steps to modify the Android application we created in Hello World
Example chapter:
Step Description
1
You will use AndroidStudioIDEtocreate an Androidapplicationandname itas My Application
undera package com.example.My Application asexplainedinthe Hello World Examplechapter.
2 Modifymainactivityfile MainActivity.java toaddstartService() andstopService() methods.
3
Create a newjavafile MyService.java underthe package com.example.My Application.Thisfile will
have implementationof Androidservice relatedmethods.
4
Define yourservice in AndroidManifest.xmlfile using<service.../>tag.Anapplicationcanhave one
or more serviceswithoutanyrestrictions.
5
Modifythe defaultcontentof res/layout/activity_main.xmlfile toincludetwobuttonsinlinear
layout.
6
No needtochange any constantsin res/values/strings.xmlfile.Androidstudiotake care of string
values
7
Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file src/com.example.My
Application/MainActivity.java. This file can include each of the fundamental life cycle
methods. We have added startService() and stopService() methods to start and stop the service.
package com.example.My Application;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
// Method to start the service
public void startService(View view) {
startService(new Intent(getBaseContext(), MyService.class));
}
// Method to stop the service
public void stopService(View view) {
stopService(new Intent(getBaseContext(), MyService.class));
}
}
Following is the content of src/com.example.My Application/MyService.java. This file can
have implementation of one or more methods associated with Service based on requirements. For
now we are going to implement only two methods onStartCommand() and onDestroy() −
package com.example.My Application;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Let it continue running until it is stopped.
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}
Following will the modified content of AndroidManifest.xml file. Here we have added
<service.../> tag to include our service:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.MyApplication"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="13"
android:targetSdkVersion="22" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service android:name=".MyService" />
</application>
</manifest>
Following will be the content of res/layout/activity_main.xml file to include two buttons:
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Example of services"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="Start Services"
android:onClick="startService"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop Services"
android:id="@+id/button"
android:onClick="stopService"
android:layout_below="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:layout_alignRight="@+id/button2"
android:layout_alignEnd="@+id/button2" />
</RelativeLayout>
Following will be the content of res/values/strings.xml to define two new constants:
<resources>
<string name="app_name">My Application</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
</resources>
Let's try to run our modified Hello World! application we just modified. I assume you had
created your AVD while doing environment setup. To run the app from Android studio, open
one of your project's activity files and click Run icon from the tool bar. Android Studio installs
the app on your AVD and starts it and if everything is fine with your set-up and application, it
will display following Emulator window −
Now to start your service, let's click on Start Service button, this will start the service and as per
our programming in onStartCommand() method, a message Service Started will appear on the
bottom of the the simulator as follows –
Android - Broadcast Receivers
Broadcast Receivers simply respond to broadcast messages from other applications or from the
system itself. These messages are sometime called events or intents. For example, applications
can also initiate broadcasts to let other applications know that some data has been downloaded to
the device and is available for them to use, so this is broadcast receiver who will intercept this
communication and will initiate appropriate action.
There are following two important steps to make BroadcastReceiver works for the system
broadcasted intents −
 Creating the Broadcast Receiver.
 Registering Broadcast Receiver
There is one additional steps in case you are going to implement your custom intents then you
will have to create and broadcast those intents.
Creating the Broadcast Receiver
A broadcast receiver is implemented as a subclass of BroadcastReceiver class and overriding
the onReceive() method where each message is received as a Intent object parameter.
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
Registering Broadcast Receiver
An application listens for specific broadcast intents by registering a broadcast receiver in
AndroidManifest.xml file. Consider we are going to register MyReceiver for system generated
event ACTION_BOOT_COMPLETED which is fired by the system once the Android system
has completed the boot process.
Broadcast-Receiver
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
</intent-filter>
</receiver>
</application>
Now whenever your Android device gets booted, it will be intercepted by BroadcastReceiver
MyReceiver and implemented logic inside onReceive() will be executed.
There are several system generated events defined as final static fields in the Intent class. The
following table lists a few important system events.
Event Constant Description
android.intent.action.BATTERY_CHANGED Stickybroadcastcontainingthe chargingstate,level,and
otherinformationabout the battery.
android.intent.action.BATTERY_LOW Indicateslow batteryconditiononthe device.
android.intent.action.BATTERY_OKAY Indicatesthe batteryisnow okayafterbeinglow.
android.intent.action.BOOT_COMPLETED Thisis broadcastonce,afterthe systemhasfinished
booting.
android.intent.action.BUG_REPORT Show activityforreportinga bug.
android.intent.action.CALL Performa call to someone specifiedbythe data.
android.intent.action.CALL_BUTTON The user pressedthe "call"buttontogo to the dialeror
otherappropriate UI forplacinga call.
android.intent.action.DATE_CHANGED The date has changed.
android.intent.action.REBOOT Have the device reboot.
Broadcasting Custom Intents
If you want your application itself should generate and send custom intents then you will have to
create and send those intents by using the sendBroadcast() method inside your activity class. If
you use the sendStickyBroadcast(Intent) method, the Intent is sticky, meaning the Intent you are
sending stays around after the broadcast is complete.
public void broadcastIntent(View view)
{
Intent intent = new Intent();
intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
sendBroadcast(intent);
}
This intent com.tutorialspoint.CUSTOM_INTENT can also be registered in similar way as we
have regsitered system generated intent.
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="com.tutorialspoint.CUSTOM_INTENT">
</action>
</intent-filter>
</receiver>
</application>
Example
This example will explain you how to create BroadcastReceiver to intercept custom intent. Once
you are familiar with custom intent, then you can program your application to intercept system
generated intents. So let's follow the following steps to modify the Android application we
created in Hello World Example chapter −
Step Description
1 You will use Androidstudiotocreate an Androidapplicationandname itas My Application under
a package com.example.My Application asexplainedinthe Hello World Examplechapter.
2 Modifymainactivityfile MainActivity.java toaddbroadcastIntent() method.
3 Create a newjavafile called MyReceiver.java underthe package com.example.My Application to
define aBroadcastReceiver.
4 An applicationcanhandle one ormore customand systemintentswithoutanyrestrictions.Every
indentyouwantto interceptmustbe registeredinyour AndroidManifest.xmlfile using
<receiver.../>tag
5 Modifythe defaultcontentof res/layout/activity_main.xmlfile toincludeabuttonto broadcast
intent.
6 No needtomodifythe stringfile,Androidstudiotake care of string.xml file.
7 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file src/com.example.My
Application/MainActivity.java. This file can include each of the fundamental life cycle
methods. We have added broadcastIntent() method to broadcast a custom intent.
package com.example.My Application;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
// broadcast a custom intent.
public void broadcastIntent(View view){
Intent intent = new Intent();
intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
sendBroadcast(intent);
}
}
Following is the content of src/com.example.My Application/MyReceiver.java:
package com.example.My Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
Following will the modified content of AndroidManifest.xml file. Here we have added
<service.../> tag to include our service:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.My Application"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="com.tutorialspoint.CUSTOM_INTENT">
</action>
</intent-filter>
</receiver>
</application>
</manifest>
Following will be the content of res/layout/activity_main.xml file to include a button to
broadcast our custom intent −
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Example of Broadcast"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="Broadcast Intent"
android:onClick="broadcastIntent"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Following will be the content of res/values/strings.xml to define two new constants −
<resources>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">My Application</string>
</resources>
Let's try to run our modified Hello World! application we just modified. I assume you had
created your AVD while doing environment set-up. To run the app from Android studio, open
one of your project's activity files and click Run icon from the tool bar. Android Studio installs
the app on your AVD and starts it and if everything is fine with your set-up and application, it
will display following Emulator window −
Now to broadcast our custom intent, let's click on Broadcast Intent button, this will broadcast
our custom intent "com.tutorialspoint.CUSTOM_INTENT" which will be intercepted by our
registered BroadcastReceiver i.e. MyReceiver and as per our implemented logic a toast will
appear on the bottom of the the simulator as follows −
You can try implementing other BroadcastReceiver to intercept system generated intents like
system boot up, date changed, low battery etc.
To stop the service, you can click the Stop Service button.
Android - Content Providers
A content provider component supplies data from one application to others on request. Such
requests are handled by the methods of the ContentResolver class. A content provider can use
different ways to store its data and the data can be stored in a database, in files, or even over a
network.
ContentProvider
sometimesitis requiredto share data across applications.This is where content providersbecome
very useful.
Content providers let you centralize content in one place and have many different applications
access it as needed. A content provider behaves very much like a database where you can query
it, edit its content, as well as add or delete content using insert(), update(), delete(), and query()
methods. In most cases this data is stored in an SQlite database.
A content provider is implemented as a subclass of ContentProvider class and must implement
a standard set of APIs that enable other applications to perform transactions.
public class My Application extends ContentProvider {
}
Content URIs
To query a content provider, you specify the query string in the form of a URI which has
following format:
<prefix>://<authority>/<data_type>/<id>
Here is the detail of various parts of the URI −
Part Description
prefix Thisis alwayssetto content://
authority Thisspecifiesthe name of the contentprovider,forexample contacts,browseretc.For
third-partycontentproviders,thiscouldbe the fullyqualifiedname,suchas
com.tutorialspoint.statusprovider
data_type Thisindicatesthe type of data thatthis particularproviderprovides.Forexample,if youare
gettingall the contactsfrom the Contacts contentprovider,thenthe datapathwouldbe
peopleand URI wouldlooklike this content://contacts/people
id Thisspecifiesthe specificrecordrequested.Forexample,if youare lookingforcontact
number5 in the ContactscontentproviderthenURI wouldlooklike this
content://contacts/people/5.
Create Content Provider
This involves number of simple steps to create your own content provider.
 First of all you need to create a Content Provider class that extends the
ContentProviderbaseclass.
 Second, you need to define your content provider URI address which will be used to
access the content.
 Next you will need to create your own database to keep the content. Usually, Android
uses SQLite database and framework needs to override onCreate() method which will use
SQLite Open Helper method to create or open the provider's database. When your
application is launched, the onCreate() handler of each of its Content Providers is called
on the main application thread.
 Next you will have to implement Content Provider queries to perform different database
specific operations.
 Finally register your Content Provider in your activity file using <provider> tag.
Here is the list of methods which you need to override in Content Provider class to have your
Content Provider working:
ContentProvider
 onCreate() This method is called when the provider is started.
 query() This method receives a request from a client. The result is returned as a Cursor
object.
 insert()This method inserts a new record into the content provider.
 delete() This method deletes an existing record from the content provider.
 update() This method updates an existing record from the content provider.
 getType() This method returns the MIME type of the data at the given URI.
Example
This example will explain you how to create your own ContentProvider. So let's follow the
following steps to similar to what we followed while creating Hello World Example−
Step Description
1
You will use AndroidStudioIDEtocreate an Androidapplicationandname itas My Application
undera package com.example.My Application,withblankActivity.
2
Modifymainactivityfile MainActivity.java toaddtwonew methods onClickAddName()and
onClickRetrieveStudents().
3
Create a newjavafile called StudentsProvider.java underthe package com.example.My Application
to define youractual providerandassociatedmethods.
4 Registeryourcontentproviderinyour AndroidManifest.xmlfile using<provider.../>tag
5
Modifythe defaultcontentof res/layout/activity_main.xmlfile toincludeasmall GUI to add
studentsrecords.
6 No needtochange string.xml.Androidstudiotake care of string.xml file.
7
Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file src/com.example.My
Application/MainActivity.java. This file can include each of the fundamental life cycle
methods. We have added two new methods onClickAddName() and onClickRetrieveStudents() to
handle user interaction with the application.
package com.example.My Application;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onClickAddName(View view) {
// Add a new student record
ContentValues values = new ContentValues();
values.put(StudentsProvider.NAME,
((EditText)findViewById(R.id.editText2)).getText().toString());
values.put(StudentsProvider.GRADE,
((EditText)findViewById(R.id.editText3)).getText().toString());
Uri uri = getContentResolver().insert(
StudentsProvider.CONTENT_URI, values);
Toast.makeText(getBaseContext(),
uri.toString(), Toast.LENGTH_LONG).show();
}
public void onClickRetrieveStudents(View view) {
// Retrieve student records
String URL = "content://com.example.provider.College/students";
Uri students = Uri.parse(URL);
Cursor c = managedQuery(students, null, null, null, "name");
if (c.moveToFirst()) {
do{
Toast.makeText(this,
c.getString(c.getColumnIndex(StudentsProvider._ID)) +
", " + c.getString(c.getColumnIndex( StudentsProvider.NAME)) +
", " + c.getString(c.getColumnIndex( StudentsProvider.GRADE)),
Toast.LENGTH_SHORT).show();
} while (c.moveToNext());
}
}
}
Create new file StudentsProvider.java under com.example.My Application package and following
is the content of src/com.example.My Application/StudentsProvider.java −
package com.example.My Application;
import java.util.HashMap;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
public class StudentsProvider extends ContentProvider {
static final String PROVIDER_NAME = "com.example.provider.College";
static final String URL = "content://" + PROVIDER_NAME + "/students";
static final Uri CONTENT_URI = Uri.parse(URL);
static final String _ID = "_id";
static final String NAME = "name";
static final String GRADE = "grade";
private static HashMap<String, String> STUDENTS_PROJECTION_MAP;
static final int STUDENTS = 1;
static final int STUDENT_ID = 2;
static final UriMatcher uriMatcher;
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "students", STUDENTS);
uriMatcher.addURI(PROVIDER_NAME, "students/#", STUDENT_ID);
}
/**
* Database specific constant declarations
*/
private SQLiteDatabase db;
static final String DATABASE_NAME = "College";
static final String STUDENTS_TABLE_NAME = "students";
static final int DATABASE_VERSION = 1;
static final String CREATE_DB_TABLE =
" CREATE TABLE " + STUDENTS_TABLE_NAME +
" (_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
" name TEXT NOT NULL, " +
" grade TEXT NOT NULL);";
/**
* Helper class that actually creates and manages
* the provider's underlying data repository.
*/
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(CREATE_DB_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + STUDENTS_TABLE_NAME);
onCreate(db);
}
}
@Override
public boolean onCreate() {
Context context = getContext();
DatabaseHelper dbHelper = new DatabaseHelper(context);
/**
* Create a write able database which will trigger its
* creation if it doesn't already exist.
*/
db = dbHelper.getWritableDatabase();
return (db == null)? false:true;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
/**
* Add a new student record
*/
long rowID = db.insert( STUDENTS_TABLE_NAME, "", values);
/**
* If record is added successfully
*/
if (rowID > 0)
{
Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
getContext().getContentResolver().notifyChange(_uri, null);
return _uri;
}
throw new SQLException("Failed to add a record into " + uri);
}
@Override
public Cursor query(Uri uri, String[] projection, String
selection,String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(STUDENTS_TABLE_NAME);
switch (uriMatcher.match(uri)) {
case STUDENTS:
qb.setProjectionMap(STUDENTS_PROJECTION_MAP);
break;
case STUDENT_ID:
qb.appendWhere( _ID + "=" + uri.getPathSegments().get(1));
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (sortOrder == null || sortOrder == ""){
/**
* By default sort on student names
*/
sortOrder = NAME;
}
Cursor c = qb.query(db, projection, selection, selectionArgs,null,
null, sortOrder);
/**
* register to watch a content URI for changes
*/
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
switch (uriMatcher.match(uri)){
case STUDENTS:
count = db.delete(STUDENTS_TABLE_NAME, selection, selectionArgs);
break;
case STUDENT_ID:
String id = uri.getPathSegments().get(1);
count = db.delete( STUDENTS_TABLE_NAME, _ID + " = " + id +
(!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""),
selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int count = 0;
switch (uriMatcher.match(uri)){
case STUDENTS:
count = db.update(STUDENTS_TABLE_NAME, values, selection,
selectionArgs);
break;
case STUDENT_ID:
count = db.update(STUDENTS_TABLE_NAME, values, _ID + " = " +
uri.getPathSegments().get(1) +
(!TextUtils.isEmpty(selection) ? " AND (" +selection + ')' : ""),
selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri );
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)){
/**
* Get all student records
*/
case STUDENTS:
return "vnd.android.cursor.dir/vnd.example.students";
/**
* Get a particular student
*/
case STUDENT_ID:
return "vnd.android.cursor.item/vnd.example.students";
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
}
Following will the modified content of AndroidManifest.xml file. Here we have added
<provider.../> tag to include our content provider:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.My Application"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.My Application.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>
<provider android:name="StudentsProvider"
<android:authorities="com.example.provider.College">
</provider>
</application>
</manifest>
Following will be the content of res/layout/activity_main.xml file to include a button to
broadcast your custom intent −
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity"/">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Content provider"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="Add Name"
android:layout_below="@+id/editText3"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2"
android:layout_alignLeft="@+id/textView2"
android:layout_alignStart="@+id/textView2"
android:onClick="onClickAddName"/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageButton"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:layout_alignTop="@+id/editText"
android:layout_alignLeft="@+id/textView1"
android:layout_alignStart="@+id/textView1"
android:layout_alignRight="@+id/textView1"
android:layout_alignEnd="@+id/textView1"
android:hint="Name"
android:textColorHint="@android:color/holo_blue_light" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText3"
android:layout_below="@+id/editText"
android:layout_alignLeft="@+id/editText2"
android:layout_alignStart="@+id/editText2"
android:layout_alignRight="@+id/editText2"
android:layout_alignEnd="@+id/editText2"
android:hint="Grade"
android:textColorHint="@android:color/holo_blue_bright" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Retrive student"
android:id="@+id/button"
android:layout_below="@+id/button2"
android:layout_alignRight="@+id/editText3"
android:layout_alignEnd="@+id/editText3"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:onClick="onClickRetrieveStudents"/>
</RelativeLayout>
Make sure you have following content of res/values/strings.xml file:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application</string>
<string name="action_settings">Settings</string>
</resources>;
Let's try to run our modified My Application application we just created. I assume you had
created your AVD while doing environment set-up. To run the app from Android Studio IDE,
open one of your project's activity files and click Run icon from the tool bar. Android Studio
installs the app on your AVD and starts it and if everything is fine with your set-up and
application, it will display following Emulator window, be patience because it may take
sometime based on your computer speed:
Now let's enter student Name and Grade and finally click on Add Name button, this will add
student record in the database and will flash a message at the bottom showing ContentProvider
URI along with record number added in the database. This operation makes use of our insert()
method. Let's repeat this process to add few more students in the database of our content
provider.
Once you are done with adding records in the database, now its time to ask ContentProvider to
give us those records back, so let's click Retrieve Students button which will fetch and display
all the records one by one which is as per our the implementation of our query() method.
You can write activities against update and delete operations by providing callback functions in
MainActivity.java file and then modify user interface to have buttons for update and deleted
operations in the same way as we have done for add and read operations.
This way you can use existing Content Provider like Address Book or you can use Content
Provider concept in developing nice database oriented applications where you can perform all
sort of database operations like read, write, update and delete as explained above in the example.
Android - Fragments
A Fragment isa piece of an activitywhichenable more modularactivitydesign.Itwill notbe wrongif we
say,a fragmentisa kindof sub-activity.
Following are important points about fragment −
 A fragment has its own layout and its own behaviour with its own life cycle callbacks.
 You can add or remove fragments in an activity while the activity is running.
 You can combine multiple fragments in a single activity to build a multi-plane UI.
 A fragment can be used in multiple activities.
 Fragment life cycle is closely related to the life cycle of its host activity which means
when the activity is paused, all the fragments available in the activity will also be
stopped.
 A fragment can implement a behaviour that has no user interface component.
 Fragments were added to the Android API in Honeycomb version of Android which API
version 11.
You create fragments by extending Fragment class and You can insert a fragment into your
activity layout by declaring the fragment in the activity's layout file, as a <fragment> element.
Prior to fragment introduction, we had a limitation because we can show only a single activity on
the screen at one given point in time. So we were not able to divide device screen and control
different parts separately. But with the introduction of fragment we got more flexibility and
removed the limitation of having a single activity on the screen at a time. Now we can have a
single activity but each activity can comprise of multiple fragments which will have their own
layout, events and complete life cycle.
Following is a typical example of how two UI modules defined by fragments can be combined
into one activity for a tablet design, but separated for a handset design.
The application can embed two fragments in Activity A, when running on a tablet-sized device.
However, on a handset-sized screen, there's not enough room for both fragments, so Activity A
includes only the fragment for the list of articles, and when the user selects an article, it starts
Activity B, which includes the second fragment to read the article.
Fragment Life Cycle
Android fragments have their own life cycle very similar to an android activity. This section
briefs different stages of its life cycle.
Fragment lifecycle
Here is the list of methods which you can to override in your fragment class −
 onAttach()The fragment instance is associated with an activity instance.The fragment
and the activity is not fully initialized. Typically you get in this method a reference to the
activity which uses the fragment for further initialization work.
 onCreate() The system calls this method when creating the fragment. You should
initialize essential components of the fragment that you want to retain when the fragment
is paused or stopped, then resumed.
 onCreateView() The system calls this callback when it's time for the fragment to draw
its user interface for the first time. To draw a UI for your fragment, you must return a
View component from this method that is the root of your fragment's layout. You can
return null if the fragment does not provide a UI.
 onActivityCreated()The onActivityCreated() is called after the onCreateView() method
when the host activity is created. Activity and fragment instance have been created as
well as the view hierarchy of the activity. At this point, view can be accessed with the
findViewById() method. example. In this method you can instantiate objects which
require a Context object
 onStart()The onStart() method is called once the fragment gets visible.
 onResume()Fragment becomes active.
 onPause() The system calls this method as the first indication that the user is leaving the
fragment. This is usually where you should commit any changes that should be persisted
beyond the current user session.
 onStop()Fragment going to be stopped by calling onStop()
 onDestroyView()Fragment view will destroy after call this method
 onDestroy()onDestroy() called to do final clean up of the fragment's state but Not
guaranteed to be called by the Android platform.
How to use Fragments?
This involves number of simple steps to create Fragments.
 First of all decide how many fragments you want to use in an activity. For example let's
we want to use two fragments to handle landscape and portrait modes of the device.
 Next based on number of fragments, create classes which will extend the Fragment class.
The Fragment class has above mentioned callback functions. You can override any of the
functions based on your requirements.
 Corresponding to each fragment, you will need to create layout files in XML file. These
files will have layout for the defined fragments.
 Finally modify activity file to define the actual logic of replacing fragments based on
your requirement.
Types of Fragments
Basically fragments are divided as three stages as shown below.
 Single frame fragments − Single frame fragments are using for hand hold devices like
mobiles, here we can show only one fragment as a view.
 List fragments − fragments having special list view is called as list fragment
 Fragments transaction − Using with fragment transaction. we can move one fragment to
another fragment.
Android - Intents and Filters
An Android Intent is an abstract description of an operation to be performed. It can be used with
startActivity to launch an Activity, broadcastIntent to send it to any interested
BroadcastReceiver components, and startService(Intent) or bindService(Intent,
ServiceConnection, int) to communicate with a background Service.
The intentitself,an Intentobject, isa passive data structure holdingan abstract descriptionof an
operationto be performed.
For example, let's assume that you have an Activity that needs to launch an email client and
sends an email using your Android device. For this purpose, your Activity would send an
ACTION_SEND along with appropriate chooser, to the Android Intent Resolver. The specified
chooser gives the proper interface for the user to pick how to send your email data.
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
email.putExtra(Intent.EXTRA_EMAIL, recipients);
email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString());
email.putExtra(Intent.EXTRA_TEXT, body.getText().toString());
startActivity(Intent.createChooser(email, "Choose an email client from..."));
Above syntax is calling startActivity method to start an email activity and result should be as
shown below
For example, assume that you have an Activity that needs to open URL in a web browser on
your Android device. For this purpose, your Activity will send ACTION_WEB_SEARCH Intent
to the Android Intent Resolver to open given URL in the web browser. The Intent Resolver
parses through a list of Activities and chooses the one that would best match your Intent, in this
case, the Web Browser Activity. The Intent Resolver then passes your web page to the web
browser and starts the Web Browser Activity.
String q = "tutorialspoint";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, q);
startActivity(intent);
Above example will search as tutorialspoint on android search engine and it gives the result of
tutorialspoint in your an activity
There are separate mechanisms for delivering intents to each type of component - activities,
services, and broadcast receivers.
Sr.No Method & Description
1 Context.startActivity()
The Intent object is passed to this method to launch a new activity or get an existing
activity to do something new.
2 Context.startService()
The Intent object is passed to this method to initiate a service or deliver new
instructions to an ongoing service.
3 Context.sendBroadcast()
The Intent object is passed to this method to deliver the message to all interested
broadcast receivers.
Intent Objects
An Intent object is a bundle of information which is used by the component that receives the
intent as well as information used by the Android system.
An Intent object can contain the following components based on what it is communicating or
going to perform −
Action
This is mandatory part of the Intent object and is a string naming the action to be performed —
or, in the case of broadcast intents, the action that took place and is being reported. The action
largely determines how the rest of the intent object is structured . The Intent class defines a
number of action constants corresponding to different intents. Here is a list of Android Intent
Standard Actions
The action in an Intent object can be set by the setAction() method and read by getAction().
Data
Adds a data specification to an intent filter. The specification can be just a data type (the
mimeType attribute), just a URI, or both a data type and a URI. A URI is specified by separate
attributes for each of its parts −
These attributes that specify the URL format are optional, but also mutually dependent −
 If a scheme isnotspecifiedforthe intentfilter,all the otherURIattributesare ignored.
 If a hostis notspecifiedforthe filter,the portattribute andall the pathattributesare ignored.
The setData() method specifies data only as a URI, setType() specifies it only as a MIME type,
and setDataAndType() specifies it as both a URI and a MIME type. The URI is read by getData()
and the type by getType().
Some examples of action/data pairs are −
S.N. Action/Data Pair & Description
1
ACTION_VIEW content://contacts/people/1
Display information about the person whose identifier is "1".
2
ACTION_DIAL content://contacts/people/1
Display the phone dialer with the person filled in.
3
ACTION_VIEW tel:123
Display the phone dialer with the given number filled in.
4
ACTION_DIAL tel:123
Display the phone dialer with the given number filled in.
5
ACTION_EDIT content://contacts/people/1
Edit information about the person whose identifier is "1".
6
ACTION_VIEW content://contacts/people/
Display a list of people, which the user can browse through.
7
ACTION_SET_WALLPAPER
Show settings for choosing wallpaper
8
ACTION_SYNC
It going to be synchronous the data,Constant Value is android.intent.action.SYNC
9
ACTION_SYSTEM_TUTORIAL
It will start the platform-defined tutorial(Default tutorial or start up tutorial)
10
ACTION_TIMEZONE_CHANGED
It intimates when time zone has changed
11
ACTION_UNINSTALL_PACKAGE
It is used to run default uninstaller
Category
The category is an optional part of Intent object and it's a string containing additional
information about the kind of component that should handle the intent. The addCategory()
method places a category in an Intent object, removeCategory() deletes a category previously
added, and getCategories() gets the set of all categories currently in the object. Here is a list of
Android Intent Standard Categories.
You can check detail on Intent Filters in below section to understand how do we use categories
to choose appropriate activity corresponding to an Intent.
Extras
This will be in key-value pairs for additional information that should be delivered to the
component handling the intent. The extras can be set and read using the putExtras() and
getExtras() methods respectively. Here is a list of Android Intent Standard Extra Data
Flags
These flags are optional part of Intent object and instruct the Android system how to launch an
activity, and how to treat it after it's launched etc.
Sr.No Flags & Description
1
FLAG_ACTIVITY_CLEAR_TASK
If set in an Intent passed to Context.startActivity(), this flag will cause any existing task
that would be associated with the activity to be cleared before the activity is started. That
is, the activity becomes the new root of an otherwise empty task, and any old activities are
finished. This can only be used in conjunction with FLAG_ACTIVITY_NEW_TASK.
2
FLAG_ACTIVITY_CLEAR_TOP
If set, and the activity being launched is already running in the current task, then instead of
launching a new instance of that activity, all of the other activities on top of it will be
closed and this Intent will be delivered to the (now on top) old activity as a new Intent.
3
FLAG_ACTIVITY_NEW_TASK
This flag is generally used by activities that want to present a "launcher" style behavior:
they give the user a list of separate things that can be done, which otherwise run
completely independently of the activity launching them.
ComponentName
This optional field is an android ComponentName object representing either Activity, Service
or BroadcastReceiver class. If it is set, the Intent object is delivered to an instance of the
designated class otherwise Android uses other information in the Intent object to locate a suitable
target.
The component name is set by setComponent(), setClass(), or setClassName() and read by
getComponent().
Types of Intents
There are following two types of intents supported by Android
ExplicitIntents
Explicit intent going to be connected internal world of application,suppose if you wants to
connect one activity to another activity, we can do this quote by explicit intent, below image is
connecting first activity to second activity by clicking button.
These intents designate the target component by its name and they are typically used for
application-internal messages - such as an activity starting a subordinate service or launching a
sister activity. For example −
// Explicit Intent by specifying its class name
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
// Starts TargetActivity
startActivity(i);
ImplicitIntents
These intents do not name a target and the field for the component name is left blank. Implicit
intents are often used to activate components in other applications. For example −
Intent read1=new Intent();
read1.setAction(android.content.Intent.ACTION_VIEW);
read1.setData(ContactsContract.Contacts.CONTENT_URI);
startActivity(read1);
Above code will give result as shown below
The target component which receives the intent can use the getExtras() method to get the extra
data sent by the source component. For example −
// Get bundle object at appropriate place in your code
Bundle extras = getIntent().getExtras();
// Extract data using passed keys
String value1 = extras.getString("Key1");
String value2 = extras.getString("Key2");
Example
Following example shows the functionality of a Android Intent to launch various Android built-
in applications.
Step Description
1
You will use AndroidstudioIDEto create an Androidapplicationandname itas My Application
undera package com.example.saira_000.myapplication.While creatingthisproject,make sure you
Target SDK and CompileWith at the latestversionof AndroidSDKtouse higherlevelsof APIs.
2
Modify src/main/java/MainActivity.java fileandaddthe code to define twolisteners
correspondingtwobuttonsie.StartBrowserandStart Phone.
3 ModifylayoutXML file res/layout/activity_main.xmltoaddthree buttonsinlinearlayout.
4
Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file src/com.example.My
Application/MainActivity.java.
package com.example.saira_000.myapplication;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
Button b1,b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://www.example.com"));
startActivity(i);
}
});
b2=(Button)findViewById(R.id.button2);
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,Uri.parse("tel:9510300000"));
startActivity(i);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Following will be the content of res/layout/activity_main.xml file −
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Intent Example"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point"
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageButton"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Browser"
android:id="@+id/button"
android:layout_alignTop="@+id/editText"
android:layout_alignRight="@+id/textView1"
android:layout_alignEnd="@+id/textView1"
android:layout_alignLeft="@+id/imageButton"
android:layout_alignStart="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Phone"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2" />
</RelativeLayout>
Following will be the content of res/values/strings.xml to define two new constants −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Applicaiton</string>
<string name="action_settings">Settings</string>
</resources>
Following is the default content of AndroidManifest.xml −
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.My Application"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.saira_000.myapplication.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>
Let's try to run your My Application application. I assume you had created your AVD while
doing environment setup. To run the app from Android Studio, open one of your project's
activity files and click Run icon from the toolbar.Android Studio installs the app on your AVD
and starts it and if everything is fine with your setup and application, it will display following
Emulator window −
Now click on Start Browser button, which will start a browser configured and display
http://www.example.com as shown below −
Similar way you can launch phone interface using Start Phone button, which will allow you to
dial already given phone number.
Intent Filters
You have seen how an Intent has been used to call an another activity. Android OS uses filters to
pinpoint the set of Activities, Services, and Broadcast receivers that can handle the Intent with
help of specified set of action, categories, data scheme associated with an Intent. You will use
<intent-filter> element in the manifest file to list down actions, categories and data types
associated with any activity, service, or broadcast receiver.
Following is an example of a part of AndroidManifest.xml file to specify an activity
com.example.My Application.CustomActivity which can be invoked by either of the two
mentioned actions, one category, and one data −
<activity android:name=".CustomActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.example.My Application.LAUNCH" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
Once this activity is defined along with above mentioned filters, other activities will be able to
invoke this activity using either the android.intent.action.VIEW, or using the
com.example.My Application.LAUNCH action provided their category is
android.intent.category.DEFAULT.
The <data> element specifies the data type expected by the activity to be called and for above
example our custom activity expects the data to start with the "http://"
There may be a situation that an intent can pass through the filters of more than one activity or
service, the user may be asked which component to activate. An exception is raised if no target
can be found.
There are following test Android checks before invoking an activity −
 A filter <intent-filter> may list more than one action as shown above but this list cannot
be empty; a filter must contain at least one <action> element, otherwise it will block all
intents. If more than one actions are mentioned then Android tries to match one of the
mentioned actions before invoking the activity.
 A filter <intent-filter> may list zero, one or more than one categories. if there is no
category mentioned then Android always pass this test but if more than one categories are
mentioned then for an intent to pass the category test, every category in the Intent object
must match a category in the filter.
 Each <data> element can specify a URI and a data type (MIME media type). There are
separate attributes like scheme, host, port, and path for each part of the URI. An Intent
object that contains both a URI and a data type passes the data type part of the test only if
its type matches a type listed in the filter.
Example
Following example is a modification of the above example. Here we will see how Android
resolves conflict if one intent is invoking two activities defined in , next how to invoke a custom
activity using a filter and third one is an exception case if Android does not file appropriate
activity defined for an intent.
Step Description
1 You will use androidstudiotocreate anAndroidapplicationandname itas My Application under
a package com.example.saira_000.myapplication.While creatingthisproject,make sure you
Target SDK and CompileWith at the latestversionof AndroidSDKtouse higherlevelsof APIs.
2 Modify src/Main/Java/MainActivity.javafileandaddthe code to define three listeners
correspondingtothree buttonsdefinedinlayoutfile.
3 Adda new src/Main/Java/CustomActivity.java file tohave one customactivitywhichwillbe
invokedbydifferentintents.
4 ModifylayoutXML file res/layout/activity_main.xmltoaddthree buttonsinlinearlayout.
5 Addone layoutXML file res/layout/custom_view.xmltoadda simple <TextView>toshow the
passeddata throughintent.
6 Modify AndroidManifest.xmltoadd<intent-filter>todefine rulesforyourintenttoinvoke
customactivity.
7 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file src/MainActivity.java.
package com.example.saira_000.myapplication;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
Button b1,b2,b3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,Uri.parse("http://www.example.com")
);
startActivity(i);
}
});
b2=(Button)findViewById(R.id.button2);
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("com.example.My
Application.LAUNCH",Uri.parse("http://www.example.com"));
startActivity(i);
}
});
b3=(Button)findViewById(R.id.button3);
b3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("com.example.My
Application.LAUNCH",Uri.parse("https://www.example.com"));
startActivity(i);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Following is the content of the modified main activity file src/com.example.My
Application/CustomActivity.java.
package com.example.saira_000.myapplication;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
public class CustomActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_view);
TextView label = (TextView) findViewById(R.id.show_data);
Uri url = getIntent().getData();
label.setText(url.toString());
}
}
Following will be the content of res/layout/activity_main.xml file −
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Intent Example"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point"
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageButton"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start browsing with view action"
android:id="@+id/button"
android:layout_alignTop="@+id/editText"
android:layout_alignRight="@+id/textView1"
android:layout_alignEnd="@+id/textView1"
android:layout_alignLeft="@+id/imageButton"
android:layout_alignStart="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start browsing with launch action"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Exceptional condition"
android:id="@+id/button3"
android:layout_below="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2" />
</RelativeLayout>
Following will be the content of res/layout/custom_view.xml file −
<?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:id="@+id/show_data"
android:layout_width="fill_parent"
android:layout_height="400dp"/>
</LinearLayout>
Following will be the content of res/values/strings.xml to define two new constants −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application</string>
<string name="action_settings">Settings</string>
</resources>
Following is the default content of AndroidManifest.xml −
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.My Application"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.saira_000.myapplication"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.saira_000.myapplication.CustomActivity"
<android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.example.saira_000.myapplication.LAUNCH"
/>
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
</application>
</manifest>
Let's try to run your My Application application. I assume you had created your AVD while
doing environment setup. To run the app from Android Studio, open one of your project's
activity files and click Run icon from the toolbar. Android Studio installs the app on your
AVD and starts it and if everything is fine with your setup and application, it will display
following Emulator window −
Now let's start with first button "Start Browser with VIEW Action". Here we have defined our
custom activity with a filter "android.intent.action.VIEW", and there is already one default
activity against VIEW action defined by Android which is launching web browser, So android
displays following two options to select the activity you want to launch.
Now if you select Browser, then Android will launch web browser and open example.com
website but if you select IndentDemo option then Android will launch CustomActivity which
does nothing but just capture passed data and displays in a text view as follows −
Now go back using back button and click on "Start Browser with LAUNCH Action" button, here
Android applies filter to choose define activity and it simply launch your custom activity
Again, go back using back button and click on "Exception Condition" button, here Android tries
to find out a valid filter for the given intent but it does not find a valid activity defined because
this time we have used data as https instead of http though we are giving a correct action, so
Android raises an exception and shows following screen −
Android - UI Layouts
The basic building block for user interface is a View object which is created from the View class
and occupies a rectangular area on the screen and is responsible for drawing and event handling.
View is the base class for widgets, which are used to create interactive UI components like
buttons, text fields, etc.
The ViewGroup is a subclass of View and provides invisible container that hold other Views or
other ViewGroups and define their layout properties.
At third level we have different layouts which are subclasses of ViewGroup class and a typical
layout defines the visual structure for an Android user interface and can be created either at run
time using View/ViewGroup objects or you can declare your layout using simple XML file
main_layout.xml which is located in the res/layout folder of your project.
Layout params
This tutorial is more about creating your GUI based on layouts defined in XML file. A layout
may contain any type of widgets such as buttons, labels, textboxes, and so on. Following is a
simple example of XML file having LinearLayout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is a TextView" />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is a Button" />
<!-- More GUI components go here -->
</LinearLayout>
Once your layout has created, you can load the layout resource from your application code, in
your Activity.onCreate() callback implementation as shown below −
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
Android Layout Types
There are number of Layouts provided by Android which you will use in almost all the Android
applications to provide different view, look and feel.
Sr.No Layout & Description
1 Linear Layout
LinearLayout is a view group that aligns all children in a single direction, vertically or
horizontally.
2 Relative Layout
RelativeLayout is a view group that displays child views in relative positions.
3 Table Layout
TableLayout is a view that groups views into rows and columns.
4 Absolute Layout
AbsoluteLayout enables you to specify the exact location of its children.
5 Frame Layout
The FrameLayout is a placeholder on screen that you can use to display a single view.
6 List View
ListView is a view group that displays a list of scrollable items.
7 Grid View
GridView is a ViewGroup that displays items in a two-dimensional, scrollable grid.
Layout Attributes
Each layout has a set of attributes which define the visual properties of that layout. There are few
common attributes among all the layouts and their are other attributes which are specific to that
layout. Following are common attributes and will be applied to all the layouts:
Attribute Description
android:id Thisis the ID whichuniquelyidentifiesthe view.
android:layout_width Thisis the widthof the layout.
android:layout_height Thisis the heightof the layout
android:layout_marginTop Thisis the extraspace on the top side of the layout.
android:layout_marginBottom Thisis the extraspace on the bottomside of the layout.
android:layout_marginLeft Thisis the extraspace on the leftside of the layout.
android:layout_marginRight Thisis the extraspace on the right side of the layout.
android:layout_gravity Thisspecifieshow childViewsare positioned.
android:layout_weight Thisspecifieshow muchof the extraspace inthe layoutshouldbe
allocatedtothe View.
android:layout_x Thisspecifiesthe x-coordinate of the layout.
android:layout_y Thisspecifiesthe y-coordinateof the layout.
android:layout_width Thisis the widthof the layout.
android:layout_width Thisis the widthof the layout.
android:paddingLeft Thisis the leftpaddingfilledforthe layout.
android:paddingRight Thisis the rightpaddingfilledforthe layout.
android:paddingTop Thisis the top paddingfilledforthe layout.
android:paddingBottom Thisis the bottompaddingfilledforthe layout.
Here width and height are the dimension of the layout/view which can be specified in terms of
dp (Density-independent Pixels), sp ( Scale-independent Pixels), pt ( Points which is 1/72 of an
inch), px( Pixels), mm ( Millimeters) and finally in (inches).
You can specify width and height with exact measurements but more often, you will use one of
these constants to set the width or height −
 android:layout_width=wrap_content tells your view to size itself to the dimensions
required by its content.
 android:layout_width=fill_parent tells your view to become as big as its parent view.
Gravity attribute plays important role in positioning the view object and it can take one or more
(separated by '|') of the following constant values.
Constant Value Description
top 0x30 Pushobjectto the top of its container,notchangingitssize.
bottom 0x50 Pushobjectto the bottomof itscontainer,notchangingitssize.
left 0x03 Pushobjectto the leftof itscontainer,notchangingitssize.
right 0x05 Pushobjectto the rightof itscontainer,notchangingitssize.
center_vertical 0x10 Place objectinthe vertical centerof itscontainer,notchangingits
size.
fill_vertical 0x70 Grow the vertical size of the objectif neededsoitcompletelyfillsits
container.
center_horizontal 0x01 Place objectinthe horizontal centerof itscontainer,notchangingits
size.
fill_horizontal 0x07 Grow the horizontal size of the objectif neededso itcompletelyfills
itscontainer.
center 0x11 Place the objectinthe centerof itscontainerinboththe vertical and
horizontal axis,notchangingitssize.
fill 0x77 Grow the horizontal andvertical size of the objectif neededsoit
completely fillsitscontainer.
clip_vertical 0x80 Additional optionthatcanbe setto have the top and/orbottom
edgesof the childclippedtoitscontainer'sbounds.The clipwill be
basedon the vertical gravity:atop gravitywill clipthe bottomedge,
a bottomgravitywill clipthe topedge,andneitherwill clipboth
edges.
clip_horizontal 0x08 Additional optionthatcanbe setto have the leftand/orrightedges
of the childclippedtoitscontainer'sbounds.The clipwill be based
on the horizontal gravity: aleftgravitywill clipthe rightedge,aright
gravitywill clipthe leftedge,andneitherwill clipbothedges.
start 0x00800003 Pushobjectto the beginningof itscontainer,notchangingitssize.
end 0x00800005 Pushobjectto the endof itscontainer,notchangingitssize.
View Identification
A view object may have a unique ID assigned to it which will identify the View uniquely within
the tree. The syntax for an ID, inside an XML tag is −
android:id="@+id/my_button"
Following is a brief description of @ and + signs −
 The at-symbol (@) at the beginning of the string indicates that the XML parser should
parse and expand the rest of the ID string and identify it as an ID resource.
 The plus-symbol (+) means that this is a new resource name that must be created and
added to our resources. To create an instance of the view object and capture it from the
layout, use the following −
Button myButton = (Button) findViewById(R.id.my_button);
Android - UI Controls
Input controls are the interactive components in your app's user interface. Android provides a
wide variety of controls you can use in your UI, such as buttons, text fields, seek bars, check
box, zoom buttons, toggle buttons, and many more.
UI Elements
A View is an object that draws something on the screen that the user can interact with and a
ViewGroup is an object that holds other View (and ViewGroup) objects in order to define the
layout of the user interface.
You define your layout in an XML file which offers a human-readable structure for the layout,
similar to HTML. For example, a simple vertical layout with a text view and a button looks like
this −
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="I am a TextView" />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="I am a Button" />
</LinearLayout>
Android UI Controls
There are number of UI controls provided by Android that allow you to build the graphical user
interface for your app.
S.N. UI Control & Description
1 TextView
This control is used to display text to the user.
2 EditText
EditText is a predefined subclass of TextView that includes rich editing capabilities.
3 AutoCompleteTextView
The AutoCompleteTextView is a view that is similar to EditText, except that it shows a list
of completion suggestions automatically while the user is typing.
4 Button
A push-button that can be pressed, or clicked, by the user to perform an action.
5 ImageButton
AbsoluteLayout enables you to specify the exact location of its children.
6 CheckBox
An on/off switch that can be toggled by the user. You should use check box when
presenting users with a group of selectable options that are not mutually exclusive.
7 ToggleButton
An on/off button with a light indicator.
8 RadioButton
The RadioButton has two states: either checked or unchecked.
9 RadioGroup
A RadioGroup is used to group together one or more RadioButtons.
10 ProgressBar
The ProgressBar view provides visual feedback about some ongoing tasks, such as when
you are performing a task in the background.
11 Spinner
A drop-down list that allows users to select one value from a set.
12 TimePicker
The TimePicker view enables users to select a time of the day, in either 24-hour mode or
AM/PM mode.
13 DatePicker
The DatePicker view enables users to select a date of the day.
Create UI Controls
Input controls are the interactive components in your app's user interface. Android provides a
wide variety of controls you can use in your UI, such as buttons, text fields, seek bars, check
box, zoom buttons, toggle buttons, and many more.
As explained in previous chapter, a view object may have a unique ID assigned to it which will
identify the View uniquely within the tree. The syntax for an ID, inside an XML tag is −
android:id="@+id/text_id"
To create a UI Control/View/Widget you will have to define a view/widget in the layout file and
assign it a unique ID as follows −
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="I am a TextView" />
</LinearLayout>
Then finally create an instance of the Control object and capture it from the layout, use the
following −
TextView myText = (TextView) findViewById(R.id.text_id);
Android - Event Handling
Events are a useful way to collect data about a user's interaction with interactive
components of Applications. Like button presses or screen touch etc. The Android framework
maintains an event queue as first-in, first-out (FIFO) basis. You can capture these events in your
program and take appropriate action as per requirements.
There are following three concepts related to Android Event Management −
 Event Listeners − An event listener is an interface in the View class that contains a
single callback method. These methods will be called by the Android framework when
the View to which the listener has been registered is triggered by user interaction with the
item in the UI.
 Event Listeners Registration − Event Registration is the process by which an Event
Handler gets registered with an Event Listener so that the handler is called when the
Event Listener fires the event.
 Event Handlers − When an event happens and we have registered an event listener for
the event, the event listener calls the Event Handlers, which is the method that actually
handles the event.
Event Listeners & Event Handlers
Event Handler Event Listener & Description
onClick() OnClickListener()
This is called when the user either clicks or touches or focuses upon any
widget like button, text, image etc. You will use onClick() event
handler to handle such event.
onLongClick() OnLongClickListener()
This is called when the user either clicks or touches or focuses upon any
widget like button, text, image etc. for one or more seconds. You will
use onLongClick() event handler to handle such event.
onFocusChange() OnFocusChangeListener()
This is called when the widget looses its focus ie. user goes away from
the view item. You will use onFocusChange() event handler to handle
such event.
onKey() OnFocusChangeListener()
This is called when the user is focused on the item and presses or
releases a hardware key on the device. You will use onKey() event
handler to handle such event.
onTouch() OnTouchListener()
This is called when the user presses the key, releases the key, or any
movement gesture on the screen. You will use onTouch() event handler
to handle such event.
onMenuItemClick() OnMenuItemClickListener()
This is called when the user selects a menu item. You will use
onMenuItemClick() event handler to handle such event.
onCreateContextMenu() onCreateContextMenuItemListener()
This is called when the context menu is being built(as the result of a
sustained "long click)
There are many more event listeners available as a part of View class like OnHoverListener,
OnDragListener etc which may be needed for your application. So I recommend to refer official
documentation for Android application development in case you are going to develop a
sophisticated apps.
Event Listeners Registration
Event Registration is the process by which an Event Handler gets registered with an Event
Listener so that the handler is called when the Event Listener fires the event. Though there are
several tricky ways to register your event listener for any event, but I'm going to list down only
top 3 ways, out of which you can use any of them based on the situation.
 Using an Anonymous Inner Class
 Activity class implements the Listener interface.
 Using Layout file activity_main.xml to specify event handler directly.
Below section will provide you detailed examples on all the three scenarios −
Touch Mode
Users can interact with their devices by using hardware keys or buttons or touching the
screen.Touching the screen puts the device into touch mode. The user can then interact with it by
touching the on-screen virtual buttons, images, etc.You can check if the device is in touch mode
by calling the View class’s isInTouchMode() method.
Touch Event
Focus
A view or widget is usually highlighted or displays a flashing cursor when it’s in focus. This
indicates that it’s ready to accept input from the user.
 isFocusable() – it returns true or false
 isFocusableInTouchMode() – checks to see if the view is focusable in touch mode. (A
view may be focusable when using a hardware key but not when the device is in touch
mode)
android:foucsUp="@=id/button_l"
onTouchEvent()
public boolean onTouchEvent(motionEvent event){
switch(event.getAction()){
case TOUCH_DOWN:
Toast.makeText(this,"you have clicked down Touch
button",Toast.LENTH_LONG).show();
break();
case TOUCH_UP:
Toast.makeText(this,"you have clicked up touch
button",Toast.LENTH_LONG).show();
break;
case TOUCH_MOVE:
Toast.makeText(this,"you have clicked move touch
button"Toast.LENTH_LONG).show();
break;
}
return super.onTouchEvent(event) ;
}
Event Handling Examples
EventListenersRegistrationUsinganAnonymousInnerClass
Here you will create an anonymous implementation of the listener and will be useful if each class
is applied to a single control only and you have advantage to pass arguments to event handler. In
this approach event handler methods can access private data of Activity. No reference is needed
to call to Activity.
But if you applied the handler to more than one control, you would have to cut and paste the
code for the handler and if the code for the handler is long, it makes the code harder to maintain.
Following are the simple steps to show how we will make use of separate Listener class to
register and capture click event. Similar way you can implement your listener for any other
required event type.
Step Description
1 You will use AndroidstudioIDEto create an Androidapplicationandname itas myapplication
undera package com.example.myapplication asexplainedinthe Hello World Examplechapter.
2 Modify src/MainActivity.java file toaddclickeventlistenersandhandlersforthe twobuttons
defined.
3 Modifythe detaultcontentof res/layout/activity_main.xmlfile toinclude AndroidUIcontrols.
4 No needtodeclare defaultstringconstants.Androidstudiotakescare defaultconstants.
5 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
aplication.
Following is the content of the modified main activity file
src/com.example.myapplication/MainActivity.java. This file can include each of the
fundamental lifecycle methods.
package com.example.myapplication;
public class MainActivity extends ActionBarActivity {
private ProgressDialog progress;
Button b1,b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progress = new ProgressDialog(this);
b1=(Button)findViewById(R.id.button);
b2=(Button)findViewById(R.id.button2);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView txtView = (TextView) findViewById(R.id.textView);
txtView.setTextSize(25);
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView txtView = (TextView) findViewById(R.id.textView);
txtView.setTextSize(55);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Following will be the content of res/layout/activity_main.xml file −
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Event Handling "
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp"/>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small font"
android:id="@+id/button"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Font"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/textView"
android:layout_below="@+id/button2"
android:layout_centerHorizontal="true"
android:textSize="25dp" />
</RelativeLayout>
Following will be the content of res/values/strings.xml to define two new constants −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">myapplication</string>
<string name="action_settings">Settings</string>
</resources>
Following is the default content of AndroidManifest.xml −
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.myapplication.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>
Let's try to run your myapplication application. I assume you had created your AVD while
doing environment setup. To run the app from Android Studio, open one of your project's
activity files and click Run icon from the toolbar. Android Studio installs the app on your
AVD and starts it and if everything is fine with your setup and application, it will display
following Emulator window −
Now you try to click on two buttons, one by one and you will see that font of the Hello World
text will change, which happens because registered click event handler method is being called
against each click event.
Exercise
I will recommend to try writing different event handlers for different event types and understand
exact difference in different event types and their handling. Events related to menu, spinner,
pickers widgets are little different but they are also based on the same concepts as explained
above.
Android - Styles and Themes
A style resource defines the format and look for a UI. A style can be applied to an individual
View (from within a layout file) or to an entire Activity or application (from within the manifest
file).
Defining Styles
A style is defined in an XML resource that is separate from the XML that specifies the layout.
This XML file resides under res/values/ directory of your project and will have <resources> as
the root node which is mandatory for the style file. The name of the XML file is arbitrary, but it
must use the .xml extension.
You can define multiple styles per file using <style> tag but each style will have its name that
uniquely identifies the style. Android style attributes are set using <item> tag as shown below −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomFontStyle">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:capitalize">characters</item>
<item name="android:typeface">monospace</item>
<item name="android:textSize">12pt</item>
<item name="android:textColor">#00FF00</item>/>
</style>
</resources>
The value forthe <item>can be a keywordstring,ahex color,a reference toanotherresource type,or
othervalue dependingonthe style property.
Using Styles
Once your style is defined, you can use it in your XML Layout file using style attribute as
follows −
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/text_id"
style="@style/CustomFontStyle"
android:text="@string/hello_world" />
</LinearLayout>
To understand the concept related to Android Style, you can check Style Demo Example.
Style Inheritance
Android supports style Inheritance in very much similar way as cascading style sheet in web
design. You can use this to inherit properties from an existing style and then define only the
properties that you want to change or add.
To implement a custom theme create or edit MyAndroidApp/res/values/themes.xml and add the
following −
<resources>
...
<style name="MyCustomTheme" parent="android:style/Theme">
<item name="android:textColorPrimary">#ffff0000</item>
</style>
...
</resources>
In your AndroidManifest.xml apply the theme to the activities you want to style −
<activity
android:name="com.myapp.MyActivity"
...
android:theme="@style/MyCustomTheme"
/>
Your new theme will be applied to your activity, and text is now bright red.
Applying Colors to Theme Attributes
Your color resource can then be applied to some theme attributes, such as the window
background and the primary text color, by adding elements to your custom theme. These
attributes are defined in your styles.xml file. For example, to apply the custom color to the
window background, add the following two elements to your custom theme, defined in
MyAndroidApp/res/values/styles.xml file −
<resources>
...
<style name="MyCustomTheme" ...>
<item name="android:windowBackground">@color/my_custom_color</item>
<item
name="android:colorBackgroundCacheHint">@color/my_custom_color</item>
</style>
...
</resources>
Using a Custom Nine-Patch With Buttons
A nine-patch drawable is a special kind of image which can be scaled in width and height while
maintaining its visual integrity. Nine-patches are the most common way to specify the
appearance of Android buttons, though any drawable type can be used.
a Sample of Nine-Patch button
Stepsto create Nine-PatchButtons
 Save thisbitmapas /res/drawable/my_nine_patch.9.png
 Define anewstyle
 Applythe newbuttonstyle tothe buttonStyle attribute of yourcustomtheme
Define a new Style
<resources>
...
<style name="MyCustomButton" parent="android:Widget.Button">
<item name="android:background">@drawable/my_nine_patch</item>
</style>
...
</resources>
Apply the theme
<resources>
...
<style name="MyCustomTheme" parent=...>
...
<item name="android:buttonStyle">@style/MyCustomButton</item>
</style>
...
</resources>
Android Themes
Hope you understood the concept of Style, so now let's try to understand what is a Theme. A
theme is nothing but an Android style applied to an entire Activity or application, rather than an
individual View.
Thus, when a style is applied as a theme, every View in the Activity or application will apply
each style property that it supports. For example, you can apply the same CustomFontStyle
style as a theme for an Activity and then all text inside that Activity will have green monospace
font.
To set a theme for all the activities of your application, open the AndroidManifest.xml file and
edit the <application> tag to include the android:theme attribute with the style name. For
example −
<application android:theme="@style/CustomFontStyle">
But if you want a theme applied to just one Activity in your application, then add the
android:theme attribute to the <activity> tag only. For example −
<activity android:theme="@style/CustomFontStyle">
There are number of default themes defined by Android which you can use directly or inherit
them using parent attribute as follows −
<style name="CustomTheme" parent="android:Theme.Light">
...
</style>
To understand the concept related to Android Theme, you can check Theme Demo Example.
Styling the colour palette
The layout design can implementable based on them based colours, for example as following
design is designed based on them colour(blue)
Above layout has designed based on style.xml file,Which has placed at res/values/
<resource>
<style name="AppTheme" parent="android:Theme.Material">
<item name ="android:color/primary">@color/primary</item>
<item name ="android:color/primaryDark">@color/primary_dark</item>
<item name ="android:colorAccent/primary">@color/accent</item>
</style>
<resource>
Default Styles & Themes
The Android platform provides a large collection of styles and themes that you can use in your
applications. You can find a reference of all available styles in the R.style class. To use the styles
listed here, replace all underscores in the style name with a period. For example, you can apply
the Theme_NoTitleBar theme with "@android:style/Theme.NoTitleBar". You can see the
following source code for Android styles and themes −
 Android Styles (styles.xml)
 Android Themes (themes.xml)
Android - Custom Components
Implementing own components in pre built-in components with extending subclass with own
defined class
Android offers a great list of pre-built widgets like Button, TextView, EditText, ListView,
CheckBox, RadioButton, Gallery, Spinner, AutoCompleteTextView etc. which you can use
directly in your Android application development, but there may be a situation when you are not
satisfied with existing functionality of any of the available widgets. Android provides you with
means of creating your own custom components which you can customized to suit your needs.
If you only need to make small adjustments to an existing widget or layout, you can simply
subclass the widget or layout and override its methods which will give you precise control over
the appearance and function of a screen element.
This tutorial explains you how to create custom Views and use them in your application using
simple and easy steps.
Example of Custom Components in Custom View hierarchy
Creating a Simple Custom Component
Step Description
1 You will use AndroidstudioIDEto create an Androidapplicationandname itas compoundview
undera package com.vogella.android.customview.compoundview asexplainedinthe Hello World
Examplechapter.
2 Create an XML res/values/attrs.xmlfile todefine new attributesalongwiththeirdatatype.
3 Create src/ColorOptionsView.java file andaddthe code to define yourcustomcomponent.Itwill
extendLinearLayoutandwillhave additional functionalitytoshow colourcompound.You will
provide attributesparsinglogicinof the constructorshavingAttributeSetasa parameter.
4 Modify res/layout/activity_main.xmlfileandaddthe code to create Colourcompoundview
instance alongwithfewdefaultattributesandnew attributes.
5 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Create the following attributes file called attrs.xml in your res/values folder.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Options">
<attr name="titleText" format="string" localization="suggested" />
<attr name="valueColor" format="color" />
</declare-styleable>
</resources>
Change the layout file used by the activity to the following.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res/com.vogella.android.view.com
poundview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:showDividers="middle"
android:divider="?android:attr/listDivider"
tools:context=".MainActivity" >
<com.vogella.android.view.compoundview.ColorOptionsView
android:id="@+id/view1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="?android:selectableItemBackground"
android:onClick="onClicked"
custom:titleText="Background color"
custom:valueColor="@android:color/holo_green_light"/>
<com.vogella.android.view.compoundview.ColorOptionsView
android:id="@+id/view2"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="?android:selectableItemBackground"
android:onClick="onClicked"
custom:titleText="Foreground color"
custom:valueColor="@android:color/holo_orange_dark"/>
</LinearLayout>
Create the following java file called ColorOptionsView for your compound view.
package com.vogella.android.customview.compoundview;
import com.vogella.android.view.compoundview.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ColorOptionsView extends LinearLayout {
private View mValue;
private ImageView mImage;
public ColorOptionsView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a =
context.obtainStyledAttributes(attrs,R.styleable.ColorOptionsView, 0, 0);
String titleText = a.getString(R.styleable.ColorOptionsView_titleText);
int valueColor =
a.getColor(R.styleable.ColorOptionsView_valueColor,android.R.color.holo_blue_
light);
a.recycle();
setOrientation(LinearLayout.HORIZONTAL);
setGravity(Gravity.CENTER_VERTICAL);
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_color_options, this, true);
TextView title = (TextView) getChildAt(0);
title.setText(titleText);
mValue = getChildAt(1);
mValue.setBackgroundColor(valueColor);
mImage = (ImageView) getChildAt(2);
}
public ColorOptionsView(Context context) {
this(context, null);
}
public void setValueColor(int color) {
mValue.setBackgroundColor(color);
}
public void setImageVisible(boolean visible) {
mImage.setVisibility(visible ? View.VISIBLE : View.GONE);
}
}
Change your Main activity java file to the following code and run your application.
package com.vogella.android.customview.compoundview;
import com.vogella.android.view.compoundview.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void onClicked(View view) {
String text = view.getId() == R.id.view1 ? "Background" : "Foreground";
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
}
The running application should look like the following screen shot.
Instantiate usingcodeinsideactivityclass
It is very similar way of instantiating custom component the way you instantiate built-in widget
in your activity class. For example you can use following code to instantiate above defined
custom component −
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DateView dateView = new DateView(this);
setContentView(dateView);
}
Check Above example to understand how to Instantiate a Basic Android Custom Component
using code inside an activity.
Instantiate usingLayoutXML file
Traditionally you use Layout XML file to instantiate your built-in widgets, same concept will
apply on your custom widgets as well so you will be able to instantiate your custom component
using Layout XML file as explained below. Here com.example.compoundview is the package
where you have put all the code related to DateView class and DateView is Java class name
where you have put complete logic of your custom component.
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<com.example.compoundview.DateView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#fff"
android:textSize="40sp"
android:background="#000"/>
</RelativeLayout>
It is important to note here that we are using all TextView attributes along with custom
component without any change. Similar way you will be able to use all the events, and methods
along with DateView component.
Check this example to understand how to Instantiate a Basic Android Custom Component using
Layout XML file.
Custom Component with Custom Attributes
We have seen how we can extend functionality of built-in widgets but in both the examples
given above we saw that extended component can make use of all the default attributes of its
parent class. But consider a situation when you want to create your own attribute from scratch.
Below is a simple procedure to create and use new attributes for Android Custom components.
Consider we want to introduce three attributes and will use them as shown below −
<com.example.compoundview.DateView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#fff"
android:textSize="40sp"
custom:delimiter="-"
custom:fancyText="true"/>
Step 1
The first step to enable us to use our custom attributes is to define them in a new xml file under
res/values/ and call it attrs.xml. Let's have a look on an example attrs.xml file −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="DateView">
<attr name="delimiter" format="string"/>
<attr name="fancyText" format="boolean"/>
</declare-styleable>
</resources>
Here the name=value is what we want to use in our Layout XML file as attribute, and the
format=type is the type of attribute.
Step 2
Your second step will be to read these attributes from Layout XML file and set them for the
component. This logic will go in the constructors that get passed an AttributeSet, since that is
what contains the XML attributes. To read the values in the XML, you need to first create a
TypedArray from the AttributeSet, then use that to read and set the values as shown in the below
example code −
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DateView);
final int N = a.getIndexCount();
for (int i = 0; i < N; ++i)
{
int attr = a.getIndex(i);
switch (attr)
{
case R.styleable.DateView_delimiter:
String delimiter = a.getString(attr);
//...do something with delimiter...
break;
case R.styleable.DateView_fancyText:
boolean fancyText = a.getBoolean(attr, false);
//...do something with fancyText...
break;
}
}
a.recycle();
Step 3
Finally you can use your defined attributes in your Layout XML file as follows −
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res/com.example.compoundview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<com.example.compoundview.DateView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#fff"
android:textSize="40sp"
custom:delimiter="-"
custom:fancyText="true"/>
</RelativeLayout>
The important part is
xmlns:custom="http://schemas.android.com/apk/res/com.example.compoundview". Note that
http://schemas.android.com/apk/res/ will remain as is, but last part will be set to your package
name and also that you can use anything after xmlns:, in this example I used custom, but you
could use any name you like.
Check this example to understand how to Create Custom Attributes for Android Custom
Component with simple steps.
Android - Drag and Drop
Android drag/drop framework allows your users to move data from one View to another View in
the current layout using a graphical drag and drop gesture. As of API 11 drag and drop of view
onto other views or view groups is supported.The framework includes following three important
components to support drag & drop functionality −
 Drag event class:
 Drag listeners:
 Helper methods and classes:
The Drag/Drop Process
There are basically four steps or states in the drag and drop process:
 Started − This event occurs when you start dragging an item in a layout, your application
calls startDrag() method to tell the system to start a drag. The arguments inside
startDrag() method provide the data to be dragged, metadata for this data, and a callback
for drawing the drag shadow.
The system first responds by calling back to your application to get a drag shadow. It
then displays the drag shadow on the device.
Next, the system sends a drag event with action type ACTION_DRAG_STARTED to the
registered drag event listeners for all the View objects in the current layout.
To continue to receive drag events, including a possible drop event, a drag event listener
must return true, If the drag event listener returns false, then it will not receive drag
events for the current operation until the system sends a drag event with action type
ACTION_DRAG_ENDED.
 Continuing − The user continues the drag. System sends ACTION_DRAG_ENTERED
action followed by ACTION_DRAG_LOCATION action to the registered drag event
listener for the View where dragging point enters. The listener may choose to alter its
View object's appearance in response to the event or can react by highlighting its View.
The drag event listener receives a ACTION_DRAG_EXITED action after the user has
moved the drag shadow outside the bounding box of the View.
 Dropped − The user releases the dragged item within the bounding box of a View. The
system sends the View object's listener a drag event with action type ACTION_DROP.
 Ended − Just after the action type ACTION_DROP, the system sends out a drag event
with action type ACTION_DRAG_ENDED to indicate that the drag operation is over.
The DragEvent Class
The DragEvent represents an event that is sent out by the system at various times during a drag
and drop operation. This class provides few Constants and important methods which we use
during Drag/Drop process.
Constants
Following are all constants integers available as a part of DragEvent class.
Sr.No. Constants & Description
1 ACTION_DRAG_STARTED
Signals the start of a drag and drop operation.
2 ACTION_DRAG_ENTERED
Signals to a View that the drag point has entered the bounding box of the View.
3 ACTION_DRAG_LOCATION
Sent to a View after ACTION_DRAG_ENTERED if the drag shadow is still within the
View object's bounding box.
4 ACTION_DRAG_EXITED
Signals that the user has moved the drag shadow outside the bounding box of the View.
5 ACTION_DROP
Signals to a View that the user has released the drag shadow, and the drag point is within
the bounding box of the View.
6 ACTION_DRAG_ENDED
Signals to a View that the drag and drop operation has concluded.
Methods
Following are few important and most frequently used methods available as a part of DragEvent
class.
Sr.No. Constants & Description
1 int getAction()
Inspect the action value of this event..
2 ClipData getClipData()
Returns the ClipData object sent to the system as part of the call to startDrag().
3 ClipDescriptiongetClipDescription()
Returns the ClipDescription object contained in the ClipData.
4 booleangetResult()
Returns an indication of the result of the drag and drop operation.
5 float getX()
Gets the X coordinate of the drag point.
6 float getY()
Gets the Y coordinate of the drag point.
7 String toString()
Returns a string representation of this DragEvent object.
Listening for Drag Event
If you want any of your views within a Layout should respond Drag event then your view either
implements View.OnDragListener or setup onDragEvent(DragEvent) callback method. When
the system calls the method or listener, it passes to them a DragEvent object explained above.
You can have both a listener and a callback method for View object. If this occurs, the system
first calls the listener and then defined callback as long as listener returns true.
The combination of the onDragEvent(DragEvent) method and View.OnDragListener is
analogous to the combination of the onTouchEvent() and View.OnTouchListener used with
touch events in old versions of Android.
Starting a Drag Event
You start with creating a ClipData and ClipData.Item for the data being moved. As part of the
ClipData object, supply metadata that is stored in a ClipDescription object within the ClipData.
For a drag and drop operation that does not represent data movement, you may want to use null
instead of an actual object.
Next either you can extend extend View.DragShadowBuilder to create a drag shadow for
dragging the view or simply you can use View.DragShadowBuilder(View) to create a default
drag shadow that's the same size as the View argument passed to it, with the touch point centered
in the drag shadow.
Example
Following example shows the functionality of a simple Drag & Drop using
View.setOnLongClickListener(), View.setOnTouchListener()and
View.OnDragEventListener().
Step Description
1 You will use AndroidstudioIDEto create an Androidapplicationandname itas My Application
undera package com.example.saira_000.myapplication.While creatingthisproject,make sure
youTarget SDK andCompile With at the latestversionof AndroidSDKtouse higherlevelsof APIs.
2 Modify src/MainActivity.java file andaddthe code to define eventlistenersaswell asacall back
methodsforthe logoimage usedinthe example.
3 Copyimage abc.pngin res/drawable-*folders.Youcanuse imageswithdifferentresolutionin
case youwantto provide themfordifferentdevices.
4 ModifylayoutXML file res/layout/activity_main.xmltodefine defaultview of the logoimages.
5 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file src/MainActivity.java. This file can
include each of the fundamental lifecycle methods.
package com.example.saira_000.myapplication;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipDescription;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.DragEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class MainActivity extends Activity {
ImageView img;
String msg;
private android.widget.RelativeLayout.LayoutParams layoutParams;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=(ImageView)findViewById(R.id.imageView);
img.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence)v.getTag());
String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData = new ClipData(v.getTag().toString(),mimeTypes,
item);
View.DragShadowBuilder myShadow = new
View.DragShadowBuilder(img);
v.startDrag(dragData,myShadow,null,0);
return true;
}
});
img.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
switch(event.getAction())
{
case DragEvent.ACTION_DRAG_STARTED:
layoutParams =
(RelativeLayout.LayoutParams)v.getLayoutParams();
Log.d(msg, "Action is DragEvent.ACTION_DRAG_STARTED");
// Do nothing
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENTERED");
int x_cord = (int) event.getX();
int y_cord = (int) event.getY();
break;
case DragEvent.ACTION_DRAG_EXITED :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_EXITED");
x_cord = (int) event.getX();
y_cord = (int) event.getY();
layoutParams.leftMargin = x_cord;
layoutParams.topMargin = y_cord;
v.setLayoutParams(layoutParams);
break;
case DragEvent.ACTION_DRAG_LOCATION :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION");
x_cord = (int) event.getX();
y_cord = (int) event.getY();
break;
case DragEvent.ACTION_DRAG_ENDED :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENDED");
// Do nothing
break;
case DragEvent.ACTION_DROP:
Log.d(msg, "ACTION_DROP event");
// Do nothing
break;
default: break;
}
return true;
}
});
img.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("", "");
View.DragShadowBuilder shadowBuilder = new
View.DragShadowBuilder(img);
img.startDrag(data, shadowBuilder, img, 0);
img.setVisibility(View.INVISIBLE);
return true;
}
else
{
return false;
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Following will be the content of res/layout/activity_main.xml file −
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Drag and Drop Example"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials Point"
android:id="@+id/textView2"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:textSize="30dp"
android:textColor="#ff14be3c" />>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2"
android:layout_alignLeft="@+id/textView2"
android:layout_alignStart="@+id/textView2" />
</RelativeLayout>
Following will be the content of res/values/strings.xml to define two new constants −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application</string>
<string name="action_settings">Settings</string>
</resources>
Following is the default content of AndroidManifest.xml −
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.guidemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="22" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.guidemo.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>
Let's try to run your My Application application. I assume you had created your AVD while
doing environment setup. To run the app from Android Studio, open one of your project's
activity files and click Run icon from the toolbar. Android studio installs the app on your
AVD and starts it and if everything is fine with your setup and application, it will display
following Emulator window −
Now do long click on the displayed TutorialsPoint logo and you will see that logo image moves
a little after 1 seconds long click from its place, its the time when you should start dragging the
image. You can drag it around the screen and drop it at a new location.
Android - Notifications
A notification is a message you can display to the user outside of your application's normal UI.
When you tell the system to issue a notification, it first appears as an icon in the notification area.
To see the details of the notification, the user opens the notification drawer. Both the notification
area and the notification drawer are system-controlled areas that the user can view at any time.
Android Toast class provides a handy way to show users alerts but problem is that these alerts
are not persistent which means alert flashes on the screen for a few seconds and then disappears.
To see the details of the notification, you will have to select the icon which will display
notification drawer having detail about the notification. While working with emulator with
virtual device, you will have to click and drag down the status bar to expand it which will give
you detail as follows. This will be just 64 dp tall and called normal view.
Above expanded form can have a Big View which will have additional detail about the
notification. You can add upto six additional lines in the notification. The following screen shot
shows such notification.
Create and Send Notifications
You have simple way to create a notification. Follow the following steps in your application to
create a notification −
Step 1 - CreateNotificationBuilder
As a first step is to create a notification builder using NotificationCompat.Builder.build(). You
will use Notification Builder to set various Notification properties like its small and large icons,
title, priority etc.
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
Step 2 - SettingNotificationProperties
Once you have Builder object, you can set its Notification properties using Builder object as per
your requirement. But this is mandatory to set at least following −
 A small icon, set by setSmallIcon()
 A title, set by setContentTitle()
 Detail text, set by setContentText()
mBuilder.setSmallIcon(R.drawable.notification_icon);
mBuilder.setContentTitle("Notification Alert, Click Me!");
mBuilder.setContentText("Hi, This is Android Notification Detail!");
You have plenty of optional properties which you can set for your notification. To learn more
about them, see the reference documentation for NotificationCompat.Builder.
Step 3 - Attach Actions
This is an optional part and required if you want to attach an action with the notification. An
action allows users to go directly from the notification to an Activity in your application, where
they can look at one or more events or do further work.
The action is defined by a PendingIntent containing an Intent that starts an Activity in your
application. To associate the PendingIntent with a gesture, call the appropriate method of
NotificationCompat.Builder. For example, if you want to start Activity when the user clicks the
notification text in the notification drawer, you add the PendingIntent by calling
setContentIntent().
A PendingIntent object helps you to perform an action on your applications behalf, often at a
later time, without caring of whether or not your application is running.
We take help of stack builder object which will contain an artificial back stack for the started
Activity. This ensures that navigating backward from the Activity leads out of your application
to the Home screen.
Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
Step 4 - Issuethe notification
Finally, you pass the Notification object to the system by calling NotificationManager.notify() to
send your notification. Make sure you call NotificationCompat.Builder.build() method on
builder object before notifying it. This method combines all of the options that have been set and
return a new Notification object.
NotificationManager mNotificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
// notificationID allows you to update the notification later on.
mNotificationManager.notify(notificationID, mBuilder.build());
The NotificationCompat.Builder Class
The NotificationCompat.Builder class allows easier control over all the flags, as well as help
constructing the typical notification layouts. Following are few important and most frequently
used methods available as a part of NotificationCompat.Builder class.
Sr.No. Constants & Description
1 Notificationbuild()
Combine all of the options that have been set and return a new Notification object.
2 NotificationCompat.BuildersetAutoCancel (booleanautoCancel)
Setting this flag will make it so the notification is automatically canceled when the user
clicks it in the panel.
3 NotificationCompat.BuildersetContent(RemoteViewsviews)
Supply a custom RemoteViews to use instead of the standard one.
4 NotificationCompat.BuildersetContentInfo(CharSequence info)
Set the large text at the right-hand side of the notification.
5 NotificationCompat.BuildersetContentIntent(PendingIntentintent)
Supply a PendingIntent to send when the notification is clicked.
6 NotificationCompat.BuildersetContentText(CharSequence text)
Set the text (second row) of the notification, in a standard notification.
7 NotificationCompat.BuildersetContentTitle (CharSequence title)
Set the text (first row) of the notification, in a standard notification.
8 NotificationCompat.BuildersetDefaults(intdefaults)
Set the default notification options that will be used.
9 NotificationCompat.BuildersetLargeIcon(Bitmapicon)
Set the large icon that is shown in the ticker and notification.
10 NotificationCompat.BuildersetNumber(intnumber)
Set the large number at the right-hand side of the notification.
11 NotificationCompat.BuildersetOngoing(booleanongoing)
Set whether this is an ongoing notification.
12 NotificationCompat.BuildersetSmallIcon(inticon)
Set the small icon to use in the notification layouts.
13 NotificationCompat.BuildersetStyle (NotificationCompat.Style style)
Add a rich notification style to be applied at build time.
14 NotificationCompat.BuildersetTicker(CharSequence tickerText)
Set the text that is displayed in the status bar when the notification first arrives.
15 NotificationCompat.BuildersetVibrate (long[]pattern)
Set the vibration pattern to use.
16 NotificationCompat.BuildersetWhen(longwhen)
Set the time that the event occurred. Notifications in the panel are sorted by this time.
Example
Following example shows the functionality of a Android notification using a
NotificationCompat.Builder Class which has been introduced in Android 4.1.
Step Description
1 You will use AndroidstudioIDEto create an Androidapplicationandname itas tutorialspoint
undera package com.example.notificationdemo.While creatingthisproject,make sure you
Target SDK and CompileWith at the latestversionof AndroidSDKtouse higherlevelsof APIs.
2 Modify src/MainActivity.java file andaddthe code to notify(""),if userclickonthe button,itwill
call androidnotificationservice.
3 Create a newJava file src/NotificationView.java,whichwill be usedtodisplaynew layoutasa
part of newactivitywhichwill be startedwhen userwill clickanyof the notifications
4 ModifylayoutXML file res/layout/activity_main.xmltoaddNotificationbuttoninrelative layout.
5 Create a newlayoutXML file res/layout/notification.xml.Thiswillbe usedaslayoutfile fornew
activity whichwill startwhenuserwill clickanyof the notifications.
6 No needtochange defaultstringconstants.Androidstudiotakescare of defaultstringconstants
7 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file
src/com.example.notificationdemo/MainActivity.java. This file can include each of the
fundamental lifecycle methods.
package com.example.notificationdemo;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Notify("You've received new message");
}
});
}
private void Notify(String notificationTitle, String notificationMessage){
NotificationManager notificationManager = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
@SuppressWarnings("deprecation")
Notification notification = new Notification(R.drawable.abc,"New
Message", System.currentTimeMillis());
Intent notificationIntent = new Intent(this,NotificationView.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,
0,notificationIntent, 0);
notification.setLatestEventInfo(MainActivity.this,
notificationTitle,notificationMessage, pendingIntent);
notificationManager.notify(9999, notification);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Following will be the content of res/layout/notification.xml file:
<?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="400dp"
android:text="Hi, Your Detailed notification view goes here...." />
</LinearLayout>
Following is the content of the modified main activity file
src/com.example.notificationdemo/NotificationView.java.
package com.example.notificationdemo;
import android.os.Bundle;
import android.app.Activity;
public class NotificationView extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.notification);
}
}
Following will be the content of res/layout/activity_main.xml file −
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Notification Example"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true"
android:layout_marginTop="48dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true"
android:layout_marginTop="42dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Notification"
android:id="@+id/button"
android:layout_marginTop="62dp"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Following will be the content of res/values/strings.xml to define two new constants −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="action_settings">Settings</string>
<string name="app_name">tutorialspoint </string>
</resources>
Following is the default content of AndroidManifest.xml −
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.notificationdemo"
android:versionCode="1"
android:versionName="1.0" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.notificationdemo.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>
<activity android:name=".NotificationView"
android:label="Details of notification"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
</application>
</manifest>
Let's try to run your tutorialspoint application. I assume you had created your AVD while doing
environment set-up. To run the APP from Android Studio, open one of your project's activity
files and click Run icon from the toolbar. Android Studio installs the app on your AVD and
starts it and if everything is fine with your setup and application, it will display following
Emulator window −
Now click button, you will see at the top a message "New Message Alert!" will display
momentarily and after that you will have following screen having a small icon at the top left
corner.
Now lets expand the view, long click on the small icon, after a second it will display date
information and this is the time when you should drag status bar down without releasing mouse.
You will see status bar will expand and you will get following screen −
Big View Notification
The following code snippet demonstrates how to alter the notification created in the previous
snippet to use the Inbox big view style. I'm going to update displayNotification() modification
method to show this functionality −
protected void displayNotification() {
Log.i("Start", "notification");
/* Invoking the default notification service */
NotificationCompat.Builder mBuilder = new
NotificationCompat.Builder(this);
mBuilder.setContentTitle("New Message");
mBuilder.setContentText("You've received new message.");
mBuilder.setTicker("New Message Alert!");
mBuilder.setSmallIcon(R.drawable.woman);
/* Increase notification number every time a new notification arrives */
mBuilder.setNumber(++numMessages);
/* Add Big View Specific Configuration */
NotificationCompat.InboxStyle inboxStyle = new
NotificationCompat.InboxStyle();
String[] events = new String[6];
events[0] = new String("This is first line....");
events[1] = new String("This is second line...");
events[2] = new String("This is third line...");
events[3] = new String("This is 4th line...");
events[4] = new String("This is 5th line...");
events[5] = new String("This is 6th line...");
// Sets a title for the Inbox style big view
inboxStyle.setBigContentTitle("Big Title Details:");
// Moves events into the big view
for (int i=0; i < events.length; i++) {
inboxStyle.addLine(events[i]);
}
mBuilder.setStyle(inboxStyle);
/* Creates an explicit intent for an Activity in your app */
Intent resultIntent = new Intent(this, NotificationView.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(NotificationView.class);
/* Adds the Intent that starts the Activity to the top of the stack */
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent
=stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
mNotificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
/* notificationID allows you to update the notification later on. */
mNotificationManager.notify(notificationID, mBuilder.build());
}
Now if you will try to run your application then you will find following result in expanded form
of the view −
Android - Location Based Services
Android location APIs make it easy for you to build location-aware applications, without
needing to focus on the details of the underlying location technology.
This becomes possible with the help of Google Play services, which facilitates adding location
awareness to your app with automated location tracking, geofencing, and activity recognition.
This tutorial shows you how to use Location Services in your APP to get the current location, get
periodic location updates, look up addresses etc.
The Location Object
The Location object represents a geographic location which can consist of a latitude, longitude,
time stamp, and other information such as bearing, altitude and velocity. There are following
important methods which you can use with Location object to get location specific information:
Sr.No. Method & Description
1 float distanceTo(Locationdest)
Returns the approximate distance in meters between this location and the given location.
2 float getAccuracy()
Get the estimated accuracy of this location, in meters.
3 double getAltitude()
Get the altitude if available, in meters above sea level.
4 float getBearing()
Get the bearing, in degrees.
5 double getLatitude()
Get the latitude, in degrees.
6 double getLongitude()
Get the longitude, in degrees.
7 float getSpeed()
Get the speed if it is available, in meters/second over ground.
8 booleanhasAccuracy()
True if this location has an accuracy.
9 booleanhasAltitude()
True if this location has an altitude.
10 booleanhasBearing()
True if this location has a bearing.
11 booleanhasSpeed()
True if this location has a speed.
12 void reset()
Clears the contents of the location.
13 void setAccuracy(floataccuracy)
Set the estimated accuracy of this location, meters.
14 void setAltitude(double altitude)
Set the altitude, in meters above sea level.
15 void setBearing(floatbearing)
Set the bearing, in degrees.
16 void setLatitude(double latitude)
Set the latitude, in degrees.
17 void setLongitude(double longitude)
Set the longitude, in degrees.
18 void setSpeed(floatspeed)
Set the speed, in meters/second over ground.
19 String toString()
Returns a string containing a concise, human-readable description of this object.
Get the Current Location
To get the current location, create a location client which is LocationClient object, connect it to
Location Services using connect() method, and then call its getLastLocation() method. This
method returns the most recent location in the form of Location object that contains latitude and
longitude coordinates and other information as explained above. To have location based
functionality in your activity, you will have to implement two interfaces −
 GooglePlayServicesClient.ConnectionCallbacks
 GooglePlayServicesClient.OnConnectionFailedListener
These interfaces provide following important callback methods, which you need to implement in
your activity class −
Sr.No. Callback Methods & Description
1 abstract void onConnected(BundleconnectionHint)
This callback method is called when location service is connected to the location client
successfully. You will use connect() method to connect to the location client.
2 abstract void onDisconnected()
This callback method is called when the client is disconnected. You will use
disconnect() method to disconnect from the location client.
3 abstract void onConnectionFailed(ConnectionResultresult)
This callback method is called when there was an error connecting the client to the
service.
You shouldcreate the locationclientin onCreate() methodof youractivityclass,thenconnectitin
onStart(),so that LocationServicesmaintainsthe currentlocationwhile youractivityisfullyvisible.You
shoulddisconnectthe clientin onStop() method,sothatwhenyourapp isnot visible,LocationServices
isnot maintainingthe currentlocation.Thishelpsinsavingbatterypowerup-toalarge extent.
Get the Updated Location
If you are willing to have location updates, then apart from above mentioned interfaces, you will
need to implement LocationListener interface as well. This interface provide following callback
method, which you need to implement in your activity class −
Sr.No. Callback Method & Description
1 abstract void onLocationChanged(Locationlocation)
This callback method is used for receiving notifications from the LocationClient when
the location has changed.
Location Quality of Service
The LocationRequest object is used to request a quality of service (QoS) for location updates
from the LocationClient. There are following useful setter methods which you can use to handle
QoS. There are equivalent getter methods available which you can check in Android official
documentation.
Sr.No. Method & Description
1 setExpirationDuration(longmillis)
Set the duration of this request, in milliseconds.
2 setExpirationTime(longmillis)
Set the request expiration time, in millisecond since boot.
3 setFastestInterval(longmillis)
Explicitly set the fastest interval for location updates, in milliseconds.
4 setInterval(longmillis)
Set the desired interval for active location updates, in milliseconds.
5 setNumUpdates(intnumUpdates)
Set the number of location updates.
6 setPriority(intpriority)
Set the priority of the request.
Now for example, if your application wants high accuracy location it should create a location
request with setPriority(int) set to PRIORITY_HIGH_ACCURACY and setInterval(long) to 5
seconds. You can also use bigger interval and/or other priorities like PRIORITY_LOW_POWER
for to request "city" level accuracy or PRIORITY_BALANCED_POWER_ACCURACY for
"block" level accuracy.
Activitiesshouldstronglyconsiderremovingall locationrequestwhenenteringthe background(for
example atonPause()),orat leastswapthe requesttoa largerinterval andlowerqualitytosave power
consumption.
Displaying a Location Address
Once you have Location object, you can use Geocoder.getFromLocation() method to get an
address for a given latitude and longitude. This method is synchronous, and may take a long time
to do its work, so you should call the method from the doInBackground() method of an
AsyncTask class.
The AsyncTask must be subclassed to be used and the subclass will override
doInBackground(Params...) method to perform a task in the background and
onPostExecute(Result) method is invoked on the UI thread after the background computation
finishes and at the time to display the result. There is one more important method available in
AyncTask which is execute(Params... params), this method executes the task with the specified
parameters.
Check following example to have better understanding on how we use AynchTask in any
Android application to get work done in the background without interfering main task.
Example
Following example shows you in practical how to to use Location Services in your app to get the
current location and its equivalent addresses etc.
To experimentwiththisexample,youwillneedactual Mobile deviceequippedwithlatestAndroidOS,
otherwise youwillhave tostruggle withemulatorwhichmaynotwork.
Install the GooglePlayServicesSDK
Before you proceed to have location support in your Android Applications, you need to set-up
Google Play Services SDK using following simple steps −
Steps Description
1 Launch AndroidStudioIDE
 From Android Studio select file >project structure >dependencies > Click on +
button to add dependencies
 youwouldgetchoose librarydependencies dialogwindow
2 Searchfor com.google.android.gms:play-services:6.5.87or higherversionlibrary.itsdependon
whichandroidversionisusingwith.
3 Selectthe google playservicesandpressapplybuttonasshownbelow image
CreateAndroidApplication
Step Description
1 You will use AndroidstudioIDEto create an Androidapplicationandname itas Tutorialspoint
undera package com.example.Tutorialspoint.While creatingthisproject,make sure you Target
SDK andCompile With at the latestversionof AndroidSDKtouse higherlevelsof APIs.
2 AddGoogle Play Service libraryinyourprojectby followingsimple stepsgivenbelow.
3 Modify src/MainActivity.java file andaddrequiredcode asshownbelow totake care of getting
currentlocationand itsequivalentaddress.
4 ModifylayoutXML file res/layout/activity_main.xmltoaddall GUI componentswhichinclude
three buttonsandtwo textviewstoshow location/address.
5 Modify res/values/strings.xmltodefine requiredconstantvalues
6 Modify AndroidManifest.xmlasshownbelow
7 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Let's add Google Play Service reference in the project.Click on file > project structure >
dependencies > and select + and then search google play services which will show
com.google.android.gms:play-services:6.5.87 Click on ok button. it will close the choose
dependencies windows. you must be close project structure by clicking apply button
Above image is showing the result of adding google play services to project. after add google
play services to project. It should be as follows
Following is the content of the modified main activity file
src/com.example.Tutorialspoint/MainActivity.java.
package com.example.Tutorialspoint;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.location.LocationClient;
import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends FragmentActivity implements
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener
{
LocationClient mLocationClient;
private TextView addressLabel;
private TextView locationLabel;
private Button getLocationBtn;
private Button disconnectBtn;
private Button connectBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locationLabel = (TextView) findViewById(R.id.locationLabel);
addressLabel = (TextView) findViewById(R.id.addressLabel);
getLocationBtn = (Button) findViewById(R.id.getLocation);
getLocationBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
displayCurrentLocation();
}
});
disconnectBtn = (Button) findViewById(R.id.disconnect);
disconnectBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
mLocationClient.disconnect();
locationLabel.setText("Got disconnected....");
}
});
connectBtn = (Button) findViewById(R.id.connect);
connectBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
mLocationClient.connect();
locationLabel.setText("Got connected....");
}
});
// Create the LocationRequest object
mLocationClient = new LocationClient(this, this, this);
}
@Override
protected void onStart() {
super.onStart();
// Connect the client.
mLocationClient.connect();
locationLabel.setText("Got connected....");
}
@Override
protected void onStop() {
// Disconnect the client.
mLocationClient.disconnect();
super.onStop();
locationLabel.setText("Got disconnected....");
}
@Override
public void onConnected(Bundle dataBundle) {
// Display the connection status
Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
}
@Override
public void onDisconnected() {
// Display the connection status
Toast.makeText(this, "Disconnected. Please re-
connect.",Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
// Display the error code on failure
Toast.makeText(this, "Connection Failure : " +
connectionResult.getErrorCode(),Toast.LENGTH_SHORT).show();
}
public void displayCurrentLocation() {
// Get the current location's latitude & longitude
Location currentLocation = mLocationClient.getLastLocation();
String msg = "Current Location: " +
Double.toString(currentLocation.getLatitude()) + "," +
Double.toString(currentLocation.getLongitude());
// Display the current location in the UI
locationLabel.setText(msg);
// To display the current address in the UI
(new GetAddressTask(this)).execute(currentLocation);
}
/*
* Following is a subclass of AsyncTask which has been used to get
* address corresponding to the given latitude & longitude.
*/
private class GetAddressTask extends AsyncTask<Location, Void, String>{
Context mContext;
public GetAddressTask(Context context) {
super();
mContext = context;
}
/*
* When the task finishes, onPostExecute() displays the address.
*/
@Override
protected void onPostExecute(String address) {
// Display the current address in the UI
addressLabel.setText(address);
}
@Override
protected String doInBackground(Location... params) {
Geocoder geocoder =new Geocoder(mContext, Locale.getDefault());
// Get the current location from the input parameter list
Location loc = params[0];
// Create a list to contain the result address
<Address> addresses = null;
try {
addresses =
geocoder.getFromLocation(loc.getLatitude(),loc.getLongitude(), 1);
}
catch (IOException e1) {
Log.e("LocationSampleActivity",IO Exception in
getFromLocation());
e1.printStackTrace();
return ("IO Exception trying to get address");
}
catch (IllegalArgumentException e2) {
// Error message to post in the log
String errorString = "Illegal arguments " +
Double.toString(loc.getLatitude()) +" , "
+Double.toString(loc.getLongitude()) +" passed to address service";
Log.e("LocationSampleActivity", errorString);
e2.printStackTrace();
return errorString;
}
// If the reverse geocode returned an address
if (addresses != null && addresses.size() > 0) {
// Get the first address
Address address = addresses.get(0);
/*
* Format the first line of address (if available),
* city, and country name.
*/
String addressText = String.format("%s, %s, %s");
// If there's a street address, add it
address.getMaxAddressLineIndex() > 0 ?
address.getAddressLine(0) : "",
// Locality is usually a city
address.getLocality(),
// The country of the address
address.getCountryName());
// Return the text
return addressText;
}
else {
return "No address found";
}
}
}// AsyncTask class
}
Following will be the content of res/layout/activity_main.xml file −
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Location Example"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_below="@+id/textView1"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<ImageButton android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<Button android:id="@+id/getLocation"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/get_location"/>
<Button android:id="@+id/disconnect"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/disconnect"/>
<Button android:id="@+id/connect"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/connect"/>
<TextView
android:id="@+id/locationLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/addressLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Following will be the content of res/values/strings.xml to define two new constants:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Tutorialspoint</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="get_location">Get Location</string>
<string name="disconnect">Disconnect Service</string>
<string name="connect">Connect Service</string>
</resources>
Following is the default content of AndroidManifest.xml −
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.Tutorialspoint"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.Tutorialspoint.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>
Let's try to run your Tutorialspoint application. I assume that, you have connected your actual
Android Mobile device with your computer. To run the app from Android Studio, open one of
your project's activity files and click Run icon from the toolbar. Before starting your
application, Android studio installer will display following window to select an option where you
want to run your Android application.
Now to see location select Get Location Button which will display location information as
follows −
You can try by disconnecting location client using Disconnect Service and then connecting it by
using Connect Service button. You can also modify to get location update as explained above
and in Android Official documentation.
Android - Sending Email
Email is messages distributed by electronic means from one system user to one or more
recipients via a network
Before starting Email Activity, You must know Email functionality with intent, Intent is carrying
data from one component to another component with-in the application or outside the application
To send an email from your application, you don’t have to implement an email client from the
beginning, but you can use an existing one like the default Email app provided from Android,
Gmail, Outlook, K-9 Mail etc. For this purpose, we need to write an Activity that launches an
email client, using an implicit Intent with the right action and data. In this example, we are going
to send an email from our app by using an Intent object that launches existing email clients.
Following section explains different parts of our Intent object required to send an email.
Intent Object - Action to send Email
You will use ACTION_SEND action to launch an email client installed on your Android device.
Following is simple syntax to create an intent with ACTION_SEND action
Intent emailIntent = new Intent(Intent.ACTION_SEND);
Intent Object - Data/Type to send Email
To send an email you need to specify mailto: as URI using setData() method and data type will
be to text/plain using setType() method as follows −
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.setType("text/plain");
Intent Object - Extra to send Email
Android has built-in support to add TO, SUBJECT, CC, TEXT etc. fields which can be attached
to the intent before sending the intent to a target email client. You can use following extra fields
in your email −
Sr.No. Extra Data & Description
1 EXTRA_BCC
A String[] holding e-mail addresses that should be blind carbon copied.
2 EXTRA_CC
A String[] holding e-mail addresses that should be carbon copied.
3 EXTRA_EMAIL
A String[] holding e-mail addresses that should be delivered to.
4 EXTRA_HTML_TEXT
A constant String that is associated with the Intent, used with ACTION_SEND to supply
an alternative to EXTRA_TEXT as HTML formatted text.
5 EXTRA_SUBJECT
A constant string holding the desired subject line of a message.
6 EXTRA_TEXT
A constant CharSequence that is associated with the Intent, used with ACTION_SEND
to supply the literal data to be sent.
7 EXTRA_TITLE
A CharSequence dialog title to provide to the user when used with a
ACTION_CHOOSER.
Here is an example showing you how to assign extra data to your intent −
emailIntent.putExtra(Intent.EXTRA_EMAIL , new String[]{"Recipient"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "subject");
emailIntent.putExtra(Intent.EXTRA_TEXT , "Message Body");
The out-put of above code is as below shown an image
Email Example
Example
Following example shows you in practical how to use Intent object to launch Email client to send
an Email to the given recipients.
To Email experimentwiththisexample,youwillneedactual Mobiledevice equippedwithlatestAndroid
OS(Androidlollipop),otherwise youmightgetstruggle withemulatorwhichmaynotworkproperly.
Secondyouwill needtohave anEmail clientlike GMail(BydefaulteveryandroidversionhavingGmail
clientApp) orK9mail installedonyourdevice.
Step Description
1 You will use Android studiotocreate an Androidapplicationandname itas Tutorialspointunder
a package com.example.tutorialspoint.While creatingthisproject,make sure you TargetSDK and
CompileWith at the latestversionof AndroidSDKtouse higherlevelsof APIs.
2 Modify src/MainActivity.java file andaddrequiredcode totake care of sendingemail.
3 ModifylayoutXML file res/layout/activity_main.xmladdanyGUI componentif required.I'm
addinga simple buttontolaunchEmail Client.
4 Modify res/values/strings.xmltodefine requiredconstantvalues
5 Modify AndroidManifest.xmlasshownbelow
6 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file
src/com.example.Tutorialspoint/MainActivity.java.
package com.example.tutorialspoint;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startBtn = (Button) findViewById(R.id.sendEmail);
startBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
sendEmail();
}
});
}
protected void sendEmail() {
Log.i("Send email", "");
String[] TO = {""};
String[] CC = {""};
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
emailIntent.putExtra(Intent.EXTRA_CC, CC);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Your subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message goes here");
try {
startActivity(Intent.createChooser(emailIntent, "Send mail..."));
finish();
Log.i("Finished sending email...", "");
}
catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MainActivity.this, "There is no email client
installed.", Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Following will be the content of res/layout/activity_main.xml file −
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sending Mail Example"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:id="@+id/sendEmail"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/compose_email"/>
</LinearLayout>
Following will be the content of res/values/strings.xml to define two new constants −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Tutorialspoint</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="compose_email">Compose Email</string>
</resources>
Following is the default content of AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.Tutorialspoint"
android:versionCode="1"
android:versionName="1.0" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.tutorialspoint.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>
Let's try to run your tutorialspoint application. I assume you have connected your actual
Android Mobile device with your computer. To run the app from Android Studio, open one of
your project's activity files and click Run icon from the toolbar. Before starting your
application, Android studio installer will display following window to select an option where you
want to run your Android application.Select your mobile device as an option and then check your
mobile device which will display following screen −
Now use Compose Email button to list down all the installed email clients. From the list, you
can choose one of email clients to send your email. I'm going to use Gmail client to send my
email which will have all the provided defaults fields available as shown below. Here From: will
be default email ID you have registered for your Android device.
You can modify either of the given default fields and finally use send email button to send your
email to the mentioned recipients.
Android - Sending SMS
In Android, you can use SmsManager API or devices Built-in SMS application to send SMS's. In
this tutorial, we shows you two basic examples to send SMS message −
SmsManager API
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("phoneNo", null, "sms message", null, null);
Built-in SMS application
Intent sendIntent = new Intent(Intent.ACTION_VIEW);
sendIntent.putExtra("sms_body", "default content");
sendIntent.setType("vnd.android-dir/mms-sms");
startActivity(sendIntent);
Of course, both need SEND_SMS permission.
<uses-permission android:name="android.permission.SEND_SMS" />
Apart from the above method, there are few other important functions available in SmsManager
class. These methods are listed below −
Sr.No. Method & Description
1 ArrayList<String> divideMessage(Stringtext)
This method divides a message text into several fragments, none bigger than the
maximum SMS message size.
2 static SmsManager getDefault()
This method is used to get the default instance of the SmsManager
3 void sendDataMessage(StringdestinationAddress,StringscAddress,shortdestinationPort,
byte[]data, PendingIntentsentIntent,PendingIntentdeliveryIntent)
This method is used to send a data based SMS to a specific application port.
4 void sendMultipartTextMessage(StringdestinationAddress,StringscAddress,
ArrayList<String> parts, ArrayList<PendingIntent>sentIntents,ArrayList<PendingIntent>
deliveryIntents)
Send a multi-part text based SMS.
5 void sendTextMessage(StringdestinationAddress,StringscAddress,String text,PendingIntent
sentIntent,PendingIntentdeliveryIntent)
Send a text based SMS.
Example
Following example shows you in practical how to use SmsManager object to send an SMS to the
given mobile number.
To experimentwiththisexample,youwillneedactual Mobile deviceequippedwithlatestAndroidOS,
otherwise youwillhave tostruggle withemulatorwhichmaynotwork.
Step Description
1 You will use AndroidStudioIDEto create an Androidapplicationandname itas tutorialspoint
undera package com.example.tutorialspoint.Whilecreatingthisproject,make sure you Target
SDK andCompile With at the latestversionof AndroidSDKtouse higherlevelsof APIs.
2 Modify src/MainActivity.java file andaddrequiredcode totake care of sendingemail.
3 ModifylayoutXML file res/layout/activity_main.xmladdanyGUI componentif required.I'm
addinga simple GUIto take mobile numberandSMS textto be sentand a simple buttontosend
SMS.
4 No needtodefine defaultstringconstantsatres/values/strings.xml.Androidstudiotakescare of
defaultconstants.
5 Modify AndroidManifest.xmlasshownbelow
6 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file
src/com.example.tutorialspoint/MainActivity.java.
package com.example.tutorialspoint;
import android.os.Bundle;
import android.app.Activity;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
Button sendBtn;
EditText txtphoneNo;
EditText txtMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendBtn = (Button) findViewById(R.id.btnSendSMS);
txtphoneNo = (EditText) findViewById(R.id.editText);
txtMessage = (EditText) findViewById(R.id.editText2);
sendBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
sendSMSMessage();
}
});
}
protected void sendSMSMessage() {
Log.i("Send SMS", "");
String phoneNo = txtphoneNo.getText().toString();
String message = txtMessage.getText().toString();
try {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, message, null, null);
Toast.makeText(getApplicationContext(), "SMS sent.",
Toast.LENGTH_LONG).show();
}
catch (Exception e) {
Toast.makeText(getApplicationContext(), "SMS faild, please try
again.", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Following will be the content of res/layout/activity_main.xml file:
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sending SMS Example"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_below="@+id/textView1"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:hint="Enter Phone Number"
android:phoneNumber="true"
android:textColorHint="@color/abc_primary_text_material_dark"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:layout_below="@+id/editText"
android:layout_alignLeft="@+id/editText"
android:layout_alignStart="@+id/editText"
android:textColorHint="@color/abc_primary_text_material_dark"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton"
android:hint="Enter SMS" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Sms"
android:id="@+id/btnSendSMS"
android:layout_below="@+id/editText2"
android:layout_centerHorizontal="true"
android:layout_marginTop="48dp" />
</RelativeLayout>
Following will be the content of res/values/strings.xml to define two new constants −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">tutorialspoint</string>
<string name="action_settings">Settings</string>
</resources>
Following is the default content of AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<uses-permission android:name="android.permission.SEND_SMS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.tutorialspoint.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>
Let's try to run your tutorialspoint application. I assume you have connected your actual
Android Mobile device with your computer. To run the app from Android studio, open one of
your project's activity files and click Run icon from the toolbar. Before starting your
application, Android studio installer will display following window to select an option where you
want to run your Android application.
Now you can enter a desired mobile number and a text message to be sent on that number.
Finally click on Send SMS button to send your SMS. Make sure your GSM/CDMA connection
is working fine to deliver your SMS to its recipient.
You can take a number of SMS separated by comma and then inside your program you will have
to parse them into an array string and finally you can use a loop to send message to all the given
numbers. That's how you can write your own SMS client. Next section will show you how to use
existing SMS client to send SMS.
Using Built-in Intent to send SMS
You can use Android Intent to send SMS by calling built-in SMS functionality of the Android.
Following section explains different parts of our Intent object required to send an SMS.
Intent Object - Action to send SMS
You will use ACTION_VIEW action to launch an SMS client installed on your Android device.
Following is simple syntax to create an intent with ACTION_VIEW action
Intent smsIntent = new Intent(Intent.ACTION_VIEW);
Intent Object - Data/Type to send SMS
To send an SMS you need to specify smsto: as URI using setData() method and data type will be
to vnd.android-dir/mms-sms using setType() method as follows −
smsIntent.setData(Uri.parse("smsto:"));
smsIntent.setType("vnd.android-dir/mms-sms");
Intent Object - Extra to send SMS
Android has built-in support to add phone number and text message to send an SMS as follows −
smsIntent.putExtra("address" , new String("0123456789;3393993300"));
smsIntent.putExtra("sms_body" , "Test SMS to Angilla");
Here addressand sms_bodyare case sensitive andshouldbe specifiedinsmall charactersonly.Youcan
specifymore thanone numberinsingle stringbutseparatedbysemi-colon(;).
Example
Following example shows you in practical how to use Intent object to launch SMS client to send
an SMS to the given recipients.
To experimentwiththisexample,youwillneedactual Mobile device equippedwithlatestAndroidOS,
otherwise youwillhave tostruggle withemulatorwhichmaynotwork.
Step Description
1 You will use AndroidstudioIDEto create an Androidapplicationandname itas tutorialspoint
undera package com.example.tutorialspoint.Whilecreatingthisproject,make sure you Target
SDK andCompile With at the latestversionof AndroidSDKtouse higherlevelsof APIs.
2 Modify src/MainActivity.java file andaddrequiredcode totake care of sendingSMS.
3 ModifylayoutXML file res/layout/activity_main.xmladdanyGUI componentif required.I'm
addinga simple buttontolaunchSMS Client.
4 No needtodefine defaultconstants.Androidstudiotakescare of defaultconstants.
5 Modify AndroidManifest.xmlasshownbelow
6 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file
src/com.example.tutorialspoint/MainActivity.java.
package com.example.tutorialspoint;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startBtn = (Button) findViewById(R.id.button);
startBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
sendSMS();
}
});
}
protected void sendSMS() {
Log.i("Send SMS", "");
Intent smsIntent = new Intent(Intent.ACTION_VIEW);
smsIntent.setData(Uri.parse("smsto:"));
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.putExtra("address" , new String ("01234"));
smsIntent.putExtra("sms_body" , "Test ");
try {
startActivity(smsIntent);
finish();
Log.i("Finished sending SMS...", "");
}
catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MainActivity.this,
"SMS faild, please try again later.", Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Following will be the content of res/layout/activity_main.xml file −
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Drag and Drop Example"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials Point "
android:id="@+id/textView2"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:textSize="30dp"
android:textColor="#ff14be3c" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/abc"
android:layout_marginTop="48dp"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Compose SMS"
android:id="@+id/button"
android:layout_below="@+id/imageView"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2"
android:layout_marginTop="54dp"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView" />
</RelativeLayout>
Following will be the content of res/values/strings.xml to define two new constants −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">tutorialspoint</string>
<string name="action_settings">Settings</string>
</resources>
Following is the default content of AndroidManifest.xml −
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.tutorialspoint.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>
Let's try to run your tutorialspoint application. I assume you have connected your actual
Android Mobile device with your computer. To run the app from Android studio, open one of
your project's activity files and click Run icon from the toolbar. Before starting your
application, Android studio will display following window to select an option where you want to
run your Android application.
Select your mobile device as an option and then check your mobile device which will display
following screen:
Now use Compose SMS button to launch Android built-in SMS clients which is shown below:
You can modify either of the given default fields and finally use send SMS button to send your
SMS to the mentioned recipient.
Android - Phone Calls
Android provides Built-in applications for phone calls, in some occasions we may need to make
a phone call through our application. This could easily be done by using implicit Intent with
appropriate actions. Also, we can use PhoneStateListener and TelephonyManager classes, in
order to monitor the changes in some telephony states on the device.
This chapter lists down all the simple steps to create an application which can be used to make a
Phone Call. You can use Android Intent to make phone call by calling built-in Phone Call
functionality of the Android. Following section explains different parts of our Intent object
required to make a call.
Intent Object - Action to make Phone Call
You will use ACTION_CALL action to trigger built-in phone call functionality available in
Android device. Following is simple syntax to create an intent with ACTION_CALL action
Intent phoneIntent = new Intent(Intent.ACTION_CALL);
You can use ACTION_DIAL action instead of ACTION_CALL, in that case you will have
option to modify hardcoded phone number before making a call instead of making a direct call.
Intent Object - Data/Type to make Phone Call
To make a phone call at a given number 91-000-000-0000, you need to specify tel: as URI using
setData() method as follows −
phoneIntent.setData(Uri.parse("tel:91-000-000-0000"));
The interesting point is that, to make a phone call, you do not need to specify any extra data or
data type.
Example
Following example shows you in practical how to use Android Intent to make phone call to the
given mobile number.
To experimentwiththisexample,youwillneedactual Mobile deviceequippedwithlatestAndroidOS,
otherwise youwillhave to struggle withemulatorwhichmaynotwork.
Step Description
1 You will use AndroidstudioIDEto create an Androidapplicationandname itas My Application
undera package com.example.saira_000.myapplication.While creatingthisproject,make sure
youTarget SDK andCompile With at the latestversionof AndroidSDKtouse higherlevelsof APIs.
2 Modify src/MainActivity.java file andaddrequiredcode totake care of makinga call.
3 ModifylayoutXML file res/layout/activity_main.xmladdanyGUI componentif required.I'm
addinga simple buttontoCall 91-000-000-0000 number
4 No needtodefine defaultstringconstants.Androidstudiotakescare of defaultconstants.
5 Modify AndroidManifest.xmlasshownbelow
6 Run the application tolaunchAndroidemulatorandverifythe resultof the changesdone inthe
application.
Following is the content of the modified main activity file src/MainActivity.java.
package com.example.saira_000.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
public class MainActivity extends Activity {
Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
call();
}
private void call() {
Intent in=new Intent(Intent.ACTION_CALL,Uri.parse("0000000000"));
try{
startActivity(in);
}
catch (android.content.ActivityNotFoundException ex){
Toast.makeText(getApplicationContext(),"yourActivity is not
founded",Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Following will be the content of res/layout/activity_main.xml file −
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Drag and Drop Example"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials Point"
android:id="@+id/textView2"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:textSize="30dp"
android:textColor="#ff14be3c" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/abc"
android:layout_marginTop="48dp"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Call"
android:id="@+id/button"
android:layout_below="@+id/imageView"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2"
android:layout_marginTop="54dp"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView" />
</RelativeLayout>
Following will be the content of res/values/strings.xml to define two new constants −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
</resources>
Following is the default content of AndroidManifest.xml −
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.saira_000.myapplication"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.saira_000.myapplication.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>
Let's try to run your My Application application. I assume you have connected your actual
Android Mobile device with your computer. To run the app from Android studio, open one of
your project's activity files and click Run icon from the toolbar. Before starting your
application, Android studio installer will display following window to select an option where you
want to run your Android application.
Select your mobile device as an option and then check your mobile device which will display
following screen −
Now use Call button to make phone call as shown below:
Android
Publishing Android Application
Android application publishing is a process that makes your Android applications available to
users. Infect, publishing is the last phase of the Android application development process.
Android development life cycle
Once you developed and fully tested your Android Application, you can start selling or
distributing free using Google Play (A famous Android marketplace). You can also release your
applications by sending them directly to users or by letting users download them from your own
website.
You can check a detailed publishing process at Android official website, but this tutorial will
take you through simple steps to launch your application on Google Play. Here is a simplified
check list which will help you in launching your Android application −
Step Activity
1 RegressionTestingBefore youpublishyourapplication,youneedtomake sure thatitsmeeting
the basic qualityexpectationsforall Androidapps,onall of the devicesthatyouare targeting.So
performall the requiredtestingondifferentdevicesincludingphone andtablets.
2 ApplicationRating Whenyou will publishyourapplicationatGoogle Play,youwill have tospecify
a contentrating foryour app,whichinformsGoogle Playusersof itsmaturitylevel.Currently
available ratingsare (a) Everyone (b) Low maturity(c) Mediummaturity(d) Highmaturity.
3 Targeted RegionsGoogle Playletsyoucontrol whatcountriesandterritorieswhereyour
applicationwillbe sold.Accordinglyyoumusttake care of settinguptime zone,localizationor
any otherspecificrequirementasper the targetedregion.
4 ApplicationSize Currently,the maximumsizeforanAPKpublishedonGoogle Playis50 MB. If
your appexceedsthatsize,orif youwant to offera secondarydownload,youcanuse APK
ExpansionFiles,whichGoogle Playwill hostforfree onitsserverinfrastructure andautomatically
handle the downloadtodevices.
5 SDK and ScreenCompatibility Itis importanttomake sure that yourapp isdesignedtorun
properlyonthe Androidplatformversionsanddevice screensizesthatyouwanttotarget.
6 ApplicationPricing Decidingwhetheryouappwill be free orpaidisimportantbecause,on
Google Play,free app'smustremainfree.If youwantto sell yourapplicationthenyouwillhave
to specifyitsprice indifferentcurrencies.
7 Promotional Content It isa good marketingpractice tosupplyavarietyof high-qualitygraphic
assetsto showcase yourappor brand. Afteryoupublish,theseappearonyourproductdetails
page,instore listingsandsearchresults,andelsewhere.
8 Buildand Uploadrelease-readyAPKThe release-readyAPKiswhatyouyouwill uploadtothe
DeveloperConsole anddistributetousers.Youcan check complete detailonhow tocreate a
release-readyversionof yourapp: PreparingforRelease.
9 Finalize ApplicationDetail Google Playgivesyouavarietyof waysto promote yourapp and
engage withusersonyourproduct detailspage,fromcolourful graphics,screenshots,andvideos
to localizeddescriptions,releasedetails,andlinkstoyourotherapps.Soyou can decorate your
applicationpage andprovide asmuchas clear crispdetail youcan provide.
Export Android Application Process
Apk development process
Before exporting the apps, you must some of tools
 Dx tools(Dalvikexecutable tools):Itgoingtoconvert .class file to .dexfile.ithas useful for
memoryoptimizationandreduce the boot-upspeedtime
 AAPT(Androidassistance packagingtool):ithasuseful toconvert.Dexfile to.Apk
 APK(Androidpackagingkit):The final stage of deploymentprocessiscalledas.apk.
You will need to export your application as an APK (Android Package) file before you upload it
Google Play marketplace.
To export an application, just open that application project in Android studio and select Build →
Generate Signed APK from your Android studio and follow the simple steps to export your
application −
Next select, Generate Signed APK option as shown in the above screen shot and then click it so
that you get following screen where you will choose Create new keystore to store your
application.
Enter your key store path,key store password,key alias and key password to protect your
application and click on Next button once again. It will display following screen to let you create
an application:
Once you filled up all the information,like app destination,build type and flavours click finish
button While creating an application it will show as below
Finally, it will generate your Android Application as APK formate File which will be uploaded
at Google Play marketplace.
Google Play Registration
The most important step is to register with Google Play using Google Play Marketplace. You can
use your existing google ID if you have any otherwise you can create a new Google ID and then
register with the marketplace. You will have following screen to accept terms and condition.
You can use Continue to payment button to proceed to make a payment of $25 as a registration
fee and finally to complete your account detail.
Once you are a registered user at Google Play, you can upload release-ready APK for your
application and finally you will complete application detail using application detail page as
mentioned in step 9 of the above mentioned checklist.
Signing Your App Manually
You do not need Android Studio to sign your app. You can sign your app from the command line
using standard tools from the Android SDK and the JDK. To sign an app in release mode from
the command line −
 Generate a private keyusingkeytool
$ keytool -genkey -v -keystore my-release-key.keystore
-alias alias_name -keyalg RSA -keysize 2048 -validity 10000
 Compile yourappinrelease mode to obtainanunsignedAPK
 Signyour appwithyour private keyusing jarsigner−
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1
-keystore my-release-key.keystore my_application.apk alias_name
 VerifythatyourAPKissigned.Forexample −
$ jarsigner -verify -verbose -certs my_application.apk
 Alignthe final APKpackage using zipalign.
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
Some of App markets

Google play

phoload

APTOiDE

Amazon AppStore

1mobile

Insyde Market

Yandex store

F-Droid

Samsung Galaxy AppStore
Android - Alert Dialog Tutorial
A Dialog is small window that prompts the user to a decision or enter additional information.
Some times in your application, if you wanted to ask the user about taking a decision between
yes or no in response of any particular action taken by the user, by remaining in the same activity
and without changing the screen, you can use Alert Dialog.
In order to make an alert dialog, you need to make an object of AlertDialogBuilder which an
inner class of AlertDialog. Its syntax is given below
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
Now you have to set the positive (yes) or negative (no) button using the object of the
AlertDialogBuilder class. Its syntax is
alertDialogBuilder.setPositiveButton(CharSequence text,
DialogInterface.OnClickListener listener)
alertDialogBuilder.setNegativeButton(CharSequence text,
DialogInterface.OnClickListener listener)
Apart from this , you can use other functions provided by the builder class to customize the alert
dialog. These are listed below
Sr.No Method type & description
1 setIcon(Drawable icon)
This method set the icon of the alert dialog box.
2 setCancelable(booleancancel able)
This method sets the property that the dialog can be cancelled or not
3 setMessage(CharSequence message)
This method sets the message to be displayed in the alert dialog
4 setMultiChoiceItems(CharSequence[]items,boolean[]checkedItems,
DialogInterface.OnMultiChoiceClickListenerlistener)
This method sets list of items to be displayed in the dialog as the content. The selected
option will be notified by the listener
5 setOnCancelListener(DialogInterface.OnCancelListeneronCancelListener)
This method Sets the callback that will be called if the dialog is cancelled.
6 setTitle(CharSequence title)
This method set the title to be appear in the dialog
After creating and setting the dialog builder , you will create an alert dialog by calling the
create() method of the builder class. Its syntax is
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
This will create the alert dialog and will show it on the screen.
Dialog fragment
Before enter into an example we should need to know dialog fragment.Dialog fragment is a
fragment which can show fragment in dialog box
public class DialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setPositiveButton(R.string.fire, new
DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
toast.makeText(this,"enter a text
here",Toast.LENTH_SHORT).show();
}
})
.setNegativeButton(R.string.cancel, new
DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
});
// Create the AlertDialog object and return it
return builder.create();
}
}
}
List dialog
It has used to show list of items in a dialog box.For suppose, user need to select a list of items or
else need to click a item from multiple list of items.At this situation we can use list dialog.
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(Pick a Color)
.setItems(R.array.colors_array, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// The 'which' argument contains the index position
// of the selected item
}
});
return builder.create();
}
Single-choice list dialog
It has used to add single choice list to Dialog box.We can check or uncheck as per user choice.
public Dialog onCreateDialog(Bundle savedInstanceState) {
mSelectedItems = new ArrayList();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("This is list choice dialog box");
.setMultiChoiceItems(R.array.toppings, null,new
DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean
isChecked) {
if (isChecked) {
// If the user checked the item, add it to the selected items
mSelectedItems.add(which);
}
else if (mSelectedItems.contains(which)) {
// Else, if the item is already in the array, remove it
mSelectedItems.remove(Integer.valueOf(which));
}
}
})
// Set the action buttons
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// User clicked OK, so save the mSelectedItems results somewhere
// or return them to the component that opened the dialog
...
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int id) {
...
}
});
return builder.create();
}
Example
The following example demonstrates the use of AlertDialog in android.
To experiment with this example , you need to run this on an emulator or an actual device.
Steps Description
1 You will use Androidstudiotocreate an Androidapplicationandname itas My Application
undera package package com.example.sairamkrishna.myapplication;Whilecreatingthis
project,make sure youTarget SDK andCompile Withat the latestversionof AndroidSDKtouse
higherlevelsof APIs.
2 Modifysrc/MainActivity.javafile toaddalertdialogcode tolaunchthe dialog.
3 ModifylayoutXML file res/layout/activity_main.xml addanyGUI componentif required.
4 No needto change defaultstringconstants.Androidstudiotakescare of defaultstringsat
values/string.xml
9 Run the applicationandchoose arunningandroiddevice andinstall the applicationonitand
verifythe results.
Here is the modified code of src/MainActivity.java
package com.example.sairamkrishna.myapplication;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void open(View view){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage("Are you sure,You wanted to make
decision");
alertDialogBuilder.setPositiveButton("yes", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(MainActivity.this,"You clicked yes
button",Toast.LENGTH_LONG).show();
}
});
alertDialogBuilder.setNegativeButton("No",new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Here is the modified code of res/layout/activity_main.xml
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Alert Dialog"
android:id="@+id/textView"
android:textSize="35dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorialspoint"
android:id="@+id/textView2"
android:textColor="#ff3eff0f"
android:textSize="35dp"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/logo"
android:layout_below="@+id/textView2"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2"
android:layout_alignLeft="@+id/textView"
android:layout_alignStart="@+id/textView" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Alert dialog"
android:id="@+id/button"
android:layout_below="@+id/imageView"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2"
android:layout_marginTop="42dp"
android:onClick="open"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView" />
</RelativeLayout>
Here is ofStrings.xml
<resources>
<string name="app_name">My Application</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
</resources>
Here is the default code of AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.alertdialog"
android:versionCode="1"
android:versionName="1.0" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.sairamkrishna.myapplication.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>
Let's try to run your application. I assume you have connected your actual Android Mobile
device with your computer. To run the app from Android studio, open one of your project's
activity files and click Run icon from the toolbar. Before starting your application, ]Android
studio will display following window to select an option where you want to run your Android
application.
Select your an option and then click on it. For suppose, if you have clicked on yes button, then
result would as follows
if you click on no button it will call finish() and it will close your application.

More Related Content

PDF
Ar smartphones
PDF
Glogster edu-users-guide
PDF
Black berry java_sdk-development_guide--1239696-0730090812-001-6.0-us
PDF
Services Article Uc Apps Research Wp
PDF
A Survey of IT Usage Patterns in Banks in Jordan 2011 - TABLE OF CONTENTS
PDF
Forensic Examinations of Mobile Phones (iPhone Forensics)
PDF
Institute biz&financ plan Q410
DOCX
Java completed assignment
Ar smartphones
Glogster edu-users-guide
Black berry java_sdk-development_guide--1239696-0730090812-001-6.0-us
Services Article Uc Apps Research Wp
A Survey of IT Usage Patterns in Banks in Jordan 2011 - TABLE OF CONTENTS
Forensic Examinations of Mobile Phones (iPhone Forensics)
Institute biz&financ plan Q410
Java completed assignment

What's hot (20)

DOCX
Is it feasible to apply biometric authentication to online gaming
DOC
White Paper: Look Before You Leap Into Google Apps
PDF
Mobile Marketing Association Best Practices
PDF
Internship report
PDF
Speech recognition project report
PDF
Pearl research_india2012
PDF
Graduation Project Thesis. Youth Empowerment Center. Haneen Fraihat
DOCX
Bhuma learning portal_ui
PDF
E100 manual
PDF
Why You Aren't Eligible for Social Security, Form #06.001
PDF
Event Based Network Monitoring System with FloodLight SDN Controller and Open...
PDF
Product project final (repaired)
PDF
White paper en
PDF
Иструкция Parrot Ar.Drone
PDF
Fortigate utm-40-mr1
PDF
Double entry document, Analysis and Design
PDF
Hacking.pdf
PDF
eLearning Development
PDF
U M Lvs I D E F
Is it feasible to apply biometric authentication to online gaming
White Paper: Look Before You Leap Into Google Apps
Mobile Marketing Association Best Practices
Internship report
Speech recognition project report
Pearl research_india2012
Graduation Project Thesis. Youth Empowerment Center. Haneen Fraihat
Bhuma learning portal_ui
E100 manual
Why You Aren't Eligible for Social Security, Form #06.001
Event Based Network Monitoring System with FloodLight SDN Controller and Open...
Product project final (repaired)
White paper en
Иструкция Parrot Ar.Drone
Fortigate utm-40-mr1
Double entry document, Analysis and Design
Hacking.pdf
eLearning Development
U M Lvs I D E F
Ad

Similar to Android (20)

PPTX
Get an Android tutorial for beginners
PDF
Android tutorial points
PDF
Android tutorial
PDF
Android tutorial lengkap
PDF
Android tutorial
PDF
Android tutorial
PDF
Android tutorials@SH Mengal
PDF
Android tutorial
PDF
Android tutorial
PDF
Android tutorial
PPTX
Android development-tutorial
PPT
Introduction to android
PPT
Introduction to android
PPT
Introduction to android
DOCX
Android tutorial
PDF
Android Introduction by Kajal
PPTX
Android Training in chandigarh 123456789
PDF
What is-android? PDF Document
PDF
Android tutorial
PDF
Android Application Development Presentation
Get an Android tutorial for beginners
Android tutorial points
Android tutorial
Android tutorial lengkap
Android tutorial
Android tutorial
Android tutorials@SH Mengal
Android tutorial
Android tutorial
Android tutorial
Android development-tutorial
Introduction to android
Introduction to android
Introduction to android
Android tutorial
Android Introduction by Kajal
Android Training in chandigarh 123456789
What is-android? PDF Document
Android tutorial
Android Application Development Presentation
Ad

More from Mohit Saini (15)

PPTX
Introduction of Basic Excel.pptx
DOCX
Steps to join though google classroom
PPTX
PPTX
Generation of computer
PPTX
Hardware software
PPTX
Type of coputer
PPTX
Generation of computer
DOCX
Excel work
DOCX
Number system
DOCX
Big data lecture notes
DOCX
DOC
rdbms-notes
DOCX
Computer fundamental
DOCX
Assignments 150507052746-lva1-app6891
DOCX
C programming tutorial
Introduction of Basic Excel.pptx
Steps to join though google classroom
Generation of computer
Hardware software
Type of coputer
Generation of computer
Excel work
Number system
Big data lecture notes
rdbms-notes
Computer fundamental
Assignments 150507052746-lva1-app6891
C programming tutorial

Recently uploaded (20)

PDF
BBC NW_Tech Facilities_30 Odd Yrs Ago [J].pdf
PPTX
Retail.pptx internet of things mtech 2 nd sem
PDF
Computer Networks and Internet Protocol Week-1
PDF
Water Industry Process Automation & Control Monthly - September 2025
PPTX
MODULE 3 SUSTAINABLE DEVELOPMENT GOALSPPT.pptx
PPTX
Downstream processing_in Module1_25.pptx
PDF
The Journal of Finance - July 1993 - JENSEN - The Modern Industrial Revolutio...
PDF
ForSee by Languify Teardown final product management
PDF
ITEC 1010 - Networks and Cloud Computing
PDF
LAST 3 MONTH VOCABULARY MAGAZINE 2025 . (1).pdf
PDF
1.-fincantieri-investor-presentation2.pdf
PPTX
Electric vehicle very important for detailed information.pptx
PPTX
5-2d2b20afbe-basic-concepts-of-mechanics.ppt
PDF
Disaster Management_Lecture_ PPT_Dr. Kunjari Mog, NITH.pdf
PPTX
Soumya Das post quantum crypot algorithm
PDF
Project_Mgmt_Institute_- Marc Marc Marc.pdf
PPTX
1. Effective HSEW Induction Training - EMCO 2024, O&M.pptx
PPTX
240409 Data Center Training Programs by Uptime Institute (Drafting).pptx
PPT
linux chapter 1 learning operating system
PPTX
Cloud Security and Privacy-Module-2a.pptx
BBC NW_Tech Facilities_30 Odd Yrs Ago [J].pdf
Retail.pptx internet of things mtech 2 nd sem
Computer Networks and Internet Protocol Week-1
Water Industry Process Automation & Control Monthly - September 2025
MODULE 3 SUSTAINABLE DEVELOPMENT GOALSPPT.pptx
Downstream processing_in Module1_25.pptx
The Journal of Finance - July 1993 - JENSEN - The Modern Industrial Revolutio...
ForSee by Languify Teardown final product management
ITEC 1010 - Networks and Cloud Computing
LAST 3 MONTH VOCABULARY MAGAZINE 2025 . (1).pdf
1.-fincantieri-investor-presentation2.pdf
Electric vehicle very important for detailed information.pptx
5-2d2b20afbe-basic-concepts-of-mechanics.ppt
Disaster Management_Lecture_ PPT_Dr. Kunjari Mog, NITH.pdf
Soumya Das post quantum crypot algorithm
Project_Mgmt_Institute_- Marc Marc Marc.pdf
1. Effective HSEW Induction Training - EMCO 2024, O&M.pptx
240409 Data Center Training Programs by Uptime Institute (Drafting).pptx
linux chapter 1 learning operating system
Cloud Security and Privacy-Module-2a.pptx

Android

  • 1. Contents Android Tutorial ..............................................................................................................................7 Audience...........................................................................................................................................7 Prerequisites.....................................................................................................................................7 What is Android?............................................................................................................................8 Why Android ?................................................................................................................................9 Features of Android........................................................................................................................9 Android Applications.....................................................................................................................10 Categories of Android applications.................................................................................................10 History of Android.........................................................................................................................11 What is API level?.........................................................................................................................11 Android - Environment Setup............................................................................................................12 Set-up Java Development Kit (JDK).................................................................................................13 Android IDEs.................................................................................................................................13 Android - Architecture ......................................................................................................................13 Linux kernel..................................................................................................................................14 Libraries.......................................................................................................................................14 Android Libraries ..........................................................................................................................14 Android Runtime ..........................................................................................................................15 Application Framework.................................................................................................................15 Applications..................................................................................................................................16 Android - Application Components....................................................................................................16 Activities......................................................................................................................................16 Services........................................................................................................................................16 Broadcast Receivers......................................................................................................................17 Content Providers.........................................................................................................................17 Additional Components.................................................................................................................17 Android - Hello World Example..........................................................................................................18 Create AndroidApplication ...........................................................................................................18 Anatomy of Android Application....................................................................................................20
  • 2. The Main Activity File....................................................................................................................22 The Manifest File..........................................................................................................................23 The Strings File .............................................................................................................................24 The R File .....................................................................................................................................24 The Layout File .............................................................................................................................25 Running the Application................................................................................................................26 Create AndroidApplication on Android studio................................................................................27 Android Resources Organizing & Accessing ........................................................................................27 Organize Resources in eclipse........................................................................................................28 Organize resource in Android Studio..............................................................................................28 Alternative Resources ...................................................................................................................29 Accessing Resources .....................................................................................................................30 Accessing Resourcesin Code......................................................................................................30 Example....................................................................................................................................30 Example....................................................................................................................................31 Example....................................................................................................................................31 Accessing Resourcesin XML.......................................................................................................32 Android - Activities...........................................................................................................................32 Example.......................................................................................................................................34 Android - Services.............................................................................................................................37 Example.......................................................................................................................................40 Android - Broadcast Receivers...........................................................................................................44 Creating the Broadcast Receiver....................................................................................................45 Registering Broadcast Receiver......................................................................................................45 Broadcasting Custom Intents.........................................................................................................46 Example.......................................................................................................................................47 Android - Content Providers..............................................................................................................53 Content URIs ................................................................................................................................54 Create Content Provider................................................................................................................55 Example.......................................................................................................................................56 Android - Fragments.........................................................................................................................66 Fragment Life Cycle.......................................................................................................................68
  • 3. How to use Fragments?.................................................................................................................69 Types of Fragments.......................................................................................................................69 Android - Intents and Filters..............................................................................................................69 Intent Objects...............................................................................................................................71 Action.......................................................................................................................................71 Data .........................................................................................................................................71 Category...................................................................................................................................72 Extras.......................................................................................................................................73 Flags.........................................................................................................................................73 Component Name.....................................................................................................................73 Types of Intents............................................................................................................................74 Explicit Intents..........................................................................................................................74 Implicit Intents..........................................................................................................................75 Example.......................................................................................................................................76 Intent Filters.................................................................................................................................81 Example.......................................................................................................................................82 Android - UI Layouts .........................................................................................................................91 Android Layout Types....................................................................................................................92 Layout Attributes..........................................................................................................................93 View Identification........................................................................................................................94 Android - UI Controls........................................................................................................................94 Android UI Controls ......................................................................................................................95 Create UI Controls.........................................................................................................................96 Android - Event Handling..................................................................................................................97 Event Listeners & Event Handlers...................................................................................................97 Event Listeners Registration ..........................................................................................................98 Touch Mode.................................................................................................................................99 Focus...........................................................................................................................................99 onTouchEvent()............................................................................................................................99 Event Handling Examples ............................................................................................................ 100 Event Listeners Registration Using an Anonymous Inner Class.................................................... 100 Exercise......................................................................................................................................103
  • 4. Android - Styles and Themes........................................................................................................... 104 Defining Styles............................................................................................................................ 104 Using Styles................................................................................................................................ 104 Style Inheritance......................................................................................................................... 105 Applying Colors to Theme Attributes............................................................................................ 106 Using a Custom Nine-Patch With Buttons..................................................................................... 107 Steps to create Nine-Patch Buttons.......................................................................................... 108 Android Themes ......................................................................................................................... 109 Styling the colour palette ............................................................................................................ 110 Default Styles & Themes.............................................................................................................. 111 Android - Custom Components........................................................................................................ 111 Creating a Simple Custom Component......................................................................................... 112 Instantiate using code inside activity class ................................................................................ 116 Instantiate using Layout XML file.............................................................................................. 117 Custom Component with Custom Attributes ................................................................................ 117 Step 1.....................................................................................................................................118 Step 2.....................................................................................................................................118 Step 3.....................................................................................................................................118 Android - Drag and Drop................................................................................................................. 119 The Drag/Drop Process ............................................................................................................... 119 The DragEvent Class.................................................................................................................... 120 Constants................................................................................................................................ 120 Methods.................................................................................................................................121 Listening for Drag Event .............................................................................................................. 121 Starting a Drag Event................................................................................................................... 122 Example.....................................................................................................................................122 Android - Notifications.................................................................................................................... 128 Create and Send Notifications......................................................................................................129 Step 1 - Create Notification Builder .......................................................................................... 130 Step 2 - Setting Notification Properties..................................................................................... 130 Step 3 - Attach Actions............................................................................................................. 130 Step 4 - Issue the notification...................................................................................................131
  • 5. The NotificationCompat.Builder Class .......................................................................................... 131 Example.....................................................................................................................................132 Big View Notification................................................................................................................... 138 Android - Location Based Services ...................................................................................................139 The Location Object.................................................................................................................... 140 Get the Current Location............................................................................................................. 141 Get the Updated Location ........................................................................................................... 142 Location Quality of Service.......................................................................................................... 142 Displaying a Location Address......................................................................................................143 Example.....................................................................................................................................143 Install the Google Play Services SDK.......................................................................................... 143 Create AndroidApplication......................................................................................................144 Android - Sending Email.................................................................................................................. 153 Intent Object - Action to send Email............................................................................................. 154 Intent Object - Data/Type to send Email....................................................................................... 154 Intent Object - Extra to send Email............................................................................................... 154 Example.....................................................................................................................................155 Android - Sending SMS.................................................................................................................... 160 Example.....................................................................................................................................161 Using Built-in Intent to send SMS.................................................................................................166 Intent Object - Action to send SMS .............................................................................................. 166 Intent Object - Data/Type to send SMS ........................................................................................ 167 Intent Object - Extra to send SMS ................................................................................................ 167 Example.....................................................................................................................................167 Android - Phone Calls...................................................................................................................... 174 Intent Object - Action to make Phone Call.................................................................................... 174 Intent Object - Data/Type to make Phone Call.............................................................................. 174 Example.....................................................................................................................................174 Publishing Android Application........................................................................................................ 181 Export Android Application Process ............................................................................................. 182 Google Play Registration ............................................................................................................. 184 Signing Your App Manually.......................................................................................................... 185
  • 6. Some of App markets.................................................................................................................. 186 Android - Alert Dialog Tutorial......................................................................................................... 188 Dialog fragment.......................................................................................................................... 189 List dialog...................................................................................................................................190 Single-choice list dialog............................................................................................................... 190 Example.....................................................................................................................................191
  • 7. Android Tutorial Android is an open source and Linux-based operating system for mobile devices such as smartphones and tablet computers. Android was developed by the Open Handset Alliance, led by Google, and other companies. This tutorial will teach you basic Android programming and will also take you through some advance concepts related to Android application development. Audience This tutorial has been prepared for the beginners to help them understand basic Android programming. After completing this tutorial you will find yourself at a moderate level of expertise in Android programming from where you can take yourself to next levels. Prerequisites Android programming is based on Java programming language so if you have basic understanding on Java programming then it will be a fun to learn Android application development.
  • 8. What is Android? Android is an open source and Linux-based Operating System for mobile devices such as smartphones and tablet computers. Android was developed by the Open Handset Alliance, led by Google, and other companies. Android offers a unified approach to application development for mobile devices which means developers need only develop for Android, and their applications should be able to run on different devices powered by Android. The first beta version of the Android Software Development Kit (SDK) was released by Google in 2007 where as the first commercial version, Android 1.0, was released in September 2008. On June 27, 2012, at the Google I/O conference, Google announced the next Android version, 4.1 Jelly Bean. Jelly Bean is an incremental update, with the primary aim of improving the user interface, both in terms of functionality and performance. The source code for Android is available under free and open source software licenses. Google publishes most of the code under the Apache License version 2.0 and the rest, Linux kernel changes, under the GNU General Public License version 2.
  • 9. Why Android ? Features of Android Android is a powerful operating system competing with Apple 4GS and supports great features. Few of them are listed below: Feature Description Beautiful UI AndroidOS basicscreenprovidesabeautiful andintuitiveuserinterface. Connectivity GSM/EDGE, IDEN,CDMA, EV-DO,UMTS, Bluetooth,Wi-Fi,LTE,NFCandWiMAX. Storage SQLite,a lightweightrelationaldatabase,isusedfordatastorage purposes. Mediasupport H.263, H.264, MPEG-4 SP,AMR, AMR-WB, AAC,HE-AAC,AAC5.1, MP3, MIDI, Ogg Vorbis,WAV,JPEG,PNG,GIF,and BMP Messaging SMS and MMS Webbrowser Basedon the open-source WebKitlayoutengine,coupledwithChrome'sV8 JavaScriptengine supportingHTML5 and CSS3. Multi-touch Androidhasnative supportformulti-touchwhichwasinitiallymade available in handsetssuchas the HTC Hero. Multi-tasking User can jumpfromone taskto anotherand same time variousapplicationcanrun simultaneously. Resizable widgets Widgetsare resizable,souserscanexpandthemtoshow more contentor shrink themto save space Multi-Language Supportssingle directionandbi-directional text. GCM Google CloudMessaging(GCM) isa service thatletsdeveloperssendshort
  • 10. message datato theirusersonAndroiddevices,withoutneedingaproprietary sync solution. Wi-Fi Direct A technologythatletsappsdiscoverandpairdirectly,overahigh-bandwidthpeer- to-peerconnection. AndroidBeam A popularNFC-basedtechnologythat letsusersinstantlyshare,justbytouching twoNFC-enabledphonestogether. Android Applications Android applications are usually developed in the Java language using the Android Software Development Kit. Once developed, Android applications can be packaged easily and sold out either through a store such as Google Play,SlideME,Opera Mobile Store,Mobango,F-droid and the Amazon Appstore. Android powers hundreds of millions of mobile devices in more than 190 countries around the world. It's the largest installed base of any mobile platform and growing fast. Every day more than 1 million new Android devices are activated worldwide. This tutorial has been written with an aim to teach you how to develop and package Android application. We will start from environment setup for Android application programming and then drill down to look into various aspects of Android applications. Categories of Android applications There are many android applications in the market. The top categories are:
  • 11. History of Android The code names of android ranges from A to L currently, such as Aestro, Blender, Cupcake, Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream Sandwitch, Jelly Bean, KitKat and Lollipop. Let's understand the android history in a sequence. What is API level? API Level is an integer value that uniquely identifies the framework API revision offered by a version of the Android platform. Platform Version API Level VERSION_CODE Android5.1 22 LOLLIPOP_MR1 Android5.0 21 LOLLIPOP Android4.4W 20 KITKAT_WATCH KitKatforWearablesOnly Android4.4 19 KITKAT Android4.3 18 JELLY_BEAN_MR2 Android4.2, 4.2.2 17 JELLY_BEAN_MR1 Android4.1, 4.1.1 16 JELLY_BEAN Android4.0.3, 4.0.4 15 ICE_CREAM_SANDWICH_MR1 Android4.0, 4.0.1, 4.0.2 14 ICE_CREAM_SANDWICH Android3.2 13 HONEYCOMB_MR2 Android3.1.x 12 HONEYCOMB_MR1
  • 12. Android3.0.x 11 HONEYCOMB Android 2.3.4 Android 2.3.3 10 GINGERBREAD_MR1 Android 2.3.2 Android 2.3.1 Android 2.3 9 GINGERBREAD Android2.2.x 8 FROYO Android2.1.x 7 ECLAIR_MR1 Android2.0.1 6 ECLAIR_0_1 Android2.0 5 ECLAIR Android1.6 4 DONUT Android1.5 3 CUPCAKE Android1.1 2 BASE_1_1 Android1.0 1 BASE Android - Environment Setup You will be glad to know that you can start your Android application development on either of the following operating systems −  Microsoft Windows XP or later version.  Mac OS X 10.5.8 or later version with Intel chip.  Linux including GNU C Library 2.7 or later. Second point is that all the required tools to develop Android applications are freely available and can be downloaded from the Web. Following is the list of software's you will need before you start your Android application programming.  Java JDK5 or later version
  • 13.  Android SDK  Java Runtime Environment (JRE) 6  Android Studio  Eclipse IDE for Java Developers (optional)  Android Development Tools (ADT) Eclipse Plug-in (optional) Here last two components are optional and if you are working on Windows machine then these components make your life easy while doing Java based application development. So let us have a look how to proceed to set required environment. Set-up Java Development Kit (JDK) You can download the latest version of Java JDK from Oracle's Java site: Java SE Downloads. You will find instructions for installing JDK in downloaded files, follow the given instructions to install and configure the setup. Finally set PATH and JAVA_HOME environment variables to refer to the directory that contains java and javac, typically java_install_dir/bin and java_install_dir respectively. If you are running Windows and installed the JDK in C:jdk1.6.0_15, you would have to put the following line in your C:autoexec.bat file. set PATH=C:jdk1.7.0_75bin;%PATH% set JAVA_HOME=C:jdk1.7.0_75 Alternatively, you could also right-click on My Computer, select Properties, then Advanced, then Environment Variables. Then, you would update the PATH value and press the OK button. On Linux, if the SDK is installed in /usr/local/jdk1.6.0_15 and you use the C shell, you would put the following code into your .cshrc file. setenv PATH /usr/local/jdk1.7.0_75/bin:$PATH setenv JAVA_HOME /usr/local/jdk1.7.0_75 Alternatively, if you use an Integrated Development Environment (IDE) Eclipse, then it will know automatically where you have installed your Java. Android IDEs There are so many sophisticated Technologies are available to develop android applications, the familiar technologies, which are predominantly using tools as follows  Android Studio  Eclipse IDE Android - Architecture
  • 14. Android operating system is a stack of software components which is roughly divided into five sections and four main layers as shown below in the architecture diagram. Linux kernel At the bottom of the layers is Linux - Linux 3.6 with approximately 115 patches. This provides a level of abstraction between the device hardware and it contains all the essential hardware drivers like camera, keypad, display etc. Also, the kernel handles all the things that Linux is really good at such as networking and a vast array of device drivers, which take the pain out of interfacing to peripheral hardware. Libraries On top of Linux kernel there is a set of libraries including open-source Web browser engine WebKit, well known library libc, SQLite database which is a useful repository for storage and sharing of application data, libraries to play and record audio and video, SSL libraries responsible for Internet security etc. Android Libraries This category encompasses those Java-based libraries that are specific to Android development. Examples of libraries in this category include the application framework libraries in addition to
  • 15. those that facilitate user interface building, graphics drawing and database access. A summary of some key core Android libraries available to the Android developer is as follows −  android.app − Provides access to the application model and is the cornerstone of all Android applications.  android.content − Facilitates content access, publishing and messaging between applications and application components.  android.database − Used to access data published by content providers and includes SQLite database management classes.  android.opengl − A Java interface to the OpenGL ES 3D graphics rendering API.  android.os − Provides applications with access to standard operating system services including messages, system services and inter-process communication.  android.text − Used to render and manipulate text on a device display.  android.view − The fundamental building blocks of application user interfaces.  android.widget − A rich collection of pre-built user interface components such as buttons, labels, list views, layout managers, radio buttons etc.  android.webkit − A set of classes intended to allow web-browsing capabilities to be built into applications. Having covered the Java-based core libraries in the Android runtime, it is now time to turn our attention to the C/C++ based libraries contained in this layer of the Android software stack. Android Runtime This is the third section of the architecture and available on the second layer from the bottom. This section provides a key component called Dalvik Virtual Machine which is a kind of Java Virtual Machine specially designed and optimized for Android. The Dalvik VM makes use of Linux core features like memory management and multi-threading, which is intrinsic in the Java language. The Dalvik VM enables every Android application to run in its own process, with its own instance of the Dalvik virtual machine. The Android runtime also provides a set of core libraries which enable Android application developers to write Android applications using standard Java programming language. Application Framework The Application Framework layer provides many higher-level services to applications in the form of Java classes. Application developers are allowed to make use of these services in their applications. The Android framework includes the following key services −  Activity Manager − Controls all aspects of the application lifecycle and activity stack.  Content Providers − Allows applications to publish and share data with other applications.
  • 16.  Resource Manager − Provides access to non-code embedded resources such as strings, color settings and user interface layouts.  Notifications Manager − Allows applications to display alerts and notifications to the user.  View System − An extensible set of views used to create application user interfaces. Applications You will find all the Android application at the top layer. You will write your application to be installed on this layer only. Examples of such applications are Contacts Books, Browser, Games etc. Android - Application Components Application components are the essential building blocks of an Android application. These components are loosely coupled by the application manifest file AndroidManifest.xml that describes each component of the application and how they interact. There are following four main components that can be used within an Android application: Components Description Activities Theydictate the UI andhandle the userinteractiontothe smart phone screen Services They handle backgroundprocessingassociatedwithanapplication. Broadcast Receivers Theyhandle communicationbetweenAndroidOSandapplications. ContentProviders Theyhandle dataand database managementissues. Activities An activity represents a single screen with a user interface,in-short Activity performs actions on the screen. For example, an email application might have one activity that shows a list of new emails, another activity to compose an email, and another activity for reading emails. If an application has more than one activity, then one of them should be marked as the activity that is presented when the application is launched. An activity is implemented as a subclass of Activity class as follows − public class MainActivity extends Activity { } Services A service is a component that runs in the background to perform long-running operations. For example, a service might play music in the background while the user is in a different
  • 17. application, or it might fetch data over the network without blocking user interaction with an activity. A service is implemented as a subclass of Service class as follows − public class MyService extends Service { } Broadcast Receivers Broadcast Receivers simply respond to broadcast messages from other applications or from the system. For example, applications can also initiate broadcasts to let other applications know that some data has been downloaded to the device and is available for them to use, so this is broadcast receiver who will intercept this communication and will initiate appropriate action. A broadcast receiver is implemented as a subclass of BroadcastReceiver class and each message is broadcaster as an Intent object. public class MyReceiver extends BroadcastReceiver { public void onReceive(context,intent){} } Content Providers A content provider component supplies data from one application to others on request. Such requests are handled by the methods of the ContentResolver class. The data may be stored in the file system, the database or somewhere else entirely. A content provider is implemented as a subclass of ContentProvider class and must implement a standard set of APIs that enable other applications to perform transactions. public class MyContentProvider extends ContentProvider { public void onCreate(){} } We will go through these tags in detail while covering application components in individual chapters. Additional Components There are additional components which will be used in the construction of above mentioned entities, their logic, and wiring between them. These components are −
  • 18. Components Description Fragments Representsaportionof userinterface inanActivity. Views UI elementsthatare drawnon-screenincludingbuttons,listsformsetc. Layouts View hierarchiesthatcontrol screenformatandappearance of the views. Intents Messageswiringcomponentstogether. Resources External elements,suchasstrings,constantsanddrawable pictures. Manifest Configurationfile forthe application. Android - Hello World Example Let us start actual programming with Android Framework. Before you start writing your first example using Android SDK, you have to make sure that you have set-up your Android development environment properly as explained in Android - Environment Set-up tutorial. I also assume that you have a little bit working knowledge with Eclipse IDE. So let us proceed to write a simple Android Application which will print "Hello World!". Create Android Application The first step is to create a simple Android Application using Eclipse IDE. Follow the option File -> New -> Project and finally select Android New Application wizard from the wizard list. Now name your application as HelloWorld using the wizard window as follows:
  • 19. Next, follow the instructions provided and keep all other entries as default till the final step. Once your project is created successfully, you will have following project screen −
  • 20. Anatomy of Android Application Before you run your app, you should be aware of a few directories and files in the Android project −
  • 21. S.N. Folder, File & Description 1 src This contains the .java source files for your project. By default, it includes an MainActivity.java source file having an activity class that runs when your app is launched
  • 22. using the app icon. 2 gen This contains the .R file, a compiler-generated file that references all the resources found in your project. You should not modify this file. 3 bin This folder contains the Android package files .apk built by the ADT during the build process and everything else needed to run an Android application. 4 res/drawable-hdpi This is a directory for drawable objects that are designed for high-density screens. 5 res/layout This is a directory for files that define your app's user interface. 6 res/values This is a directory for other various XML files that contain a collection of resources, such as strings and colours definitions. 7 AndroidManifest.xml This is the manifest file which describes the fundamental characteristics of the app and defines each of its components. Following section will give a brief overview few of the important application files. The Main Activity File The main activity code is a Java file MainActivity.java. This is the actual application file which ultimately gets converted to a Dalvik executable and runs your application. Following is the default code generated by the application wizard for Hello World! application − package com.example.helloworld; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.support.v4.app.NavUtils; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
  • 23. } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } Here, R.layout.activity_main refers to the activity_main.xml file located in the res/layout folder. The onCreate() method is one of many methods that are figured when an activity is loaded. The Manifest File Whatever component you develop as a part of your application, you must declare all its components in a manifest.xml which resides at the root of the application project directory. This file works as an interface between Android OS and your application, so if you do not declare your component in this file, then it will not be considered by the OS. For example, a default manifest file will look like as following file − <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.helloworld" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> Here <application>...</application> tags enclosed the components related to the application. Attribute android:icon will point to the application icon available under res/drawable-hdpi. The application uses the image named ic_launcher.png located in the drawable folders
  • 24. The <activity> tag is used to specify an activity and android:name attribute specifies the fully qualified class name of the Activity subclass and the android:label attributes specifies a string to use as the label for the activity. You can specify multiple activities using <activity> tags. The action for the intent filter is named android.intent.action.MAIN to indicate that this activity serves as the entry point for the application. The category for the intent-filter is named android.intent.category.LAUNCHER to indicate that the application can be launched from the device's launcher icon. The @string refers to the strings.xml file explained below. Hence, @string/app_name refers to the app_name string defined in the strings.xml file, which is "HelloWorld". Similar way, other strings get populated in the application. Following is the list of tags which you will use in your manifest file to specify different Android application components:  <activity>elements for activities  <service> elements for services  <receiver> elements for broadcast receivers  <provider> elements for content providers The Strings File The strings.xml file is located in the res/values folder and it contains all the text that your application uses. For example, the names of buttons, labels, default text, and similar types of strings go into this file. This file is responsible for their textual content. For example, a default strings file will look like as following file − <resources> <string name="app_name">HelloWorld</string> <string name="hello_world">Hello world!</string> <string name="menu_settings">Settings</string> <string name="title_activity_main">MainActivity</string> </resources> The R File The gen/com.example.helloworld/R.java file is the glue between the activity Java files like MainActivity.java and the resources like strings.xml. It is an automatically generated file and you should not modify the content of the R.java file. Following is a sample of R.java file − /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ package com.example.helloworld;
  • 25. public final class R { public static final class attr { } public static final class dimen { public static final int padding_large=0x7f040002; public static final int padding_medium=0x7f040001; public static final int padding_small=0x7f040000; } public static final class drawable { public static final int ic_action_search=0x7f020000; public static final int ic_launcher=0x7f020001; } public static final class id { public static final int menu_settings=0x7f080000; } public static final class layout { public static final int activity_main=0x7f030000; } public static final class menu { public static final int activity_main=0x7f070000; } public static final class string { public static final int app_name=0x7f050000; public static final int hello_world=0x7f050001; public static final int menu_settings=0x7f050002; public static final int title_activity_main=0x7f050003; } public static final class style { public static final int AppTheme=0x7f060000; } } The Layout File The activity_main.xml is a layout file available in res/layout directory, that is referenced by your application when building its interface. You will modify this file very frequently to change the layout of your application. For your "Hello World!" application, this file will have following content related to default layout − <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" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
  • 26. android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:padding="@dimen/padding_medium" android:text="@string/hello_world" tools:context=".MainActivity" /> </RelativeLayout> This is an example of simple RelativeLayout which we will study in a separate chapter. The TextView is an Android control used to build the GUI and it have various attributes like android:layout_width, android:layout_height etc which are being used to set its width and height etc.. The @string refers to the strings.xml file located in the res/values folder. Hence, @string/hello_world refers to the hello string defined in the strings.xml file, which is "Hello World!". Running the Application Let's try to run our Hello World! application we just created. I assume you had created your AVD while doing environment set-up. To run the app from Eclipse, open one of your project's activity files and click Run icon from the tool bar. Eclipse installs the app on your AVD and starts it and if everything is fine with your set-up and application, it will display following Emulator window −
  • 27. Congratulations!!! you have developed your first Android Application and now just keep following rest of the tutorial step by step to become a great Android Developer. All the very best. Create Android Application on Android studio There are so many tools are available to develop android applications. as per Google official android development, they have launched android studio as official Android IDE  Hello World Android Resources Organizing & Accessing There are many more items which you use to build a good Android application. Apart from coding for the application, you take care of various other resources like static content that your code uses, such as bitmaps, colors, layout definitions, user interface strings, animation instructions, and more. These resources are always maintained separately in various sub- directories under res/ directory of the project.
  • 28. This tutorial will explain you how you can organize your application resources, specify alternative resources and access them in your applications. Organize Resources in eclipse You should place each type of resource in a specific sub directory of your project's res/ directory. For example, here's the file hierarchy for a simple project: MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ activity_main.xml info.xml values/ strings.xml The res/ directory contains all the resources in various sub directories. Here we have an image resource, two layout resources, and a string resource file. Following table gives a detail about the resource directories supported inside project res/ directory. Organize resource in Android Studio MyProject/ src/ main/ java/ MyActivity.java res/ drawable/ icon.png layout/ activity_main.xml info.xml values/ strings.xml Directory Resource Type anim/ XML filesthatdefinepropertyanimations.Theyare savedinres/anim/folderand accessedfromthe R.anim class. color/ XML filesthatdefineastate listof colors.Theyare savedinres/color/and accessedfromthe R.color class. drawable/ Image fileslike .png,.jpg,.gif orXML filesthatare compiledintobitmaps,state lists,shapes,animationdrawable.Theyare savedinres/drawable/andaccessed fromthe R.drawable class. layout/ XML filesthatdefineauserinterface layout.Theyare savedinres/layout/and accessedfromthe R.layout class. menu/ XML filesthatdefineapplicationmenus,suchasan OptionsMenu, ContextMenu,
  • 29. or Sub Menu.Theyare savedinres/menu/andaccessedfromthe R.menuclass. raw/ Arbitraryfilestosave intheirraw form. Youneedto call Resources.openRawResource() withthe resource ID,whichis R.raw.filenameto opensuchraw files. values/ XML filesthatcontainsimple values,suchasstrings,integers,andcolors.For example,here are some filename conventionsforresourcesyoucancreate inthis directory−  arrays.xml for resource arrays, and accessed from the R.array class.  integers.xml for resource integers, and accessed from the R.integer class.  bools.xml for resource boolean, and accessed from the R.bool class.  colors.xml for color values, and accessed from the R.color class.  dimens.xml for dimension values, and accessed from the R.dimen class.  strings.xml for string values, and accessed from the R.string class.  styles.xml for styles, and accessed from the R.style class. xml/ ArbitraryXML filesthatcan be readat runtime by callingResources.getXML().You can save variousconfigurationfileshere whichwillbe usedatruntime. Alternative Resources Your application should provide alternative resources to support specific device configurations. For example, you should include alternative drawable resources ( i.e.images ) for different screen resolution and alternative string resources for different languages. At runtime, Android detects the current device configuration and loads the appropriate resources for your application. To specify configuration-specific alternatives for a set of resources, follow the following steps −  Create a new directory in res/ named in the form <resources_name>- <config_qualifier>. Here resources_name will be any of the resources mentioned in the above table, like layout, drawable etc. The qualifier will specify an individual configuration for which these resources are to be used. You can check official documentation for a complete list of qualifiers for different type of resources.  Save the respective alternative resources in this new directory. The resource files must be named exactly the same as the default resource files as shown in the below example, but these files will have content specific to the alternative. For example though image file name will be same but for high resolution screen, its resolution will be high. Below is an example which specifies images for a default screen and alternative images for high resolution screen. MyProject/ src/ main/ java/
  • 30. MyActivity.java res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png layout/ activity_main.xml info.xml values/ strings.xml Below is another example which specifies layout for a default language and alternative layout for Arabic language. MyProject/ src/ main/ java/ MyActivity.java res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png layout/ activity_main.xml info.xml layout-ar/ main.xml values/ strings.xml Accessing Resources During your application development you will need to access defined resources either in your code, or in your layout XML files. Following section explains how to access your resources in both the scenarios − AccessingResourcesinCode When your Android application is compiled, a R class gets generated, which contains resource IDs for all the resources available in your res/ directory. You can use R class to access that resource using sub-directory and resource name or directly resource ID. Example To access res/drawable/myimage.png and set an ImageView you will use following code:
  • 31. ImageView imageView = (ImageView) findViewById(R.id.myimageview); imageView.setImageResource(R.drawable.myimage); Here first line of the code make use of R.id.myimageview to get ImageView defined with id myimageview in a Layout file. Second line of code makes use of R.drawable.myimage to get an image with name myimage available in drawable sub-directory under /res. Example Consider next example where res/values/strings.xml has following definition: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello, World!</string> </resources> Now you can set the text on a TextView object with ID msg using a resource ID as follows: TextView msgTextView = (TextView) findViewById(R.id.msg); msgTextView.setText(R.string.hello); Example Consider a layout res/layout/activity_main.xml with the following definition: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a Button" /> </LinearLayout> This application code will load this layout for an Activity, in the onCreate() method as follows − public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); }
  • 32. AccessingResourcesinXML Consider the following resource XML res/values/strings.xml file that includes a color resource and a string resource − <?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <string name="hello">Hello!</string> </resources> Now you can use these resources in the following layout file to set the text color and text string as follows: <?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@color/opaque_red" android:text="@string/hello" /> Now if you will go through previous chapter once again where I have explained Hello World! example, and I'm sure you will have better understanding on all the concepts explained in this chapter. So I highly recommend to check previous chapter for working example and check how I have used various resources at very basic level. Android - Activities If you have worked with C, C++ or Java programming language then you must have seen that your program starts from main() function. Very similar way, Android system initiates its program with in an Activity starting with a call on onCreate() callback method. There is a sequence of callback methods that start up an activity and a sequence of callback methods that tear down an activity as shown in the below Activity life cycle diagram: (image courtesy : android.com )
  • 33. The Activity class defines the following call backs i.e. events. You don't need to implement all the callbacks methods. However, it's important that you understand each one and implement those that ensure your app behaves the way users expect. Callback Description onCreate() Thisis the firstcallbackand calledwhenthe activityisfirstcreated. onStart() Thiscallbackis calledwhenthe activitybecomesvisible tothe user. onResume() Thisis calledwhenthe userstartsinteractingwiththe application. onPause() The pausedactivitydoesnotreceive userinputandcannotexecute anycode and calledwhenthe currentactivityisbeingpausedandthe previousactivityisbeing
  • 34. resumed. onStop() Thiscallbackis calledwhenthe activityisnolongervisible. onDestroy() Thiscallbackis calledbefore the activityisdestroyedbythe system. onRestart() Thiscallbackis calledwhenthe activityrestartsafterstoppingit. Example This example will take you through simple steps to show Android application activity life cycle. Follow the following steps to modify the Android application we created in Hello World Example chapter: Step Description 1 You will use eclipseIDEtocreate an Androidapplicationandname itas HelloWorld undera package com.example.helloworld asexplainedinthe Hello World Examplechapter. 2 Modifymainactivityfile MainActivity.java asexplainedbelow.Keeprestof the filesunchanged. 3 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/com.example.helloworld/MainActivity.java. This file includes each of the fundamental life cycle methods. The Log.d() method has been used to generate log messages: package com.example.helloworld; import android.os.Bundle; import android.app.Activity; import android.util.Log; public class MainActivity extends Activity { String msg = "Android : "; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(msg, "The onCreate() event"); } /** Called when the activity is about to become visible. */ @Override protected void onStart() { super.onStart(); Log.d(msg, "The onStart() event"); }
  • 35. /** Called when the activity has become visible. */ @Override protected void onResume() { super.onResume(); Log.d(msg, "The onResume() event"); } /** Called when another activity is taking focus. */ @Override protected void onPause() { super.onPause(); Log.d(msg, "The onPause() event"); } /** Called when the activity is no longer visible. */ @Override protected void onStop() { super.onStop(); Log.d(msg, "The onStop() event"); } /** Called just before the activity is destroyed. */ @Override public void onDestroy() { super.onDestroy(); Log.d(msg, "The onDestroy() event"); } } An activity class loads all the UI component using the XML file available in res/layout folder of the project. Following statement loads UI components from res/layout/activity_main.xml file: setContentView(R.layout.activity_main); An application can have one or more activities without any restrictions. Every activity you define for your application must be declared in your AndroidManifest.xml file and the main activity for your app must be declared in the manifest with an <intent-filter> that includes the MAIN action and LAUNCHER category as follows: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.helloworld" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity
  • 36. android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest> If either the MAIN action or LAUNCHER category are not declared for one of your activities, then your app icon will not appear in the Home screen's list of apps. Let's try to run our modified Hello World! application we just modified. I assume you had created your AVD while doing environment setup. To run the app from Eclipse, open one of your project's activity files and click Run icon from the toolbar. Eclipse installs the app on your AVD and starts it and if everything is fine with your setup and application, it will display Emulator window and you should see following log messages in LogCat window in Eclipse IDE: 07-19 15:00:43.405: D/Android :(866): The onCreate() event 07-19 15:00:43.405: D/Android :(866): The onStart() event 07-19 15:00:43.415: D/Android :(866): The onResume() event Let us try to click Red button on the Android emulator and it will generate following events messages in LogCat window in Eclipse IDE:
  • 37. 07-19 15:01:10.995: D/Android :(866): The onPause() event 07-19 15:01:12.705: D/Android :(866): The onStop() event Let us again try to click Menu button on the Android emulator and it will generate following events messages in LogCat window in Eclipse IDE: 07-19 15:01:13.995: D/Android :(866): The onStart() event 07-19 15:01:14.705: D/Android :(866): The onResume() event Next, let us again try to click Back button on the Android emulator and it will generate following events messages in LogCat window in Eclipse IDE and this completes the Activity Life Cycle for an Android Application. 07-19 15:33:15.687: D/Android :(992): The onPause() event 07-19 15:33:15.525: D/Android :(992): The onStop() event 07-19 15:33:15.525: D/Android :(992): The onDestroy() event Android - Services tate Description Started A service is startedwhenan applicationcomponent,suchasan activity,startsitby callingstartService().Once started,aservice canrunin the background indefinitely,evenif the componentthatstarteditisdestroyed. Bound A service is boundwhenanapplicationcomponentbindstoitbycalling bindService().A boundservice offersaclient-serverinterfacethatallows componentstointeractwiththe service,sendrequests,getresults,andevendoso across processeswithinterprocesscommunication(IPC). A service has life cycle callback methods that you can implement to monitor changes in the service's state and you can perform work at the appropriate stage. The following diagram on the left shows the life cycle when the service is created with startService() and the diagram on the right shows the life cycle when the service is created with bindService(): (image courtesy : android.com )
  • 38. To create an service, you create a Java class that extends the Service base class or one of its existing subclasses. The Service base class defines various callback methods and the most important are given below. You don't need to implement all the callbacks methods. However, it's important that you understand each one and implement those that ensure your app behaves the way users expect. Callback Description onStartCommand() The systemcallsthismethodwhenanothercomponent,suchasan activity, requeststhatthe service be started,bycalling startService().If youimplement thismethod,itisyour responsibilitytostopthe service whenitsworkisdone,by callingstopSelf() orstopService()methods. onBind() The systemcallsthismethodwhenanothercomponentwantstobindwiththe service bycallingbindService().If youimplementthismethod,youmustprovide an interface thatclientsuse tocommunicate withthe service,byreturningan IBinderobject.You mustalwaysimplementthismethod,butif youdon'twant to allowbinding,thenyoushouldreturn null.
  • 39. onUnbind() The systemcallsthismethodwhenall clientshave disconnectedfromaparticular interface publishedbythe service. onRebind() The systemcallsthismethodwhennew clientshave connectedtothe service, afterit had previouslybeennotifiedthatall haddisconnectedinits onUnbind(Intent). onCreate() The systemcallsthismethodwhenthe service isfirstcreatedusing onStartCommand()oronBind().Thiscall isrequiredtoperformone-time set-up. onDestroy() The systemcallsthismethodwhenthe service isnolongerusedandisbeing destroyed.Yourservice shouldimplementthistocleanupanyresourcessuchas threads, registeredlisteners,receivers,etc. The following skeleton service demonstrates each of the life cycle methods − package com.tutorialspoint; import android.app.Service; import android.os.IBinder; import android.content.Intent; import android.os.Bundle; public class HelloService extends Service { /** indicates how to behave if the service is killed */ int mStartMode; /** interface for clients that bind */ IBinder mBinder; /** indicates whether onRebind should be used */ boolean mAllowRebind; /** Called when the service is being created. */ @Override public void onCreate() { } /** The service is starting, due to a call to startService() */ @Override public int onStartCommand(Intent intent, int flags, int startId) { return mStartMode; } /** A client is binding to the service with bindService() */ @Override public IBinder onBind(Intent intent) { return mBinder; } /** Called when all clients have unbound with unbindService() */ @Override public boolean onUnbind(Intent intent) { return mAllowRebind; }
  • 40. /** Called when a client is binding to the service with bindService()*/ @Override public void onRebind(Intent intent) { } /** Called when The service is no longer used and is being destroyed */ @Override public void onDestroy() { } } Example This example will take you through simple steps to show how to create your own Android Service. Follow the following steps to modify the Android application we created in Hello World Example chapter: Step Description 1 You will use AndroidStudioIDEtocreate an Androidapplicationandname itas My Application undera package com.example.My Application asexplainedinthe Hello World Examplechapter. 2 Modifymainactivityfile MainActivity.java toaddstartService() andstopService() methods. 3 Create a newjavafile MyService.java underthe package com.example.My Application.Thisfile will have implementationof Androidservice relatedmethods. 4 Define yourservice in AndroidManifest.xmlfile using<service.../>tag.Anapplicationcanhave one or more serviceswithoutanyrestrictions. 5 Modifythe defaultcontentof res/layout/activity_main.xmlfile toincludetwobuttonsinlinear layout. 6 No needtochange any constantsin res/values/strings.xmlfile.Androidstudiotake care of string values 7 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/com.example.My Application/MainActivity.java. This file can include each of the fundamental life cycle methods. We have added startService() and stopService() methods to start and stop the service. package com.example.My Application;
  • 41. import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.content.Intent; import android.view.View; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } // Method to start the service public void startService(View view) { startService(new Intent(getBaseContext(), MyService.class)); } // Method to stop the service public void stopService(View view) { stopService(new Intent(getBaseContext(), MyService.class)); } } Following is the content of src/com.example.My Application/MyService.java. This file can have implementation of one or more methods associated with Service based on requirements. For now we are going to implement only two methods onStartCommand() and onDestroy() − package com.example.My Application; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.widget.Toast; public class MyService extends Service { @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // Let it continue running until it is stopped. Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); return START_STICKY; }
  • 42. @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show(); } } Following will the modified content of AndroidManifest.xml file. Here we have added <service.../> tag to include our service: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.MyApplication" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="13" android:targetSdkVersion="22" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <service android:name=".MyService" /> </application> </manifest> Following will be the content of res/layout/activity_main.xml file to include two buttons: <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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView1"
  • 43. android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Example of services" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_above="@+id/imageButton" android:layout_centerHorizontal="true" android:layout_marginBottom="40dp" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:text="Start Services" android:onClick="startService" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop Services" android:id="@+id/button" android:onClick="stopService" android:layout_below="@+id/button2" android:layout_alignLeft="@+id/button2" android:layout_alignStart="@+id/button2" android:layout_alignRight="@+id/button2" android:layout_alignEnd="@+id/button2" /> </RelativeLayout> Following will be the content of res/values/strings.xml to define two new constants: <resources> <string name="app_name">My Application</string> <string name="menu_settings">Settings</string> <string name="title_activity_main">MainActivity</string> </resources>
  • 44. Let's try to run our modified Hello World! application we just modified. I assume you had created your AVD while doing environment setup. To run the app from Android studio, open one of your project's activity files and click Run icon from the tool bar. Android Studio installs the app on your AVD and starts it and if everything is fine with your set-up and application, it will display following Emulator window − Now to start your service, let's click on Start Service button, this will start the service and as per our programming in onStartCommand() method, a message Service Started will appear on the bottom of the the simulator as follows – Android - Broadcast Receivers Broadcast Receivers simply respond to broadcast messages from other applications or from the system itself. These messages are sometime called events or intents. For example, applications can also initiate broadcasts to let other applications know that some data has been downloaded to
  • 45. the device and is available for them to use, so this is broadcast receiver who will intercept this communication and will initiate appropriate action. There are following two important steps to make BroadcastReceiver works for the system broadcasted intents −  Creating the Broadcast Receiver.  Registering Broadcast Receiver There is one additional steps in case you are going to implement your custom intents then you will have to create and broadcast those intents. Creating the Broadcast Receiver A broadcast receiver is implemented as a subclass of BroadcastReceiver class and overriding the onReceive() method where each message is received as a Intent object parameter. public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); } } Registering Broadcast Receiver An application listens for specific broadcast intents by registering a broadcast receiver in AndroidManifest.xml file. Consider we are going to register MyReceiver for system generated event ACTION_BOOT_COMPLETED which is fired by the system once the Android system has completed the boot process.
  • 46. Broadcast-Receiver <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name="MyReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"> </action> </intent-filter> </receiver> </application> Now whenever your Android device gets booted, it will be intercepted by BroadcastReceiver MyReceiver and implemented logic inside onReceive() will be executed. There are several system generated events defined as final static fields in the Intent class. The following table lists a few important system events. Event Constant Description android.intent.action.BATTERY_CHANGED Stickybroadcastcontainingthe chargingstate,level,and otherinformationabout the battery. android.intent.action.BATTERY_LOW Indicateslow batteryconditiononthe device. android.intent.action.BATTERY_OKAY Indicatesthe batteryisnow okayafterbeinglow. android.intent.action.BOOT_COMPLETED Thisis broadcastonce,afterthe systemhasfinished booting. android.intent.action.BUG_REPORT Show activityforreportinga bug. android.intent.action.CALL Performa call to someone specifiedbythe data. android.intent.action.CALL_BUTTON The user pressedthe "call"buttontogo to the dialeror otherappropriate UI forplacinga call. android.intent.action.DATE_CHANGED The date has changed. android.intent.action.REBOOT Have the device reboot. Broadcasting Custom Intents If you want your application itself should generate and send custom intents then you will have to create and send those intents by using the sendBroadcast() method inside your activity class. If you use the sendStickyBroadcast(Intent) method, the Intent is sticky, meaning the Intent you are sending stays around after the broadcast is complete. public void broadcastIntent(View view) { Intent intent = new Intent(); intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent); }
  • 47. This intent com.tutorialspoint.CUSTOM_INTENT can also be registered in similar way as we have regsitered system generated intent. <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name="MyReceiver"> <intent-filter> <action android:name="com.tutorialspoint.CUSTOM_INTENT"> </action> </intent-filter> </receiver> </application> Example This example will explain you how to create BroadcastReceiver to intercept custom intent. Once you are familiar with custom intent, then you can program your application to intercept system generated intents. So let's follow the following steps to modify the Android application we created in Hello World Example chapter − Step Description 1 You will use Androidstudiotocreate an Androidapplicationandname itas My Application under a package com.example.My Application asexplainedinthe Hello World Examplechapter. 2 Modifymainactivityfile MainActivity.java toaddbroadcastIntent() method. 3 Create a newjavafile called MyReceiver.java underthe package com.example.My Application to define aBroadcastReceiver. 4 An applicationcanhandle one ormore customand systemintentswithoutanyrestrictions.Every indentyouwantto interceptmustbe registeredinyour AndroidManifest.xmlfile using <receiver.../>tag 5 Modifythe defaultcontentof res/layout/activity_main.xmlfile toincludeabuttonto broadcast intent. 6 No needtomodifythe stringfile,Androidstudiotake care of string.xml file. 7 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/com.example.My Application/MainActivity.java. This file can include each of the fundamental life cycle methods. We have added broadcastIntent() method to broadcast a custom intent. package com.example.My Application; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.content.Intent; import android.view.View;
  • 48. public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } // broadcast a custom intent. public void broadcastIntent(View view){ Intent intent = new Intent(); intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent); } } Following is the content of src/com.example.My Application/MyReceiver.java: package com.example.My Application; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); } } Following will the modified content of AndroidManifest.xml file. Here we have added <service.../> tag to include our service: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.My Application" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
  • 49. <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <receiver android:name="MyReceiver"> <intent-filter> <action android:name="com.tutorialspoint.CUSTOM_INTENT"> </action> </intent-filter> </receiver> </application> </manifest> Following will be the content of res/layout/activity_main.xml file to include a button to broadcast our custom intent − <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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Example of Broadcast" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_above="@+id/imageButton" android:layout_centerHorizontal="true" android:layout_marginBottom="40dp" />
  • 50. <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:text="Broadcast Intent" android:onClick="broadcastIntent" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" /> </RelativeLayout> Following will be the content of res/values/strings.xml to define two new constants − <resources> <string name="menu_settings">Settings</string> <string name="title_activity_main">My Application</string> </resources> Let's try to run our modified Hello World! application we just modified. I assume you had created your AVD while doing environment set-up. To run the app from Android studio, open one of your project's activity files and click Run icon from the tool bar. Android Studio installs the app on your AVD and starts it and if everything is fine with your set-up and application, it will display following Emulator window −
  • 51. Now to broadcast our custom intent, let's click on Broadcast Intent button, this will broadcast our custom intent "com.tutorialspoint.CUSTOM_INTENT" which will be intercepted by our registered BroadcastReceiver i.e. MyReceiver and as per our implemented logic a toast will appear on the bottom of the the simulator as follows −
  • 52. You can try implementing other BroadcastReceiver to intercept system generated intents like system boot up, date changed, low battery etc.
  • 53. To stop the service, you can click the Stop Service button. Android - Content Providers A content provider component supplies data from one application to others on request. Such requests are handled by the methods of the ContentResolver class. A content provider can use different ways to store its data and the data can be stored in a database, in files, or even over a network.
  • 54. ContentProvider sometimesitis requiredto share data across applications.This is where content providersbecome very useful. Content providers let you centralize content in one place and have many different applications access it as needed. A content provider behaves very much like a database where you can query it, edit its content, as well as add or delete content using insert(), update(), delete(), and query() methods. In most cases this data is stored in an SQlite database. A content provider is implemented as a subclass of ContentProvider class and must implement a standard set of APIs that enable other applications to perform transactions. public class My Application extends ContentProvider { } Content URIs To query a content provider, you specify the query string in the form of a URI which has following format: <prefix>://<authority>/<data_type>/<id> Here is the detail of various parts of the URI − Part Description prefix Thisis alwayssetto content:// authority Thisspecifiesthe name of the contentprovider,forexample contacts,browseretc.For third-partycontentproviders,thiscouldbe the fullyqualifiedname,suchas com.tutorialspoint.statusprovider
  • 55. data_type Thisindicatesthe type of data thatthis particularproviderprovides.Forexample,if youare gettingall the contactsfrom the Contacts contentprovider,thenthe datapathwouldbe peopleand URI wouldlooklike this content://contacts/people id Thisspecifiesthe specificrecordrequested.Forexample,if youare lookingforcontact number5 in the ContactscontentproviderthenURI wouldlooklike this content://contacts/people/5. Create Content Provider This involves number of simple steps to create your own content provider.  First of all you need to create a Content Provider class that extends the ContentProviderbaseclass.  Second, you need to define your content provider URI address which will be used to access the content.  Next you will need to create your own database to keep the content. Usually, Android uses SQLite database and framework needs to override onCreate() method which will use SQLite Open Helper method to create or open the provider's database. When your application is launched, the onCreate() handler of each of its Content Providers is called on the main application thread.  Next you will have to implement Content Provider queries to perform different database specific operations.  Finally register your Content Provider in your activity file using <provider> tag. Here is the list of methods which you need to override in Content Provider class to have your Content Provider working: ContentProvider  onCreate() This method is called when the provider is started.  query() This method receives a request from a client. The result is returned as a Cursor object.  insert()This method inserts a new record into the content provider.
  • 56.  delete() This method deletes an existing record from the content provider.  update() This method updates an existing record from the content provider.  getType() This method returns the MIME type of the data at the given URI. Example This example will explain you how to create your own ContentProvider. So let's follow the following steps to similar to what we followed while creating Hello World Example− Step Description 1 You will use AndroidStudioIDEtocreate an Androidapplicationandname itas My Application undera package com.example.My Application,withblankActivity. 2 Modifymainactivityfile MainActivity.java toaddtwonew methods onClickAddName()and onClickRetrieveStudents(). 3 Create a newjavafile called StudentsProvider.java underthe package com.example.My Application to define youractual providerandassociatedmethods. 4 Registeryourcontentproviderinyour AndroidManifest.xmlfile using<provider.../>tag 5 Modifythe defaultcontentof res/layout/activity_main.xmlfile toincludeasmall GUI to add studentsrecords. 6 No needtochange string.xml.Androidstudiotake care of string.xml file. 7 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/com.example.My Application/MainActivity.java. This file can include each of the fundamental life cycle methods. We have added two new methods onClickAddName() and onClickRetrieveStudents() to handle user interaction with the application. package com.example.My Application; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.ContentValues; import android.content.CursorLoader; import android.database.Cursor; import android.view.Menu; import android.view.View; import android.widget.EditText;
  • 57. import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickAddName(View view) { // Add a new student record ContentValues values = new ContentValues(); values.put(StudentsProvider.NAME, ((EditText)findViewById(R.id.editText2)).getText().toString()); values.put(StudentsProvider.GRADE, ((EditText)findViewById(R.id.editText3)).getText().toString()); Uri uri = getContentResolver().insert( StudentsProvider.CONTENT_URI, values); Toast.makeText(getBaseContext(), uri.toString(), Toast.LENGTH_LONG).show(); } public void onClickRetrieveStudents(View view) { // Retrieve student records String URL = "content://com.example.provider.College/students"; Uri students = Uri.parse(URL); Cursor c = managedQuery(students, null, null, null, "name"); if (c.moveToFirst()) { do{ Toast.makeText(this, c.getString(c.getColumnIndex(StudentsProvider._ID)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.NAME)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.GRADE)), Toast.LENGTH_SHORT).show(); } while (c.moveToNext()); } } } Create new file StudentsProvider.java under com.example.My Application package and following is the content of src/com.example.My Application/StudentsProvider.java −
  • 58. package com.example.My Application; import java.util.HashMap; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.text.TextUtils; public class StudentsProvider extends ContentProvider { static final String PROVIDER_NAME = "com.example.provider.College"; static final String URL = "content://" + PROVIDER_NAME + "/students"; static final Uri CONTENT_URI = Uri.parse(URL); static final String _ID = "_id"; static final String NAME = "name"; static final String GRADE = "grade"; private static HashMap<String, String> STUDENTS_PROJECTION_MAP; static final int STUDENTS = 1; static final int STUDENT_ID = 2; static final UriMatcher uriMatcher; static{ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PROVIDER_NAME, "students", STUDENTS); uriMatcher.addURI(PROVIDER_NAME, "students/#", STUDENT_ID); } /** * Database specific constant declarations */ private SQLiteDatabase db; static final String DATABASE_NAME = "College"; static final String STUDENTS_TABLE_NAME = "students"; static final int DATABASE_VERSION = 1; static final String CREATE_DB_TABLE = " CREATE TABLE " + STUDENTS_TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + " name TEXT NOT NULL, " + " grade TEXT NOT NULL);"; /** * Helper class that actually creates and manages * the provider's underlying data repository.
  • 59. */ private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context){ super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_DB_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + STUDENTS_TABLE_NAME); onCreate(db); } } @Override public boolean onCreate() { Context context = getContext(); DatabaseHelper dbHelper = new DatabaseHelper(context); /** * Create a write able database which will trigger its * creation if it doesn't already exist. */ db = dbHelper.getWritableDatabase(); return (db == null)? false:true; } @Override public Uri insert(Uri uri, ContentValues values) { /** * Add a new student record */ long rowID = db.insert( STUDENTS_TABLE_NAME, "", values); /** * If record is added successfully */ if (rowID > 0) { Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(_uri, null); return _uri; } throw new SQLException("Failed to add a record into " + uri); } @Override public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
  • 60. qb.setTables(STUDENTS_TABLE_NAME); switch (uriMatcher.match(uri)) { case STUDENTS: qb.setProjectionMap(STUDENTS_PROJECTION_MAP); break; case STUDENT_ID: qb.appendWhere( _ID + "=" + uri.getPathSegments().get(1)); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } if (sortOrder == null || sortOrder == ""){ /** * By default sort on student names */ sortOrder = NAME; } Cursor c = qb.query(db, projection, selection, selectionArgs,null, null, sortOrder); /** * register to watch a content URI for changes */ c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; switch (uriMatcher.match(uri)){ case STUDENTS: count = db.delete(STUDENTS_TABLE_NAME, selection, selectionArgs); break; case STUDENT_ID: String id = uri.getPathSegments().get(1); count = db.delete( STUDENTS_TABLE_NAME, _ID + " = " + id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override
  • 61. public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; switch (uriMatcher.match(uri)){ case STUDENTS: count = db.update(STUDENTS_TABLE_NAME, values, selection, selectionArgs); break; case STUDENT_ID: count = db.update(STUDENTS_TABLE_NAME, values, _ID + " = " + uri.getPathSegments().get(1) + (!TextUtils.isEmpty(selection) ? " AND (" +selection + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri ); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)){ /** * Get all student records */ case STUDENTS: return "vnd.android.cursor.dir/vnd.example.students"; /** * Get a particular student */ case STUDENT_ID: return "vnd.android.cursor.item/vnd.example.students"; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } } Following will the modified content of AndroidManifest.xml file. Here we have added <provider.../> tag to include our content provider: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.My Application" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8"
  • 62. android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.My Application.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> <provider android:name="StudentsProvider" <android:authorities="com.example.provider.College"> </provider> </application> </manifest> Following will be the content of res/layout/activity_main.xml file to include a button to broadcast your custom intent − <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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"/"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Content provider" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_below="@+id/textView1"
  • 63. android:layout_centerHorizontal="true" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:text="Add Name" android:layout_below="@+id/editText3" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" android:layout_alignLeft="@+id/textView2" android:layout_alignStart="@+id/textView2" android:onClick="onClickAddName"/> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_below="@+id/imageButton" android:layout_alignRight="@+id/imageButton" android:layout_alignEnd="@+id/imageButton" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText2" android:layout_alignTop="@+id/editText" android:layout_alignLeft="@+id/textView1" android:layout_alignStart="@+id/textView1" android:layout_alignRight="@+id/textView1" android:layout_alignEnd="@+id/textView1" android:hint="Name" android:textColorHint="@android:color/holo_blue_light" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText3" android:layout_below="@+id/editText" android:layout_alignLeft="@+id/editText2" android:layout_alignStart="@+id/editText2" android:layout_alignRight="@+id/editText2" android:layout_alignEnd="@+id/editText2" android:hint="Grade" android:textColorHint="@android:color/holo_blue_bright" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
  • 64. android:text="Retrive student" android:id="@+id/button" android:layout_below="@+id/button2" android:layout_alignRight="@+id/editText3" android:layout_alignEnd="@+id/editText3" android:layout_alignLeft="@+id/button2" android:layout_alignStart="@+id/button2" android:onClick="onClickRetrieveStudents"/> </RelativeLayout> Make sure you have following content of res/values/strings.xml file: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Application</string> <string name="action_settings">Settings</string> </resources>; Let's try to run our modified My Application application we just created. I assume you had created your AVD while doing environment set-up. To run the app from Android Studio IDE, open one of your project's activity files and click Run icon from the tool bar. Android Studio installs the app on your AVD and starts it and if everything is fine with your set-up and application, it will display following Emulator window, be patience because it may take sometime based on your computer speed:
  • 65. Now let's enter student Name and Grade and finally click on Add Name button, this will add student record in the database and will flash a message at the bottom showing ContentProvider URI along with record number added in the database. This operation makes use of our insert() method. Let's repeat this process to add few more students in the database of our content provider.
  • 66. Once you are done with adding records in the database, now its time to ask ContentProvider to give us those records back, so let's click Retrieve Students button which will fetch and display all the records one by one which is as per our the implementation of our query() method. You can write activities against update and delete operations by providing callback functions in MainActivity.java file and then modify user interface to have buttons for update and deleted operations in the same way as we have done for add and read operations. This way you can use existing Content Provider like Address Book or you can use Content Provider concept in developing nice database oriented applications where you can perform all sort of database operations like read, write, update and delete as explained above in the example. Android - Fragments A Fragment isa piece of an activitywhichenable more modularactivitydesign.Itwill notbe wrongif we say,a fragmentisa kindof sub-activity. Following are important points about fragment −
  • 67.  A fragment has its own layout and its own behaviour with its own life cycle callbacks.  You can add or remove fragments in an activity while the activity is running.  You can combine multiple fragments in a single activity to build a multi-plane UI.  A fragment can be used in multiple activities.  Fragment life cycle is closely related to the life cycle of its host activity which means when the activity is paused, all the fragments available in the activity will also be stopped.  A fragment can implement a behaviour that has no user interface component.  Fragments were added to the Android API in Honeycomb version of Android which API version 11. You create fragments by extending Fragment class and You can insert a fragment into your activity layout by declaring the fragment in the activity's layout file, as a <fragment> element. Prior to fragment introduction, we had a limitation because we can show only a single activity on the screen at one given point in time. So we were not able to divide device screen and control different parts separately. But with the introduction of fragment we got more flexibility and removed the limitation of having a single activity on the screen at a time. Now we can have a single activity but each activity can comprise of multiple fragments which will have their own layout, events and complete life cycle. Following is a typical example of how two UI modules defined by fragments can be combined into one activity for a tablet design, but separated for a handset design. The application can embed two fragments in Activity A, when running on a tablet-sized device. However, on a handset-sized screen, there's not enough room for both fragments, so Activity A includes only the fragment for the list of articles, and when the user selects an article, it starts Activity B, which includes the second fragment to read the article.
  • 68. Fragment Life Cycle Android fragments have their own life cycle very similar to an android activity. This section briefs different stages of its life cycle. Fragment lifecycle Here is the list of methods which you can to override in your fragment class −  onAttach()The fragment instance is associated with an activity instance.The fragment and the activity is not fully initialized. Typically you get in this method a reference to the activity which uses the fragment for further initialization work.  onCreate() The system calls this method when creating the fragment. You should initialize essential components of the fragment that you want to retain when the fragment is paused or stopped, then resumed.  onCreateView() The system calls this callback when it's time for the fragment to draw its user interface for the first time. To draw a UI for your fragment, you must return a View component from this method that is the root of your fragment's layout. You can return null if the fragment does not provide a UI.  onActivityCreated()The onActivityCreated() is called after the onCreateView() method when the host activity is created. Activity and fragment instance have been created as well as the view hierarchy of the activity. At this point, view can be accessed with the findViewById() method. example. In this method you can instantiate objects which require a Context object  onStart()The onStart() method is called once the fragment gets visible.  onResume()Fragment becomes active.
  • 69.  onPause() The system calls this method as the first indication that the user is leaving the fragment. This is usually where you should commit any changes that should be persisted beyond the current user session.  onStop()Fragment going to be stopped by calling onStop()  onDestroyView()Fragment view will destroy after call this method  onDestroy()onDestroy() called to do final clean up of the fragment's state but Not guaranteed to be called by the Android platform. How to use Fragments? This involves number of simple steps to create Fragments.  First of all decide how many fragments you want to use in an activity. For example let's we want to use two fragments to handle landscape and portrait modes of the device.  Next based on number of fragments, create classes which will extend the Fragment class. The Fragment class has above mentioned callback functions. You can override any of the functions based on your requirements.  Corresponding to each fragment, you will need to create layout files in XML file. These files will have layout for the defined fragments.  Finally modify activity file to define the actual logic of replacing fragments based on your requirement. Types of Fragments Basically fragments are divided as three stages as shown below.  Single frame fragments − Single frame fragments are using for hand hold devices like mobiles, here we can show only one fragment as a view.  List fragments − fragments having special list view is called as list fragment  Fragments transaction − Using with fragment transaction. we can move one fragment to another fragment. Android - Intents and Filters An Android Intent is an abstract description of an operation to be performed. It can be used with startActivity to launch an Activity, broadcastIntent to send it to any interested BroadcastReceiver components, and startService(Intent) or bindService(Intent, ServiceConnection, int) to communicate with a background Service. The intentitself,an Intentobject, isa passive data structure holdingan abstract descriptionof an operationto be performed. For example, let's assume that you have an Activity that needs to launch an email client and sends an email using your Android device. For this purpose, your Activity would send an
  • 70. ACTION_SEND along with appropriate chooser, to the Android Intent Resolver. The specified chooser gives the proper interface for the user to pick how to send your email data. Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); email.putExtra(Intent.EXTRA_EMAIL, recipients); email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString()); email.putExtra(Intent.EXTRA_TEXT, body.getText().toString()); startActivity(Intent.createChooser(email, "Choose an email client from...")); Above syntax is calling startActivity method to start an email activity and result should be as shown below For example, assume that you have an Activity that needs to open URL in a web browser on your Android device. For this purpose, your Activity will send ACTION_WEB_SEARCH Intent to the Android Intent Resolver to open given URL in the web browser. The Intent Resolver parses through a list of Activities and chooses the one that would best match your Intent, in this case, the Web Browser Activity. The Intent Resolver then passes your web page to the web browser and starts the Web Browser Activity. String q = "tutorialspoint"; Intent intent = new Intent(Intent.ACTION_WEB_SEARCH ); intent.putExtra(SearchManager.QUERY, q); startActivity(intent); Above example will search as tutorialspoint on android search engine and it gives the result of tutorialspoint in your an activity There are separate mechanisms for delivering intents to each type of component - activities, services, and broadcast receivers. Sr.No Method & Description
  • 71. 1 Context.startActivity() The Intent object is passed to this method to launch a new activity or get an existing activity to do something new. 2 Context.startService() The Intent object is passed to this method to initiate a service or deliver new instructions to an ongoing service. 3 Context.sendBroadcast() The Intent object is passed to this method to deliver the message to all interested broadcast receivers. Intent Objects An Intent object is a bundle of information which is used by the component that receives the intent as well as information used by the Android system. An Intent object can contain the following components based on what it is communicating or going to perform − Action This is mandatory part of the Intent object and is a string naming the action to be performed — or, in the case of broadcast intents, the action that took place and is being reported. The action largely determines how the rest of the intent object is structured . The Intent class defines a number of action constants corresponding to different intents. Here is a list of Android Intent Standard Actions The action in an Intent object can be set by the setAction() method and read by getAction(). Data Adds a data specification to an intent filter. The specification can be just a data type (the mimeType attribute), just a URI, or both a data type and a URI. A URI is specified by separate attributes for each of its parts − These attributes that specify the URL format are optional, but also mutually dependent −  If a scheme isnotspecifiedforthe intentfilter,all the otherURIattributesare ignored.  If a hostis notspecifiedforthe filter,the portattribute andall the pathattributesare ignored. The setData() method specifies data only as a URI, setType() specifies it only as a MIME type, and setDataAndType() specifies it as both a URI and a MIME type. The URI is read by getData() and the type by getType().
  • 72. Some examples of action/data pairs are − S.N. Action/Data Pair & Description 1 ACTION_VIEW content://contacts/people/1 Display information about the person whose identifier is "1". 2 ACTION_DIAL content://contacts/people/1 Display the phone dialer with the person filled in. 3 ACTION_VIEW tel:123 Display the phone dialer with the given number filled in. 4 ACTION_DIAL tel:123 Display the phone dialer with the given number filled in. 5 ACTION_EDIT content://contacts/people/1 Edit information about the person whose identifier is "1". 6 ACTION_VIEW content://contacts/people/ Display a list of people, which the user can browse through. 7 ACTION_SET_WALLPAPER Show settings for choosing wallpaper 8 ACTION_SYNC It going to be synchronous the data,Constant Value is android.intent.action.SYNC 9 ACTION_SYSTEM_TUTORIAL It will start the platform-defined tutorial(Default tutorial or start up tutorial) 10 ACTION_TIMEZONE_CHANGED It intimates when time zone has changed 11 ACTION_UNINSTALL_PACKAGE It is used to run default uninstaller Category The category is an optional part of Intent object and it's a string containing additional information about the kind of component that should handle the intent. The addCategory() method places a category in an Intent object, removeCategory() deletes a category previously
  • 73. added, and getCategories() gets the set of all categories currently in the object. Here is a list of Android Intent Standard Categories. You can check detail on Intent Filters in below section to understand how do we use categories to choose appropriate activity corresponding to an Intent. Extras This will be in key-value pairs for additional information that should be delivered to the component handling the intent. The extras can be set and read using the putExtras() and getExtras() methods respectively. Here is a list of Android Intent Standard Extra Data Flags These flags are optional part of Intent object and instruct the Android system how to launch an activity, and how to treat it after it's launched etc. Sr.No Flags & Description 1 FLAG_ACTIVITY_CLEAR_TASK If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the activity to be cleared before the activity is started. That is, the activity becomes the new root of an otherwise empty task, and any old activities are finished. This can only be used in conjunction with FLAG_ACTIVITY_NEW_TASK. 2 FLAG_ACTIVITY_CLEAR_TOP If set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent. 3 FLAG_ACTIVITY_NEW_TASK This flag is generally used by activities that want to present a "launcher" style behavior: they give the user a list of separate things that can be done, which otherwise run completely independently of the activity launching them. ComponentName This optional field is an android ComponentName object representing either Activity, Service or BroadcastReceiver class. If it is set, the Intent object is delivered to an instance of the designated class otherwise Android uses other information in the Intent object to locate a suitable target. The component name is set by setComponent(), setClass(), or setClassName() and read by getComponent().
  • 74. Types of Intents There are following two types of intents supported by Android ExplicitIntents Explicit intent going to be connected internal world of application,suppose if you wants to connect one activity to another activity, we can do this quote by explicit intent, below image is connecting first activity to second activity by clicking button. These intents designate the target component by its name and they are typically used for application-internal messages - such as an activity starting a subordinate service or launching a sister activity. For example − // Explicit Intent by specifying its class name Intent i = new Intent(FirstActivity.this, SecondActivity.class); // Starts TargetActivity
  • 75. startActivity(i); ImplicitIntents These intents do not name a target and the field for the component name is left blank. Implicit intents are often used to activate components in other applications. For example − Intent read1=new Intent(); read1.setAction(android.content.Intent.ACTION_VIEW); read1.setData(ContactsContract.Contacts.CONTENT_URI); startActivity(read1); Above code will give result as shown below The target component which receives the intent can use the getExtras() method to get the extra data sent by the source component. For example −
  • 76. // Get bundle object at appropriate place in your code Bundle extras = getIntent().getExtras(); // Extract data using passed keys String value1 = extras.getString("Key1"); String value2 = extras.getString("Key2"); Example Following example shows the functionality of a Android Intent to launch various Android built- in applications. Step Description 1 You will use AndroidstudioIDEto create an Androidapplicationandname itas My Application undera package com.example.saira_000.myapplication.While creatingthisproject,make sure you Target SDK and CompileWith at the latestversionof AndroidSDKtouse higherlevelsof APIs. 2 Modify src/main/java/MainActivity.java fileandaddthe code to define twolisteners correspondingtwobuttonsie.StartBrowserandStart Phone. 3 ModifylayoutXML file res/layout/activity_main.xmltoaddthree buttonsinlinearlayout. 4 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/com.example.My Application/MainActivity.java. package com.example.saira_000.myapplication; import android.content.Intent; import android.net.Uri; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; public class MainActivity extends ActionBarActivity { Button b1,b2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
  • 77. b1=(Button)findViewById(R.id.button); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://www.example.com")); startActivity(i); } }); b2=(Button)findViewById(R.id.button2); b2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("tel:9510300000")); startActivity(i); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } Following will be the content of res/layout/activity_main.xml file − <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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin"
  • 78. tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Intent Example" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point" android:textColor="#ff87ff09" android:textSize="30dp" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_below="@+id/imageButton" android:layout_alignRight="@+id/imageButton" android:layout_alignEnd="@+id/imageButton" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Browser" android:id="@+id/button" android:layout_alignTop="@+id/editText" android:layout_alignRight="@+id/textView1" android:layout_alignEnd="@+id/textView1" android:layout_alignLeft="@+id/imageButton" android:layout_alignStart="@+id/imageButton" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Phone" android:id="@+id/button2" android:layout_below="@+id/button" android:layout_alignLeft="@+id/button" android:layout_alignStart="@+id/button" android:layout_alignRight="@+id/textView2"
  • 79. android:layout_alignEnd="@+id/textView2" /> </RelativeLayout> Following will be the content of res/values/strings.xml to define two new constants − <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Applicaiton</string> <string name="action_settings">Settings</string> </resources> Following is the default content of AndroidManifest.xml − <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.My Application" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.saira_000.myapplication.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> Let's try to run your My Application application. I assume you had created your AVD while doing environment setup. To run the app from Android Studio, open one of your project's activity files and click Run icon from the toolbar.Android Studio installs the app on your AVD and starts it and if everything is fine with your setup and application, it will display following Emulator window −
  • 80. Now click on Start Browser button, which will start a browser configured and display http://www.example.com as shown below −
  • 81. Similar way you can launch phone interface using Start Phone button, which will allow you to dial already given phone number. Intent Filters You have seen how an Intent has been used to call an another activity. Android OS uses filters to pinpoint the set of Activities, Services, and Broadcast receivers that can handle the Intent with help of specified set of action, categories, data scheme associated with an Intent. You will use <intent-filter> element in the manifest file to list down actions, categories and data types associated with any activity, service, or broadcast receiver. Following is an example of a part of AndroidManifest.xml file to specify an activity com.example.My Application.CustomActivity which can be invoked by either of the two mentioned actions, one category, and one data − <activity android:name=".CustomActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="com.example.My Application.LAUNCH" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> </intent-filter> </activity>
  • 82. Once this activity is defined along with above mentioned filters, other activities will be able to invoke this activity using either the android.intent.action.VIEW, or using the com.example.My Application.LAUNCH action provided their category is android.intent.category.DEFAULT. The <data> element specifies the data type expected by the activity to be called and for above example our custom activity expects the data to start with the "http://" There may be a situation that an intent can pass through the filters of more than one activity or service, the user may be asked which component to activate. An exception is raised if no target can be found. There are following test Android checks before invoking an activity −  A filter <intent-filter> may list more than one action as shown above but this list cannot be empty; a filter must contain at least one <action> element, otherwise it will block all intents. If more than one actions are mentioned then Android tries to match one of the mentioned actions before invoking the activity.  A filter <intent-filter> may list zero, one or more than one categories. if there is no category mentioned then Android always pass this test but if more than one categories are mentioned then for an intent to pass the category test, every category in the Intent object must match a category in the filter.  Each <data> element can specify a URI and a data type (MIME media type). There are separate attributes like scheme, host, port, and path for each part of the URI. An Intent object that contains both a URI and a data type passes the data type part of the test only if its type matches a type listed in the filter. Example Following example is a modification of the above example. Here we will see how Android resolves conflict if one intent is invoking two activities defined in , next how to invoke a custom activity using a filter and third one is an exception case if Android does not file appropriate activity defined for an intent. Step Description 1 You will use androidstudiotocreate anAndroidapplicationandname itas My Application under a package com.example.saira_000.myapplication.While creatingthisproject,make sure you Target SDK and CompileWith at the latestversionof AndroidSDKtouse higherlevelsof APIs. 2 Modify src/Main/Java/MainActivity.javafileandaddthe code to define three listeners correspondingtothree buttonsdefinedinlayoutfile. 3 Adda new src/Main/Java/CustomActivity.java file tohave one customactivitywhichwillbe invokedbydifferentintents. 4 ModifylayoutXML file res/layout/activity_main.xmltoaddthree buttonsinlinearlayout. 5 Addone layoutXML file res/layout/custom_view.xmltoadda simple <TextView>toshow the passeddata throughintent. 6 Modify AndroidManifest.xmltoadd<intent-filter>todefine rulesforyourintenttoinvoke
  • 83. customactivity. 7 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/MainActivity.java. package com.example.saira_000.myapplication; import android.content.Intent; import android.net.Uri; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; public class MainActivity extends ActionBarActivity { Button b1,b2,b3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1=(Button)findViewById(R.id.button); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("http://www.example.com") ); startActivity(i); } }); b2=(Button)findViewById(R.id.button2); b2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent("com.example.My Application.LAUNCH",Uri.parse("http://www.example.com")); startActivity(i); } }); b3=(Button)findViewById(R.id.button3); b3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {
  • 84. Intent i = new Intent("com.example.My Application.LAUNCH",Uri.parse("https://www.example.com")); startActivity(i); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } Following is the content of the modified main activity file src/com.example.My Application/CustomActivity.java. package com.example.saira_000.myapplication; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.widget.TextView; public class CustomActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.custom_view); TextView label = (TextView) findViewById(R.id.show_data); Uri url = getIntent().getData(); label.setText(url.toString()); } } Following will be the content of res/layout/activity_main.xml file − <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  • 85. xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Intent Example" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point" android:textColor="#ff87ff09" android:textSize="30dp" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_below="@+id/imageButton" android:layout_alignRight="@+id/imageButton" android:layout_alignEnd="@+id/imageButton" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start browsing with view action" android:id="@+id/button" android:layout_alignTop="@+id/editText" android:layout_alignRight="@+id/textView1" android:layout_alignEnd="@+id/textView1" android:layout_alignLeft="@+id/imageButton" android:layout_alignStart="@+id/imageButton" /> <Button android:layout_width="wrap_content"
  • 86. android:layout_height="wrap_content" android:text="Start browsing with launch action" android:id="@+id/button2" android:layout_below="@+id/button" android:layout_alignLeft="@+id/button" android:layout_alignStart="@+id/button" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Exceptional condition" android:id="@+id/button3" android:layout_below="@+id/button2" android:layout_alignLeft="@+id/button2" android:layout_alignStart="@+id/button2" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" /> </RelativeLayout> Following will be the content of res/layout/custom_view.xml file − <?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:id="@+id/show_data" android:layout_width="fill_parent" android:layout_height="400dp"/> </LinearLayout> Following will be the content of res/values/strings.xml to define two new constants − <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Application</string> <string name="action_settings">Settings</string> </resources> Following is the default content of AndroidManifest.xml − <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.My Application" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" />
  • 87. <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.saira_000.myapplication" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.saira_000.myapplication.CustomActivity" <android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="com.example.saira_000.myapplication.LAUNCH" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> </intent-filter> </activity> </application> </manifest> Let's try to run your My Application application. I assume you had created your AVD while doing environment setup. To run the app from Android Studio, open one of your project's activity files and click Run icon from the toolbar. Android Studio installs the app on your AVD and starts it and if everything is fine with your setup and application, it will display following Emulator window −
  • 88. Now let's start with first button "Start Browser with VIEW Action". Here we have defined our custom activity with a filter "android.intent.action.VIEW", and there is already one default activity against VIEW action defined by Android which is launching web browser, So android displays following two options to select the activity you want to launch.
  • 89. Now if you select Browser, then Android will launch web browser and open example.com website but if you select IndentDemo option then Android will launch CustomActivity which does nothing but just capture passed data and displays in a text view as follows −
  • 90. Now go back using back button and click on "Start Browser with LAUNCH Action" button, here Android applies filter to choose define activity and it simply launch your custom activity Again, go back using back button and click on "Exception Condition" button, here Android tries to find out a valid filter for the given intent but it does not find a valid activity defined because this time we have used data as https instead of http though we are giving a correct action, so Android raises an exception and shows following screen −
  • 91. Android - UI Layouts The basic building block for user interface is a View object which is created from the View class and occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class for widgets, which are used to create interactive UI components like buttons, text fields, etc. The ViewGroup is a subclass of View and provides invisible container that hold other Views or other ViewGroups and define their layout properties. At third level we have different layouts which are subclasses of ViewGroup class and a typical layout defines the visual structure for an Android user interface and can be created either at run time using View/ViewGroup objects or you can declare your layout using simple XML file main_layout.xml which is located in the res/layout folder of your project. Layout params This tutorial is more about creating your GUI based on layouts defined in XML file. A layout may contain any type of widgets such as buttons, labels, textboxes, and so on. Following is a simple example of XML file having LinearLayout: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text"
  • 92. android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is a Button" /> <!-- More GUI components go here --> </LinearLayout> Once your layout has created, you can load the layout resource from your application code, in your Activity.onCreate() callback implementation as shown below − public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } Android Layout Types There are number of Layouts provided by Android which you will use in almost all the Android applications to provide different view, look and feel. Sr.No Layout & Description 1 Linear Layout LinearLayout is a view group that aligns all children in a single direction, vertically or horizontally. 2 Relative Layout RelativeLayout is a view group that displays child views in relative positions. 3 Table Layout TableLayout is a view that groups views into rows and columns. 4 Absolute Layout AbsoluteLayout enables you to specify the exact location of its children. 5 Frame Layout The FrameLayout is a placeholder on screen that you can use to display a single view. 6 List View ListView is a view group that displays a list of scrollable items. 7 Grid View GridView is a ViewGroup that displays items in a two-dimensional, scrollable grid.
  • 93. Layout Attributes Each layout has a set of attributes which define the visual properties of that layout. There are few common attributes among all the layouts and their are other attributes which are specific to that layout. Following are common attributes and will be applied to all the layouts: Attribute Description android:id Thisis the ID whichuniquelyidentifiesthe view. android:layout_width Thisis the widthof the layout. android:layout_height Thisis the heightof the layout android:layout_marginTop Thisis the extraspace on the top side of the layout. android:layout_marginBottom Thisis the extraspace on the bottomside of the layout. android:layout_marginLeft Thisis the extraspace on the leftside of the layout. android:layout_marginRight Thisis the extraspace on the right side of the layout. android:layout_gravity Thisspecifieshow childViewsare positioned. android:layout_weight Thisspecifieshow muchof the extraspace inthe layoutshouldbe allocatedtothe View. android:layout_x Thisspecifiesthe x-coordinate of the layout. android:layout_y Thisspecifiesthe y-coordinateof the layout. android:layout_width Thisis the widthof the layout. android:layout_width Thisis the widthof the layout. android:paddingLeft Thisis the leftpaddingfilledforthe layout. android:paddingRight Thisis the rightpaddingfilledforthe layout. android:paddingTop Thisis the top paddingfilledforthe layout. android:paddingBottom Thisis the bottompaddingfilledforthe layout. Here width and height are the dimension of the layout/view which can be specified in terms of dp (Density-independent Pixels), sp ( Scale-independent Pixels), pt ( Points which is 1/72 of an inch), px( Pixels), mm ( Millimeters) and finally in (inches). You can specify width and height with exact measurements but more often, you will use one of these constants to set the width or height −  android:layout_width=wrap_content tells your view to size itself to the dimensions required by its content.  android:layout_width=fill_parent tells your view to become as big as its parent view. Gravity attribute plays important role in positioning the view object and it can take one or more (separated by '|') of the following constant values. Constant Value Description top 0x30 Pushobjectto the top of its container,notchangingitssize. bottom 0x50 Pushobjectto the bottomof itscontainer,notchangingitssize. left 0x03 Pushobjectto the leftof itscontainer,notchangingitssize. right 0x05 Pushobjectto the rightof itscontainer,notchangingitssize. center_vertical 0x10 Place objectinthe vertical centerof itscontainer,notchangingits
  • 94. size. fill_vertical 0x70 Grow the vertical size of the objectif neededsoitcompletelyfillsits container. center_horizontal 0x01 Place objectinthe horizontal centerof itscontainer,notchangingits size. fill_horizontal 0x07 Grow the horizontal size of the objectif neededso itcompletelyfills itscontainer. center 0x11 Place the objectinthe centerof itscontainerinboththe vertical and horizontal axis,notchangingitssize. fill 0x77 Grow the horizontal andvertical size of the objectif neededsoit completely fillsitscontainer. clip_vertical 0x80 Additional optionthatcanbe setto have the top and/orbottom edgesof the childclippedtoitscontainer'sbounds.The clipwill be basedon the vertical gravity:atop gravitywill clipthe bottomedge, a bottomgravitywill clipthe topedge,andneitherwill clipboth edges. clip_horizontal 0x08 Additional optionthatcanbe setto have the leftand/orrightedges of the childclippedtoitscontainer'sbounds.The clipwill be based on the horizontal gravity: aleftgravitywill clipthe rightedge,aright gravitywill clipthe leftedge,andneitherwill clipbothedges. start 0x00800003 Pushobjectto the beginningof itscontainer,notchangingitssize. end 0x00800005 Pushobjectto the endof itscontainer,notchangingitssize. View Identification A view object may have a unique ID assigned to it which will identify the View uniquely within the tree. The syntax for an ID, inside an XML tag is − android:id="@+id/my_button" Following is a brief description of @ and + signs −  The at-symbol (@) at the beginning of the string indicates that the XML parser should parse and expand the rest of the ID string and identify it as an ID resource.  The plus-symbol (+) means that this is a new resource name that must be created and added to our resources. To create an instance of the view object and capture it from the layout, use the following − Button myButton = (Button) findViewById(R.id.my_button); Android - UI Controls Input controls are the interactive components in your app's user interface. Android provides a wide variety of controls you can use in your UI, such as buttons, text fields, seek bars, check box, zoom buttons, toggle buttons, and many more.
  • 95. UI Elements A View is an object that draws something on the screen that the user can interact with and a ViewGroup is an object that holds other View (and ViewGroup) objects in order to define the layout of the user interface. You define your layout in an XML file which offers a human-readable structure for the layout, similar to HTML. For example, a simple vertical layout with a text view and a button looks like this − <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="I am a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="I am a Button" /> </LinearLayout> Android UI Controls There are number of UI controls provided by Android that allow you to build the graphical user interface for your app. S.N. UI Control & Description 1 TextView This control is used to display text to the user. 2 EditText
  • 96. EditText is a predefined subclass of TextView that includes rich editing capabilities. 3 AutoCompleteTextView The AutoCompleteTextView is a view that is similar to EditText, except that it shows a list of completion suggestions automatically while the user is typing. 4 Button A push-button that can be pressed, or clicked, by the user to perform an action. 5 ImageButton AbsoluteLayout enables you to specify the exact location of its children. 6 CheckBox An on/off switch that can be toggled by the user. You should use check box when presenting users with a group of selectable options that are not mutually exclusive. 7 ToggleButton An on/off button with a light indicator. 8 RadioButton The RadioButton has two states: either checked or unchecked. 9 RadioGroup A RadioGroup is used to group together one or more RadioButtons. 10 ProgressBar The ProgressBar view provides visual feedback about some ongoing tasks, such as when you are performing a task in the background. 11 Spinner A drop-down list that allows users to select one value from a set. 12 TimePicker The TimePicker view enables users to select a time of the day, in either 24-hour mode or AM/PM mode. 13 DatePicker The DatePicker view enables users to select a date of the day. Create UI Controls Input controls are the interactive components in your app's user interface. Android provides a wide variety of controls you can use in your UI, such as buttons, text fields, seek bars, check box, zoom buttons, toggle buttons, and many more.
  • 97. As explained in previous chapter, a view object may have a unique ID assigned to it which will identify the View uniquely within the tree. The syntax for an ID, inside an XML tag is − android:id="@+id/text_id" To create a UI Control/View/Widget you will have to define a view/widget in the layout file and assign it a unique ID as follows − <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="I am a TextView" /> </LinearLayout> Then finally create an instance of the Control object and capture it from the layout, use the following − TextView myText = (TextView) findViewById(R.id.text_id); Android - Event Handling Events are a useful way to collect data about a user's interaction with interactive components of Applications. Like button presses or screen touch etc. The Android framework maintains an event queue as first-in, first-out (FIFO) basis. You can capture these events in your program and take appropriate action as per requirements. There are following three concepts related to Android Event Management −  Event Listeners − An event listener is an interface in the View class that contains a single callback method. These methods will be called by the Android framework when the View to which the listener has been registered is triggered by user interaction with the item in the UI.  Event Listeners Registration − Event Registration is the process by which an Event Handler gets registered with an Event Listener so that the handler is called when the Event Listener fires the event.  Event Handlers − When an event happens and we have registered an event listener for the event, the event listener calls the Event Handlers, which is the method that actually handles the event. Event Listeners & Event Handlers Event Handler Event Listener & Description
  • 98. onClick() OnClickListener() This is called when the user either clicks or touches or focuses upon any widget like button, text, image etc. You will use onClick() event handler to handle such event. onLongClick() OnLongClickListener() This is called when the user either clicks or touches or focuses upon any widget like button, text, image etc. for one or more seconds. You will use onLongClick() event handler to handle such event. onFocusChange() OnFocusChangeListener() This is called when the widget looses its focus ie. user goes away from the view item. You will use onFocusChange() event handler to handle such event. onKey() OnFocusChangeListener() This is called when the user is focused on the item and presses or releases a hardware key on the device. You will use onKey() event handler to handle such event. onTouch() OnTouchListener() This is called when the user presses the key, releases the key, or any movement gesture on the screen. You will use onTouch() event handler to handle such event. onMenuItemClick() OnMenuItemClickListener() This is called when the user selects a menu item. You will use onMenuItemClick() event handler to handle such event. onCreateContextMenu() onCreateContextMenuItemListener() This is called when the context menu is being built(as the result of a sustained "long click) There are many more event listeners available as a part of View class like OnHoverListener, OnDragListener etc which may be needed for your application. So I recommend to refer official documentation for Android application development in case you are going to develop a sophisticated apps. Event Listeners Registration Event Registration is the process by which an Event Handler gets registered with an Event Listener so that the handler is called when the Event Listener fires the event. Though there are several tricky ways to register your event listener for any event, but I'm going to list down only top 3 ways, out of which you can use any of them based on the situation.
  • 99.  Using an Anonymous Inner Class  Activity class implements the Listener interface.  Using Layout file activity_main.xml to specify event handler directly. Below section will provide you detailed examples on all the three scenarios − Touch Mode Users can interact with their devices by using hardware keys or buttons or touching the screen.Touching the screen puts the device into touch mode. The user can then interact with it by touching the on-screen virtual buttons, images, etc.You can check if the device is in touch mode by calling the View class’s isInTouchMode() method. Touch Event Focus A view or widget is usually highlighted or displays a flashing cursor when it’s in focus. This indicates that it’s ready to accept input from the user.  isFocusable() – it returns true or false  isFocusableInTouchMode() – checks to see if the view is focusable in touch mode. (A view may be focusable when using a hardware key but not when the device is in touch mode) android:foucsUp="@=id/button_l" onTouchEvent() public boolean onTouchEvent(motionEvent event){ switch(event.getAction()){ case TOUCH_DOWN: Toast.makeText(this,"you have clicked down Touch button",Toast.LENTH_LONG).show(); break(); case TOUCH_UP: Toast.makeText(this,"you have clicked up touch button",Toast.LENTH_LONG).show(); break; case TOUCH_MOVE: Toast.makeText(this,"you have clicked move touch button"Toast.LENTH_LONG).show(); break; } return super.onTouchEvent(event) ; }
  • 100. Event Handling Examples EventListenersRegistrationUsinganAnonymousInnerClass Here you will create an anonymous implementation of the listener and will be useful if each class is applied to a single control only and you have advantage to pass arguments to event handler. In this approach event handler methods can access private data of Activity. No reference is needed to call to Activity. But if you applied the handler to more than one control, you would have to cut and paste the code for the handler and if the code for the handler is long, it makes the code harder to maintain. Following are the simple steps to show how we will make use of separate Listener class to register and capture click event. Similar way you can implement your listener for any other required event type. Step Description 1 You will use AndroidstudioIDEto create an Androidapplicationandname itas myapplication undera package com.example.myapplication asexplainedinthe Hello World Examplechapter. 2 Modify src/MainActivity.java file toaddclickeventlistenersandhandlersforthe twobuttons defined. 3 Modifythe detaultcontentof res/layout/activity_main.xmlfile toinclude AndroidUIcontrols. 4 No needtodeclare defaultstringconstants.Androidstudiotakescare defaultconstants. 5 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe aplication. Following is the content of the modified main activity file src/com.example.myapplication/MainActivity.java. This file can include each of the fundamental lifecycle methods. package com.example.myapplication; public class MainActivity extends ActionBarActivity { private ProgressDialog progress; Button b1,b2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progress = new ProgressDialog(this); b1=(Button)findViewById(R.id.button); b2=(Button)findViewById(R.id.button2); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView txtView = (TextView) findViewById(R.id.textView); txtView.setTextSize(25); }
  • 101. }); b2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView txtView = (TextView) findViewById(R.id.textView); txtView.setTextSize(55); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } Following will be the content of res/layout/activity_main.xml file − <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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Event Handling " android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp"/>
  • 102. <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_above="@+id/imageButton" android:layout_centerHorizontal="true" android:layout_marginBottom="40dp" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Small font" android:id="@+id/button" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Font" android:id="@+id/button2" android:layout_below="@+id/button" android:layout_alignRight="@+id/button" android:layout_alignEnd="@+id/button" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/textView" android:layout_below="@+id/button2" android:layout_centerHorizontal="true" android:textSize="25dp" /> </RelativeLayout> Following will be the content of res/values/strings.xml to define two new constants − <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">myapplication</string> <string name="action_settings">Settings</string> </resources> Following is the default content of AndroidManifest.xml −
  • 103. <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.myapplication.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> Let's try to run your myapplication application. I assume you had created your AVD while doing environment setup. To run the app from Android Studio, open one of your project's activity files and click Run icon from the toolbar. Android Studio installs the app on your AVD and starts it and if everything is fine with your setup and application, it will display following Emulator window − Now you try to click on two buttons, one by one and you will see that font of the Hello World text will change, which happens because registered click event handler method is being called against each click event. Exercise I will recommend to try writing different event handlers for different event types and understand exact difference in different event types and their handling. Events related to menu, spinner, pickers widgets are little different but they are also based on the same concepts as explained above.
  • 104. Android - Styles and Themes A style resource defines the format and look for a UI. A style can be applied to an individual View (from within a layout file) or to an entire Activity or application (from within the manifest file). Defining Styles A style is defined in an XML resource that is separate from the XML that specifies the layout. This XML file resides under res/values/ directory of your project and will have <resources> as the root node which is mandatory for the style file. The name of the XML file is arbitrary, but it must use the .xml extension. You can define multiple styles per file using <style> tag but each style will have its name that uniquely identifies the style. Android style attributes are set using <item> tag as shown below − <?xml version="1.0" encoding="utf-8"?> <resources> <style name="CustomFontStyle"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:capitalize">characters</item> <item name="android:typeface">monospace</item> <item name="android:textSize">12pt</item> <item name="android:textColor">#00FF00</item>/> </style> </resources> The value forthe <item>can be a keywordstring,ahex color,a reference toanotherresource type,or othervalue dependingonthe style property. Using Styles Once your style is defined, you can use it in your XML Layout file using style attribute as follows − <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text_id" style="@style/CustomFontStyle" android:text="@string/hello_world" /> </LinearLayout> To understand the concept related to Android Style, you can check Style Demo Example.
  • 105. Style Inheritance Android supports style Inheritance in very much similar way as cascading style sheet in web design. You can use this to inherit properties from an existing style and then define only the properties that you want to change or add. To implement a custom theme create or edit MyAndroidApp/res/values/themes.xml and add the following − <resources> ... <style name="MyCustomTheme" parent="android:style/Theme"> <item name="android:textColorPrimary">#ffff0000</item> </style> ... </resources> In your AndroidManifest.xml apply the theme to the activities you want to style − <activity android:name="com.myapp.MyActivity" ... android:theme="@style/MyCustomTheme" /> Your new theme will be applied to your activity, and text is now bright red.
  • 106. Applying Colors to Theme Attributes Your color resource can then be applied to some theme attributes, such as the window background and the primary text color, by adding elements to your custom theme. These attributes are defined in your styles.xml file. For example, to apply the custom color to the window background, add the following two elements to your custom theme, defined in MyAndroidApp/res/values/styles.xml file − <resources> ... <style name="MyCustomTheme" ...> <item name="android:windowBackground">@color/my_custom_color</item> <item name="android:colorBackgroundCacheHint">@color/my_custom_color</item> </style>
  • 107. ... </resources> Using a Custom Nine-Patch With Buttons A nine-patch drawable is a special kind of image which can be scaled in width and height while maintaining its visual integrity. Nine-patches are the most common way to specify the appearance of Android buttons, though any drawable type can be used.
  • 108. a Sample of Nine-Patch button Stepsto create Nine-PatchButtons  Save thisbitmapas /res/drawable/my_nine_patch.9.png  Define anewstyle  Applythe newbuttonstyle tothe buttonStyle attribute of yourcustomtheme Define a new Style <resources> ... <style name="MyCustomButton" parent="android:Widget.Button"> <item name="android:background">@drawable/my_nine_patch</item> </style> ... </resources> Apply the theme <resources> ... <style name="MyCustomTheme" parent=...> ... <item name="android:buttonStyle">@style/MyCustomButton</item> </style> ... </resources>
  • 109. Android Themes Hope you understood the concept of Style, so now let's try to understand what is a Theme. A theme is nothing but an Android style applied to an entire Activity or application, rather than an individual View. Thus, when a style is applied as a theme, every View in the Activity or application will apply each style property that it supports. For example, you can apply the same CustomFontStyle style as a theme for an Activity and then all text inside that Activity will have green monospace font. To set a theme for all the activities of your application, open the AndroidManifest.xml file and edit the <application> tag to include the android:theme attribute with the style name. For example −
  • 110. <application android:theme="@style/CustomFontStyle"> But if you want a theme applied to just one Activity in your application, then add the android:theme attribute to the <activity> tag only. For example − <activity android:theme="@style/CustomFontStyle"> There are number of default themes defined by Android which you can use directly or inherit them using parent attribute as follows − <style name="CustomTheme" parent="android:Theme.Light"> ... </style> To understand the concept related to Android Theme, you can check Theme Demo Example. Styling the colour palette The layout design can implementable based on them based colours, for example as following design is designed based on them colour(blue) Above layout has designed based on style.xml file,Which has placed at res/values/
  • 111. <resource> <style name="AppTheme" parent="android:Theme.Material"> <item name ="android:color/primary">@color/primary</item> <item name ="android:color/primaryDark">@color/primary_dark</item> <item name ="android:colorAccent/primary">@color/accent</item> </style> <resource> Default Styles & Themes The Android platform provides a large collection of styles and themes that you can use in your applications. You can find a reference of all available styles in the R.style class. To use the styles listed here, replace all underscores in the style name with a period. For example, you can apply the Theme_NoTitleBar theme with "@android:style/Theme.NoTitleBar". You can see the following source code for Android styles and themes −  Android Styles (styles.xml)  Android Themes (themes.xml) Android - Custom Components Implementing own components in pre built-in components with extending subclass with own defined class Android offers a great list of pre-built widgets like Button, TextView, EditText, ListView, CheckBox, RadioButton, Gallery, Spinner, AutoCompleteTextView etc. which you can use directly in your Android application development, but there may be a situation when you are not satisfied with existing functionality of any of the available widgets. Android provides you with means of creating your own custom components which you can customized to suit your needs. If you only need to make small adjustments to an existing widget or layout, you can simply subclass the widget or layout and override its methods which will give you precise control over the appearance and function of a screen element. This tutorial explains you how to create custom Views and use them in your application using simple and easy steps.
  • 112. Example of Custom Components in Custom View hierarchy Creating a Simple Custom Component Step Description 1 You will use AndroidstudioIDEto create an Androidapplicationandname itas compoundview undera package com.vogella.android.customview.compoundview asexplainedinthe Hello World
  • 113. Examplechapter. 2 Create an XML res/values/attrs.xmlfile todefine new attributesalongwiththeirdatatype. 3 Create src/ColorOptionsView.java file andaddthe code to define yourcustomcomponent.Itwill extendLinearLayoutandwillhave additional functionalitytoshow colourcompound.You will provide attributesparsinglogicinof the constructorshavingAttributeSetasa parameter. 4 Modify res/layout/activity_main.xmlfileandaddthe code to create Colourcompoundview instance alongwithfewdefaultattributesandnew attributes. 5 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Create the following attributes file called attrs.xml in your res/values folder. <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Options"> <attr name="titleText" format="string" localization="suggested" /> <attr name="valueColor" format="color" /> </declare-styleable> </resources> Change the layout file used by the activity to the following. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:custom="http://schemas.android.com/apk/res/com.vogella.android.view.com poundview" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:showDividers="middle" android:divider="?android:attr/listDivider" tools:context=".MainActivity" > <com.vogella.android.view.compoundview.ColorOptionsView android:id="@+id/view1" android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:background="?android:selectableItemBackground" android:onClick="onClicked" custom:titleText="Background color" custom:valueColor="@android:color/holo_green_light"/> <com.vogella.android.view.compoundview.ColorOptionsView android:id="@+id/view2" android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:background="?android:selectableItemBackground" android:onClick="onClicked" custom:titleText="Foreground color" custom:valueColor="@android:color/holo_orange_dark"/> </LinearLayout>
  • 114. Create the following java file called ColorOptionsView for your compound view. package com.vogella.android.customview.compoundview; import com.vogella.android.view.compoundview.R; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class ColorOptionsView extends LinearLayout { private View mValue; private ImageView mImage; public ColorOptionsView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ColorOptionsView, 0, 0); String titleText = a.getString(R.styleable.ColorOptionsView_titleText); int valueColor = a.getColor(R.styleable.ColorOptionsView_valueColor,android.R.color.holo_blue_ light); a.recycle(); setOrientation(LinearLayout.HORIZONTAL); setGravity(Gravity.CENTER_VERTICAL); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.view_color_options, this, true); TextView title = (TextView) getChildAt(0); title.setText(titleText); mValue = getChildAt(1); mValue.setBackgroundColor(valueColor); mImage = (ImageView) getChildAt(2); } public ColorOptionsView(Context context) { this(context, null); } public void setValueColor(int color) { mValue.setBackgroundColor(color); } public void setImageVisible(boolean visible) { mImage.setVisibility(visible ? View.VISIBLE : View.GONE);
  • 115. } } Change your Main activity java file to the following code and run your application. package com.vogella.android.customview.compoundview; import com.vogella.android.view.compoundview.R; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void onClicked(View view) { String text = view.getId() == R.id.view1 ? "Background" : "Foreground"; Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); } } The running application should look like the following screen shot.
  • 116. Instantiate usingcodeinsideactivityclass It is very similar way of instantiating custom component the way you instantiate built-in widget in your activity class. For example you can use following code to instantiate above defined custom component − @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DateView dateView = new DateView(this); setContentView(dateView); }
  • 117. Check Above example to understand how to Instantiate a Basic Android Custom Component using code inside an activity. Instantiate usingLayoutXML file Traditionally you use Layout XML file to instantiate your built-in widgets, same concept will apply on your custom widgets as well so you will be able to instantiate your custom component using Layout XML file as explained below. Here com.example.compoundview is the package where you have put all the code related to DateView class and DateView is Java class name where you have put complete logic of your custom component. <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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <com.example.compoundview.DateView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#fff" android:textSize="40sp" android:background="#000"/> </RelativeLayout> It is important to note here that we are using all TextView attributes along with custom component without any change. Similar way you will be able to use all the events, and methods along with DateView component. Check this example to understand how to Instantiate a Basic Android Custom Component using Layout XML file. Custom Component with Custom Attributes We have seen how we can extend functionality of built-in widgets but in both the examples given above we saw that extended component can make use of all the default attributes of its parent class. But consider a situation when you want to create your own attribute from scratch. Below is a simple procedure to create and use new attributes for Android Custom components. Consider we want to introduce three attributes and will use them as shown below − <com.example.compoundview.DateView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#fff" android:textSize="40sp" custom:delimiter="-"
  • 118. custom:fancyText="true"/> Step 1 The first step to enable us to use our custom attributes is to define them in a new xml file under res/values/ and call it attrs.xml. Let's have a look on an example attrs.xml file − <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="DateView"> <attr name="delimiter" format="string"/> <attr name="fancyText" format="boolean"/> </declare-styleable> </resources> Here the name=value is what we want to use in our Layout XML file as attribute, and the format=type is the type of attribute. Step 2 Your second step will be to read these attributes from Layout XML file and set them for the component. This logic will go in the constructors that get passed an AttributeSet, since that is what contains the XML attributes. To read the values in the XML, you need to first create a TypedArray from the AttributeSet, then use that to read and set the values as shown in the below example code − TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DateView); final int N = a.getIndexCount(); for (int i = 0; i < N; ++i) { int attr = a.getIndex(i); switch (attr) { case R.styleable.DateView_delimiter: String delimiter = a.getString(attr); //...do something with delimiter... break; case R.styleable.DateView_fancyText: boolean fancyText = a.getBoolean(attr, false); //...do something with fancyText... break; } } a.recycle(); Step 3 Finally you can use your defined attributes in your Layout XML file as follows −
  • 119. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:custom="http://schemas.android.com/apk/res/com.example.compoundview" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <com.example.compoundview.DateView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#fff" android:textSize="40sp" custom:delimiter="-" custom:fancyText="true"/> </RelativeLayout> The important part is xmlns:custom="http://schemas.android.com/apk/res/com.example.compoundview". Note that http://schemas.android.com/apk/res/ will remain as is, but last part will be set to your package name and also that you can use anything after xmlns:, in this example I used custom, but you could use any name you like. Check this example to understand how to Create Custom Attributes for Android Custom Component with simple steps. Android - Drag and Drop Android drag/drop framework allows your users to move data from one View to another View in the current layout using a graphical drag and drop gesture. As of API 11 drag and drop of view onto other views or view groups is supported.The framework includes following three important components to support drag & drop functionality −  Drag event class:  Drag listeners:  Helper methods and classes: The Drag/Drop Process There are basically four steps or states in the drag and drop process:  Started − This event occurs when you start dragging an item in a layout, your application calls startDrag() method to tell the system to start a drag. The arguments inside startDrag() method provide the data to be dragged, metadata for this data, and a callback for drawing the drag shadow.
  • 120. The system first responds by calling back to your application to get a drag shadow. It then displays the drag shadow on the device. Next, the system sends a drag event with action type ACTION_DRAG_STARTED to the registered drag event listeners for all the View objects in the current layout. To continue to receive drag events, including a possible drop event, a drag event listener must return true, If the drag event listener returns false, then it will not receive drag events for the current operation until the system sends a drag event with action type ACTION_DRAG_ENDED.  Continuing − The user continues the drag. System sends ACTION_DRAG_ENTERED action followed by ACTION_DRAG_LOCATION action to the registered drag event listener for the View where dragging point enters. The listener may choose to alter its View object's appearance in response to the event or can react by highlighting its View. The drag event listener receives a ACTION_DRAG_EXITED action after the user has moved the drag shadow outside the bounding box of the View.  Dropped − The user releases the dragged item within the bounding box of a View. The system sends the View object's listener a drag event with action type ACTION_DROP.  Ended − Just after the action type ACTION_DROP, the system sends out a drag event with action type ACTION_DRAG_ENDED to indicate that the drag operation is over. The DragEvent Class The DragEvent represents an event that is sent out by the system at various times during a drag and drop operation. This class provides few Constants and important methods which we use during Drag/Drop process. Constants Following are all constants integers available as a part of DragEvent class. Sr.No. Constants & Description 1 ACTION_DRAG_STARTED Signals the start of a drag and drop operation. 2 ACTION_DRAG_ENTERED Signals to a View that the drag point has entered the bounding box of the View. 3 ACTION_DRAG_LOCATION Sent to a View after ACTION_DRAG_ENTERED if the drag shadow is still within the View object's bounding box. 4 ACTION_DRAG_EXITED
  • 121. Signals that the user has moved the drag shadow outside the bounding box of the View. 5 ACTION_DROP Signals to a View that the user has released the drag shadow, and the drag point is within the bounding box of the View. 6 ACTION_DRAG_ENDED Signals to a View that the drag and drop operation has concluded. Methods Following are few important and most frequently used methods available as a part of DragEvent class. Sr.No. Constants & Description 1 int getAction() Inspect the action value of this event.. 2 ClipData getClipData() Returns the ClipData object sent to the system as part of the call to startDrag(). 3 ClipDescriptiongetClipDescription() Returns the ClipDescription object contained in the ClipData. 4 booleangetResult() Returns an indication of the result of the drag and drop operation. 5 float getX() Gets the X coordinate of the drag point. 6 float getY() Gets the Y coordinate of the drag point. 7 String toString() Returns a string representation of this DragEvent object. Listening for Drag Event If you want any of your views within a Layout should respond Drag event then your view either implements View.OnDragListener or setup onDragEvent(DragEvent) callback method. When the system calls the method or listener, it passes to them a DragEvent object explained above. You can have both a listener and a callback method for View object. If this occurs, the system first calls the listener and then defined callback as long as listener returns true.
  • 122. The combination of the onDragEvent(DragEvent) method and View.OnDragListener is analogous to the combination of the onTouchEvent() and View.OnTouchListener used with touch events in old versions of Android. Starting a Drag Event You start with creating a ClipData and ClipData.Item for the data being moved. As part of the ClipData object, supply metadata that is stored in a ClipDescription object within the ClipData. For a drag and drop operation that does not represent data movement, you may want to use null instead of an actual object. Next either you can extend extend View.DragShadowBuilder to create a drag shadow for dragging the view or simply you can use View.DragShadowBuilder(View) to create a default drag shadow that's the same size as the View argument passed to it, with the touch point centered in the drag shadow. Example Following example shows the functionality of a simple Drag & Drop using View.setOnLongClickListener(), View.setOnTouchListener()and View.OnDragEventListener(). Step Description 1 You will use AndroidstudioIDEto create an Androidapplicationandname itas My Application undera package com.example.saira_000.myapplication.While creatingthisproject,make sure youTarget SDK andCompile With at the latestversionof AndroidSDKtouse higherlevelsof APIs. 2 Modify src/MainActivity.java file andaddthe code to define eventlistenersaswell asacall back methodsforthe logoimage usedinthe example. 3 Copyimage abc.pngin res/drawable-*folders.Youcanuse imageswithdifferentresolutionin case youwantto provide themfordifferentdevices. 4 ModifylayoutXML file res/layout/activity_main.xmltodefine defaultview of the logoimages. 5 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/MainActivity.java. This file can include each of the fundamental lifecycle methods. package com.example.saira_000.myapplication; import android.app.Activity; import android.content.ClipData; import android.content.ClipDescription; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.DragEvent; import android.view.Menu; import android.view.MenuItem;
  • 123. import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; public class MainActivity extends Activity { ImageView img; String msg; private android.widget.RelativeLayout.LayoutParams layoutParams; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img=(ImageView)findViewById(R.id.imageView); img.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { ClipData.Item item = new ClipData.Item((CharSequence)v.getTag()); String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN}; ClipData dragData = new ClipData(v.getTag().toString(),mimeTypes, item); View.DragShadowBuilder myShadow = new View.DragShadowBuilder(img); v.startDrag(dragData,myShadow,null,0); return true; } }); img.setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { switch(event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: layoutParams = (RelativeLayout.LayoutParams)v.getLayoutParams(); Log.d(msg, "Action is DragEvent.ACTION_DRAG_STARTED"); // Do nothing break; case DragEvent.ACTION_DRAG_ENTERED: Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENTERED"); int x_cord = (int) event.getX(); int y_cord = (int) event.getY(); break; case DragEvent.ACTION_DRAG_EXITED : Log.d(msg, "Action is DragEvent.ACTION_DRAG_EXITED"); x_cord = (int) event.getX(); y_cord = (int) event.getY(); layoutParams.leftMargin = x_cord;
  • 124. layoutParams.topMargin = y_cord; v.setLayoutParams(layoutParams); break; case DragEvent.ACTION_DRAG_LOCATION : Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION"); x_cord = (int) event.getX(); y_cord = (int) event.getY(); break; case DragEvent.ACTION_DRAG_ENDED : Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENDED"); // Do nothing break; case DragEvent.ACTION_DROP: Log.d(msg, "ACTION_DROP event"); // Do nothing break; default: break; } return true; } }); img.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { ClipData data = ClipData.newPlainText("", ""); View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(img); img.startDrag(data, shadowBuilder, img, 0); img.setVisibility(View.INVISIBLE); return true; } else { return false; } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) {
  • 125. // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } Following will be the content of res/layout/activity_main.xml file − <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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Drag and Drop Example" android:id="@+id/textView" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials Point" android:id="@+id/textView2" android:layout_below="@+id/textView" android:layout_centerHorizontal="true" android:textSize="30dp" android:textColor="#ff14be3c" />> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:src="@drawable/abc" android:layout_below="@+id/textView2" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" android:layout_alignLeft="@+id/textView2" android:layout_alignStart="@+id/textView2" />
  • 126. </RelativeLayout> Following will be the content of res/values/strings.xml to define two new constants − <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Application</string> <string name="action_settings">Settings</string> </resources> Following is the default content of AndroidManifest.xml − <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.guidemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.guidemo.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> Let's try to run your My Application application. I assume you had created your AVD while doing environment setup. To run the app from Android Studio, open one of your project's activity files and click Run icon from the toolbar. Android studio installs the app on your AVD and starts it and if everything is fine with your setup and application, it will display following Emulator window −
  • 127. Now do long click on the displayed TutorialsPoint logo and you will see that logo image moves a little after 1 seconds long click from its place, its the time when you should start dragging the image. You can drag it around the screen and drop it at a new location.
  • 128. Android - Notifications A notification is a message you can display to the user outside of your application's normal UI. When you tell the system to issue a notification, it first appears as an icon in the notification area. To see the details of the notification, the user opens the notification drawer. Both the notification area and the notification drawer are system-controlled areas that the user can view at any time. Android Toast class provides a handy way to show users alerts but problem is that these alerts are not persistent which means alert flashes on the screen for a few seconds and then disappears. To see the details of the notification, you will have to select the icon which will display notification drawer having detail about the notification. While working with emulator with virtual device, you will have to click and drag down the status bar to expand it which will give you detail as follows. This will be just 64 dp tall and called normal view.
  • 129. Above expanded form can have a Big View which will have additional detail about the notification. You can add upto six additional lines in the notification. The following screen shot shows such notification. Create and Send Notifications You have simple way to create a notification. Follow the following steps in your application to create a notification −
  • 130. Step 1 - CreateNotificationBuilder As a first step is to create a notification builder using NotificationCompat.Builder.build(). You will use Notification Builder to set various Notification properties like its small and large icons, title, priority etc. NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) Step 2 - SettingNotificationProperties Once you have Builder object, you can set its Notification properties using Builder object as per your requirement. But this is mandatory to set at least following −  A small icon, set by setSmallIcon()  A title, set by setContentTitle()  Detail text, set by setContentText() mBuilder.setSmallIcon(R.drawable.notification_icon); mBuilder.setContentTitle("Notification Alert, Click Me!"); mBuilder.setContentText("Hi, This is Android Notification Detail!"); You have plenty of optional properties which you can set for your notification. To learn more about them, see the reference documentation for NotificationCompat.Builder. Step 3 - Attach Actions This is an optional part and required if you want to attach an action with the notification. An action allows users to go directly from the notification to an Activity in your application, where they can look at one or more events or do further work. The action is defined by a PendingIntent containing an Intent that starts an Activity in your application. To associate the PendingIntent with a gesture, call the appropriate method of NotificationCompat.Builder. For example, if you want to start Activity when the user clicks the notification text in the notification drawer, you add the PendingIntent by calling setContentIntent(). A PendingIntent object helps you to perform an action on your applications behalf, often at a later time, without caring of whether or not your application is running. We take help of stack builder object which will contain an artificial back stack for the started Activity. This ensures that navigating backward from the Activity leads out of your application to the Home screen. Intent resultIntent = new Intent(this, ResultActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(ResultActivity.class); // Adds the Intent that starts the Activity to the top of the stack
  • 131. stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); Step 4 - Issuethe notification Finally, you pass the Notification object to the system by calling NotificationManager.notify() to send your notification. Make sure you call NotificationCompat.Builder.build() method on builder object before notifying it. This method combines all of the options that have been set and return a new Notification object. NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // notificationID allows you to update the notification later on. mNotificationManager.notify(notificationID, mBuilder.build()); The NotificationCompat.Builder Class The NotificationCompat.Builder class allows easier control over all the flags, as well as help constructing the typical notification layouts. Following are few important and most frequently used methods available as a part of NotificationCompat.Builder class. Sr.No. Constants & Description 1 Notificationbuild() Combine all of the options that have been set and return a new Notification object. 2 NotificationCompat.BuildersetAutoCancel (booleanautoCancel) Setting this flag will make it so the notification is automatically canceled when the user clicks it in the panel. 3 NotificationCompat.BuildersetContent(RemoteViewsviews) Supply a custom RemoteViews to use instead of the standard one. 4 NotificationCompat.BuildersetContentInfo(CharSequence info) Set the large text at the right-hand side of the notification. 5 NotificationCompat.BuildersetContentIntent(PendingIntentintent) Supply a PendingIntent to send when the notification is clicked. 6 NotificationCompat.BuildersetContentText(CharSequence text) Set the text (second row) of the notification, in a standard notification. 7 NotificationCompat.BuildersetContentTitle (CharSequence title) Set the text (first row) of the notification, in a standard notification. 8 NotificationCompat.BuildersetDefaults(intdefaults)
  • 132. Set the default notification options that will be used. 9 NotificationCompat.BuildersetLargeIcon(Bitmapicon) Set the large icon that is shown in the ticker and notification. 10 NotificationCompat.BuildersetNumber(intnumber) Set the large number at the right-hand side of the notification. 11 NotificationCompat.BuildersetOngoing(booleanongoing) Set whether this is an ongoing notification. 12 NotificationCompat.BuildersetSmallIcon(inticon) Set the small icon to use in the notification layouts. 13 NotificationCompat.BuildersetStyle (NotificationCompat.Style style) Add a rich notification style to be applied at build time. 14 NotificationCompat.BuildersetTicker(CharSequence tickerText) Set the text that is displayed in the status bar when the notification first arrives. 15 NotificationCompat.BuildersetVibrate (long[]pattern) Set the vibration pattern to use. 16 NotificationCompat.BuildersetWhen(longwhen) Set the time that the event occurred. Notifications in the panel are sorted by this time. Example Following example shows the functionality of a Android notification using a NotificationCompat.Builder Class which has been introduced in Android 4.1. Step Description 1 You will use AndroidstudioIDEto create an Androidapplicationandname itas tutorialspoint undera package com.example.notificationdemo.While creatingthisproject,make sure you Target SDK and CompileWith at the latestversionof AndroidSDKtouse higherlevelsof APIs. 2 Modify src/MainActivity.java file andaddthe code to notify(""),if userclickonthe button,itwill call androidnotificationservice. 3 Create a newJava file src/NotificationView.java,whichwill be usedtodisplaynew layoutasa part of newactivitywhichwill be startedwhen userwill clickanyof the notifications 4 ModifylayoutXML file res/layout/activity_main.xmltoaddNotificationbuttoninrelative layout. 5 Create a newlayoutXML file res/layout/notification.xml.Thiswillbe usedaslayoutfile fornew activity whichwill startwhenuserwill clickanyof the notifications. 6 No needtochange defaultstringconstants.Androidstudiotakescare of defaultstringconstants 7 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application.
  • 133. Following is the content of the modified main activity file src/com.example.notificationdemo/MainActivity.java. This file can include each of the fundamental lifecycle methods. package com.example.notificationdemo; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; public class MainActivity extends ActionBarActivity { Button b1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1=(Button)findViewById(R.id.button); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Notify("You've received new message"); } }); } private void Notify(String notificationTitle, String notificationMessage){ NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); @SuppressWarnings("deprecation") Notification notification = new Notification(R.drawable.abc,"New Message", System.currentTimeMillis()); Intent notificationIntent = new Intent(this,NotificationView.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,notificationIntent, 0); notification.setLatestEventInfo(MainActivity.this, notificationTitle,notificationMessage, pendingIntent); notificationManager.notify(9999, notification); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; }
  • 134. @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } Following will be the content of res/layout/notification.xml file: <?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="400dp" android:text="Hi, Your Detailed notification view goes here...." /> </LinearLayout> Following is the content of the modified main activity file src/com.example.notificationdemo/NotificationView.java. package com.example.notificationdemo; import android.os.Bundle; import android.app.Activity; public class NotificationView extends Activity{ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.notification); } } Following will be the content of res/layout/activity_main.xml file − <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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin"
  • 135. android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Notification Example" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:layout_marginTop="48dp" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" android:layout_marginTop="42dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Notification" android:id="@+id/button" android:layout_marginTop="62dp" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" /> </RelativeLayout> Following will be the content of res/values/strings.xml to define two new constants − <?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_settings">Settings</string> <string name="app_name">tutorialspoint </string> </resources> Following is the default content of AndroidManifest.xml − <?xml version="1.0" encoding="utf-8"?>
  • 136. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.notificationdemo" android:versionCode="1" android:versionName="1.0" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.notificationdemo.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> <activity android:name=".NotificationView" android:label="Details of notification" android:parentActivityName=".MainActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"/> </activity> </application> </manifest> Let's try to run your tutorialspoint application. I assume you had created your AVD while doing environment set-up. To run the APP from Android Studio, open one of your project's activity files and click Run icon from the toolbar. Android Studio installs the app on your AVD and starts it and if everything is fine with your setup and application, it will display following Emulator window −
  • 137. Now click button, you will see at the top a message "New Message Alert!" will display momentarily and after that you will have following screen having a small icon at the top left corner. Now lets expand the view, long click on the small icon, after a second it will display date information and this is the time when you should drag status bar down without releasing mouse. You will see status bar will expand and you will get following screen −
  • 138. Big View Notification The following code snippet demonstrates how to alter the notification created in the previous snippet to use the Inbox big view style. I'm going to update displayNotification() modification method to show this functionality − protected void displayNotification() { Log.i("Start", "notification"); /* Invoking the default notification service */ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("New Message"); mBuilder.setContentText("You've received new message."); mBuilder.setTicker("New Message Alert!"); mBuilder.setSmallIcon(R.drawable.woman); /* Increase notification number every time a new notification arrives */ mBuilder.setNumber(++numMessages); /* Add Big View Specific Configuration */ NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); String[] events = new String[6]; events[0] = new String("This is first line...."); events[1] = new String("This is second line..."); events[2] = new String("This is third line..."); events[3] = new String("This is 4th line..."); events[4] = new String("This is 5th line..."); events[5] = new String("This is 6th line..."); // Sets a title for the Inbox style big view inboxStyle.setBigContentTitle("Big Title Details:"); // Moves events into the big view
  • 139. for (int i=0; i < events.length; i++) { inboxStyle.addLine(events[i]); } mBuilder.setStyle(inboxStyle); /* Creates an explicit intent for an Activity in your app */ Intent resultIntent = new Intent(this, NotificationView.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(NotificationView.class); /* Adds the Intent that starts the Activity to the top of the stack */ stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent =stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); /* notificationID allows you to update the notification later on. */ mNotificationManager.notify(notificationID, mBuilder.build()); } Now if you will try to run your application then you will find following result in expanded form of the view − Android - Location Based Services Android location APIs make it easy for you to build location-aware applications, without needing to focus on the details of the underlying location technology. This becomes possible with the help of Google Play services, which facilitates adding location awareness to your app with automated location tracking, geofencing, and activity recognition.
  • 140. This tutorial shows you how to use Location Services in your APP to get the current location, get periodic location updates, look up addresses etc. The Location Object The Location object represents a geographic location which can consist of a latitude, longitude, time stamp, and other information such as bearing, altitude and velocity. There are following important methods which you can use with Location object to get location specific information: Sr.No. Method & Description 1 float distanceTo(Locationdest) Returns the approximate distance in meters between this location and the given location. 2 float getAccuracy() Get the estimated accuracy of this location, in meters. 3 double getAltitude() Get the altitude if available, in meters above sea level. 4 float getBearing() Get the bearing, in degrees. 5 double getLatitude() Get the latitude, in degrees. 6 double getLongitude() Get the longitude, in degrees. 7 float getSpeed() Get the speed if it is available, in meters/second over ground. 8 booleanhasAccuracy() True if this location has an accuracy. 9 booleanhasAltitude() True if this location has an altitude. 10 booleanhasBearing() True if this location has a bearing. 11 booleanhasSpeed() True if this location has a speed. 12 void reset() Clears the contents of the location.
  • 141. 13 void setAccuracy(floataccuracy) Set the estimated accuracy of this location, meters. 14 void setAltitude(double altitude) Set the altitude, in meters above sea level. 15 void setBearing(floatbearing) Set the bearing, in degrees. 16 void setLatitude(double latitude) Set the latitude, in degrees. 17 void setLongitude(double longitude) Set the longitude, in degrees. 18 void setSpeed(floatspeed) Set the speed, in meters/second over ground. 19 String toString() Returns a string containing a concise, human-readable description of this object. Get the Current Location To get the current location, create a location client which is LocationClient object, connect it to Location Services using connect() method, and then call its getLastLocation() method. This method returns the most recent location in the form of Location object that contains latitude and longitude coordinates and other information as explained above. To have location based functionality in your activity, you will have to implement two interfaces −  GooglePlayServicesClient.ConnectionCallbacks  GooglePlayServicesClient.OnConnectionFailedListener These interfaces provide following important callback methods, which you need to implement in your activity class − Sr.No. Callback Methods & Description 1 abstract void onConnected(BundleconnectionHint) This callback method is called when location service is connected to the location client successfully. You will use connect() method to connect to the location client. 2 abstract void onDisconnected() This callback method is called when the client is disconnected. You will use disconnect() method to disconnect from the location client. 3 abstract void onConnectionFailed(ConnectionResultresult)
  • 142. This callback method is called when there was an error connecting the client to the service. You shouldcreate the locationclientin onCreate() methodof youractivityclass,thenconnectitin onStart(),so that LocationServicesmaintainsthe currentlocationwhile youractivityisfullyvisible.You shoulddisconnectthe clientin onStop() method,sothatwhenyourapp isnot visible,LocationServices isnot maintainingthe currentlocation.Thishelpsinsavingbatterypowerup-toalarge extent. Get the Updated Location If you are willing to have location updates, then apart from above mentioned interfaces, you will need to implement LocationListener interface as well. This interface provide following callback method, which you need to implement in your activity class − Sr.No. Callback Method & Description 1 abstract void onLocationChanged(Locationlocation) This callback method is used for receiving notifications from the LocationClient when the location has changed. Location Quality of Service The LocationRequest object is used to request a quality of service (QoS) for location updates from the LocationClient. There are following useful setter methods which you can use to handle QoS. There are equivalent getter methods available which you can check in Android official documentation. Sr.No. Method & Description 1 setExpirationDuration(longmillis) Set the duration of this request, in milliseconds. 2 setExpirationTime(longmillis) Set the request expiration time, in millisecond since boot. 3 setFastestInterval(longmillis) Explicitly set the fastest interval for location updates, in milliseconds. 4 setInterval(longmillis) Set the desired interval for active location updates, in milliseconds. 5 setNumUpdates(intnumUpdates) Set the number of location updates. 6 setPriority(intpriority) Set the priority of the request.
  • 143. Now for example, if your application wants high accuracy location it should create a location request with setPriority(int) set to PRIORITY_HIGH_ACCURACY and setInterval(long) to 5 seconds. You can also use bigger interval and/or other priorities like PRIORITY_LOW_POWER for to request "city" level accuracy or PRIORITY_BALANCED_POWER_ACCURACY for "block" level accuracy. Activitiesshouldstronglyconsiderremovingall locationrequestwhenenteringthe background(for example atonPause()),orat leastswapthe requesttoa largerinterval andlowerqualitytosave power consumption. Displaying a Location Address Once you have Location object, you can use Geocoder.getFromLocation() method to get an address for a given latitude and longitude. This method is synchronous, and may take a long time to do its work, so you should call the method from the doInBackground() method of an AsyncTask class. The AsyncTask must be subclassed to be used and the subclass will override doInBackground(Params...) method to perform a task in the background and onPostExecute(Result) method is invoked on the UI thread after the background computation finishes and at the time to display the result. There is one more important method available in AyncTask which is execute(Params... params), this method executes the task with the specified parameters. Check following example to have better understanding on how we use AynchTask in any Android application to get work done in the background without interfering main task. Example Following example shows you in practical how to to use Location Services in your app to get the current location and its equivalent addresses etc. To experimentwiththisexample,youwillneedactual Mobile deviceequippedwithlatestAndroidOS, otherwise youwillhave tostruggle withemulatorwhichmaynotwork. Install the GooglePlayServicesSDK Before you proceed to have location support in your Android Applications, you need to set-up Google Play Services SDK using following simple steps − Steps Description 1 Launch AndroidStudioIDE  From Android Studio select file >project structure >dependencies > Click on + button to add dependencies
  • 144.  youwouldgetchoose librarydependencies dialogwindow 2 Searchfor com.google.android.gms:play-services:6.5.87or higherversionlibrary.itsdependon whichandroidversionisusingwith. 3 Selectthe google playservicesandpressapplybuttonasshownbelow image CreateAndroidApplication Step Description 1 You will use AndroidstudioIDEto create an Androidapplicationandname itas Tutorialspoint undera package com.example.Tutorialspoint.While creatingthisproject,make sure you Target SDK andCompile With at the latestversionof AndroidSDKtouse higherlevelsof APIs. 2 AddGoogle Play Service libraryinyourprojectby followingsimple stepsgivenbelow. 3 Modify src/MainActivity.java file andaddrequiredcode asshownbelow totake care of getting currentlocationand itsequivalentaddress. 4 ModifylayoutXML file res/layout/activity_main.xmltoaddall GUI componentswhichinclude three buttonsandtwo textviewstoshow location/address. 5 Modify res/values/strings.xmltodefine requiredconstantvalues 6 Modify AndroidManifest.xmlasshownbelow 7 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Let's add Google Play Service reference in the project.Click on file > project structure > dependencies > and select + and then search google play services which will show com.google.android.gms:play-services:6.5.87 Click on ok button. it will close the choose dependencies windows. you must be close project structure by clicking apply button
  • 145. Above image is showing the result of adding google play services to project. after add google play services to project. It should be as follows
  • 146. Following is the content of the modified main activity file src/com.example.Tutorialspoint/MainActivity.java. package com.example.Tutorialspoint; import java.io.IOException; import java.util.List;
  • 147. import java.util.Locale; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesClient; import com.google.android.gms.location.LocationClient; import android.content.Context; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends FragmentActivity implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener { LocationClient mLocationClient; private TextView addressLabel; private TextView locationLabel; private Button getLocationBtn; private Button disconnectBtn; private Button connectBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationLabel = (TextView) findViewById(R.id.locationLabel); addressLabel = (TextView) findViewById(R.id.addressLabel); getLocationBtn = (Button) findViewById(R.id.getLocation); getLocationBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { displayCurrentLocation(); } }); disconnectBtn = (Button) findViewById(R.id.disconnect); disconnectBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { mLocationClient.disconnect(); locationLabel.setText("Got disconnected...."); } });
  • 148. connectBtn = (Button) findViewById(R.id.connect); connectBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { mLocationClient.connect(); locationLabel.setText("Got connected...."); } }); // Create the LocationRequest object mLocationClient = new LocationClient(this, this, this); } @Override protected void onStart() { super.onStart(); // Connect the client. mLocationClient.connect(); locationLabel.setText("Got connected...."); } @Override protected void onStop() { // Disconnect the client. mLocationClient.disconnect(); super.onStop(); locationLabel.setText("Got disconnected...."); } @Override public void onConnected(Bundle dataBundle) { // Display the connection status Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show(); } @Override public void onDisconnected() { // Display the connection status Toast.makeText(this, "Disconnected. Please re- connect.",Toast.LENGTH_SHORT).show(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { // Display the error code on failure Toast.makeText(this, "Connection Failure : " + connectionResult.getErrorCode(),Toast.LENGTH_SHORT).show(); } public void displayCurrentLocation() { // Get the current location's latitude & longitude Location currentLocation = mLocationClient.getLastLocation(); String msg = "Current Location: " + Double.toString(currentLocation.getLatitude()) + "," + Double.toString(currentLocation.getLongitude()); // Display the current location in the UI
  • 149. locationLabel.setText(msg); // To display the current address in the UI (new GetAddressTask(this)).execute(currentLocation); } /* * Following is a subclass of AsyncTask which has been used to get * address corresponding to the given latitude & longitude. */ private class GetAddressTask extends AsyncTask<Location, Void, String>{ Context mContext; public GetAddressTask(Context context) { super(); mContext = context; } /* * When the task finishes, onPostExecute() displays the address. */ @Override protected void onPostExecute(String address) { // Display the current address in the UI addressLabel.setText(address); } @Override protected String doInBackground(Location... params) { Geocoder geocoder =new Geocoder(mContext, Locale.getDefault()); // Get the current location from the input parameter list Location loc = params[0]; // Create a list to contain the result address <Address> addresses = null; try { addresses = geocoder.getFromLocation(loc.getLatitude(),loc.getLongitude(), 1); } catch (IOException e1) { Log.e("LocationSampleActivity",IO Exception in getFromLocation()); e1.printStackTrace(); return ("IO Exception trying to get address"); } catch (IllegalArgumentException e2) { // Error message to post in the log String errorString = "Illegal arguments " + Double.toString(loc.getLatitude()) +" , " +Double.toString(loc.getLongitude()) +" passed to address service"; Log.e("LocationSampleActivity", errorString); e2.printStackTrace(); return errorString; } // If the reverse geocode returned an address if (addresses != null && addresses.size() > 0) {
  • 150. // Get the first address Address address = addresses.get(0); /* * Format the first line of address (if available), * city, and country name. */ String addressText = String.format("%s, %s, %s"); // If there's a street address, add it address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "", // Locality is usually a city address.getLocality(), // The country of the address address.getCountryName()); // Return the text return addressText; } else { return "No address found"; } } }// AsyncTask class } Following will be the content of res/layout/activity_main.xml file − <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Location Example" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_below="@+id/textView1" android:layout_alignRight="@+id/imageButton" android:layout_alignEnd="@+id/imageButton" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"
  • 151. android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" /> <Button android:id="@+id/getLocation" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/get_location"/> <Button android:id="@+id/disconnect" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/disconnect"/> <Button android:id="@+id/connect" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/connect"/> <TextView android:id="@+id/locationLabel" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/addressLabel" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> Following will be the content of res/values/strings.xml to define two new constants: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Tutorialspoint</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string name="get_location">Get Location</string> <string name="disconnect">Disconnect Service</string> <string name="connect">Connect Service</string> </resources> Following is the default content of AndroidManifest.xml − <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.Tutorialspoint" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <application
  • 152. android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.Tutorialspoint.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> Let's try to run your Tutorialspoint application. I assume that, you have connected your actual Android Mobile device with your computer. To run the app from Android Studio, open one of your project's activity files and click Run icon from the toolbar. Before starting your application, Android studio installer will display following window to select an option where you want to run your Android application.
  • 153. Now to see location select Get Location Button which will display location information as follows − You can try by disconnecting location client using Disconnect Service and then connecting it by using Connect Service button. You can also modify to get location update as explained above and in Android Official documentation. Android - Sending Email Email is messages distributed by electronic means from one system user to one or more recipients via a network Before starting Email Activity, You must know Email functionality with intent, Intent is carrying data from one component to another component with-in the application or outside the application To send an email from your application, you don’t have to implement an email client from the beginning, but you can use an existing one like the default Email app provided from Android, Gmail, Outlook, K-9 Mail etc. For this purpose, we need to write an Activity that launches an
  • 154. email client, using an implicit Intent with the right action and data. In this example, we are going to send an email from our app by using an Intent object that launches existing email clients. Following section explains different parts of our Intent object required to send an email. Intent Object - Action to send Email You will use ACTION_SEND action to launch an email client installed on your Android device. Following is simple syntax to create an intent with ACTION_SEND action Intent emailIntent = new Intent(Intent.ACTION_SEND); Intent Object - Data/Type to send Email To send an email you need to specify mailto: as URI using setData() method and data type will be to text/plain using setType() method as follows − emailIntent.setData(Uri.parse("mailto:")); emailIntent.setType("text/plain"); Intent Object - Extra to send Email Android has built-in support to add TO, SUBJECT, CC, TEXT etc. fields which can be attached to the intent before sending the intent to a target email client. You can use following extra fields in your email − Sr.No. Extra Data & Description 1 EXTRA_BCC A String[] holding e-mail addresses that should be blind carbon copied. 2 EXTRA_CC A String[] holding e-mail addresses that should be carbon copied. 3 EXTRA_EMAIL A String[] holding e-mail addresses that should be delivered to. 4 EXTRA_HTML_TEXT A constant String that is associated with the Intent, used with ACTION_SEND to supply an alternative to EXTRA_TEXT as HTML formatted text. 5 EXTRA_SUBJECT A constant string holding the desired subject line of a message. 6 EXTRA_TEXT A constant CharSequence that is associated with the Intent, used with ACTION_SEND
  • 155. to supply the literal data to be sent. 7 EXTRA_TITLE A CharSequence dialog title to provide to the user when used with a ACTION_CHOOSER. Here is an example showing you how to assign extra data to your intent − emailIntent.putExtra(Intent.EXTRA_EMAIL , new String[]{"Recipient"}); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "subject"); emailIntent.putExtra(Intent.EXTRA_TEXT , "Message Body"); The out-put of above code is as below shown an image Email Example Example Following example shows you in practical how to use Intent object to launch Email client to send an Email to the given recipients. To Email experimentwiththisexample,youwillneedactual Mobiledevice equippedwithlatestAndroid OS(Androidlollipop),otherwise youmightgetstruggle withemulatorwhichmaynotworkproperly. Secondyouwill needtohave anEmail clientlike GMail(BydefaulteveryandroidversionhavingGmail clientApp) orK9mail installedonyourdevice.
  • 156. Step Description 1 You will use Android studiotocreate an Androidapplicationandname itas Tutorialspointunder a package com.example.tutorialspoint.While creatingthisproject,make sure you TargetSDK and CompileWith at the latestversionof AndroidSDKtouse higherlevelsof APIs. 2 Modify src/MainActivity.java file andaddrequiredcode totake care of sendingemail. 3 ModifylayoutXML file res/layout/activity_main.xmladdanyGUI componentif required.I'm addinga simple buttontolaunchEmail Client. 4 Modify res/values/strings.xmltodefine requiredconstantvalues 5 Modify AndroidManifest.xmlasshownbelow 6 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/com.example.Tutorialspoint/MainActivity.java. package com.example.tutorialspoint; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startBtn = (Button) findViewById(R.id.sendEmail); startBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { sendEmail(); } }); } protected void sendEmail() { Log.i("Send email", ""); String[] TO = {""}; String[] CC = {""}; Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.setData(Uri.parse("mailto:")); emailIntent.setType("text/plain"); emailIntent.putExtra(Intent.EXTRA_EMAIL, TO); emailIntent.putExtra(Intent.EXTRA_CC, CC); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Your subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message goes here");
  • 157. try { startActivity(Intent.createChooser(emailIntent, "Send mail...")); finish(); Log.i("Finished sending email...", ""); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(MainActivity.this, "There is no email client installed.", Toast.LENGTH_SHORT).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } Following will be the content of res/layout/activity_main.xml file − <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sending Mail Example" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_above="@+id/imageButton" android:layout_alignRight="@+id/imageButton" android:layout_alignEnd="@+id/imageButton" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button
  • 158. android:id="@+id/sendEmail" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/compose_email"/> </LinearLayout> Following will be the content of res/values/strings.xml to define two new constants − <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Tutorialspoint</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="compose_email">Compose Email</string> </resources> Following is the default content of AndroidManifest.xml: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.Tutorialspoint" android:versionCode="1" android:versionName="1.0" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.tutorialspoint.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> Let's try to run your tutorialspoint application. I assume you have connected your actual Android Mobile device with your computer. To run the app from Android Studio, open one of your project's activity files and click Run icon from the toolbar. Before starting your application, Android studio installer will display following window to select an option where you want to run your Android application.Select your mobile device as an option and then check your mobile device which will display following screen −
  • 159. Now use Compose Email button to list down all the installed email clients. From the list, you can choose one of email clients to send your email. I'm going to use Gmail client to send my email which will have all the provided defaults fields available as shown below. Here From: will be default email ID you have registered for your Android device.
  • 160. You can modify either of the given default fields and finally use send email button to send your email to the mentioned recipients. Android - Sending SMS In Android, you can use SmsManager API or devices Built-in SMS application to send SMS's. In this tutorial, we shows you two basic examples to send SMS message − SmsManager API SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage("phoneNo", null, "sms message", null, null); Built-in SMS application
  • 161. Intent sendIntent = new Intent(Intent.ACTION_VIEW); sendIntent.putExtra("sms_body", "default content"); sendIntent.setType("vnd.android-dir/mms-sms"); startActivity(sendIntent); Of course, both need SEND_SMS permission. <uses-permission android:name="android.permission.SEND_SMS" /> Apart from the above method, there are few other important functions available in SmsManager class. These methods are listed below − Sr.No. Method & Description 1 ArrayList<String> divideMessage(Stringtext) This method divides a message text into several fragments, none bigger than the maximum SMS message size. 2 static SmsManager getDefault() This method is used to get the default instance of the SmsManager 3 void sendDataMessage(StringdestinationAddress,StringscAddress,shortdestinationPort, byte[]data, PendingIntentsentIntent,PendingIntentdeliveryIntent) This method is used to send a data based SMS to a specific application port. 4 void sendMultipartTextMessage(StringdestinationAddress,StringscAddress, ArrayList<String> parts, ArrayList<PendingIntent>sentIntents,ArrayList<PendingIntent> deliveryIntents) Send a multi-part text based SMS. 5 void sendTextMessage(StringdestinationAddress,StringscAddress,String text,PendingIntent sentIntent,PendingIntentdeliveryIntent) Send a text based SMS. Example Following example shows you in practical how to use SmsManager object to send an SMS to the given mobile number. To experimentwiththisexample,youwillneedactual Mobile deviceequippedwithlatestAndroidOS, otherwise youwillhave tostruggle withemulatorwhichmaynotwork. Step Description 1 You will use AndroidStudioIDEto create an Androidapplicationandname itas tutorialspoint undera package com.example.tutorialspoint.Whilecreatingthisproject,make sure you Target SDK andCompile With at the latestversionof AndroidSDKtouse higherlevelsof APIs. 2 Modify src/MainActivity.java file andaddrequiredcode totake care of sendingemail.
  • 162. 3 ModifylayoutXML file res/layout/activity_main.xmladdanyGUI componentif required.I'm addinga simple GUIto take mobile numberandSMS textto be sentand a simple buttontosend SMS. 4 No needtodefine defaultstringconstantsatres/values/strings.xml.Androidstudiotakescare of defaultconstants. 5 Modify AndroidManifest.xmlasshownbelow 6 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/com.example.tutorialspoint/MainActivity.java. package com.example.tutorialspoint; import android.os.Bundle; import android.app.Activity; import android.telephony.SmsManager; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { Button sendBtn; EditText txtphoneNo; EditText txtMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sendBtn = (Button) findViewById(R.id.btnSendSMS); txtphoneNo = (EditText) findViewById(R.id.editText); txtMessage = (EditText) findViewById(R.id.editText2); sendBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { sendSMSMessage(); } }); } protected void sendSMSMessage() { Log.i("Send SMS", ""); String phoneNo = txtphoneNo.getText().toString(); String message = txtMessage.getText().toString(); try { SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(phoneNo, null, message, null, null); Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show();
  • 163. } catch (Exception e) { Toast.makeText(getApplicationContext(), "SMS faild, please try again.", Toast.LENGTH_LONG).show(); e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } Following will be the content of res/layout/activity_main.xml file: <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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sending SMS Example" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_below="@+id/textView1" android:layout_alignRight="@+id/imageButton" android:layout_alignEnd="@+id/imageButton" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_below="@+id/textView2"
  • 164. android:layout_centerHorizontal="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText" android:hint="Enter Phone Number" android:phoneNumber="true" android:textColorHint="@color/abc_primary_text_material_dark" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText2" android:layout_below="@+id/editText" android:layout_alignLeft="@+id/editText" android:layout_alignStart="@+id/editText" android:textColorHint="@color/abc_primary_text_material_dark" android:layout_alignRight="@+id/imageButton" android:layout_alignEnd="@+id/imageButton" android:hint="Enter SMS" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send Sms" android:id="@+id/btnSendSMS" android:layout_below="@+id/editText2" android:layout_centerHorizontal="true" android:layout_marginTop="48dp" /> </RelativeLayout> Following will be the content of res/values/strings.xml to define two new constants − <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">tutorialspoint</string> <string name="action_settings">Settings</string> </resources> Following is the default content of AndroidManifest.xml: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tutorialspoint" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <uses-permission android:name="android.permission.SEND_SMS" />
  • 165. <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.tutorialspoint.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> Let's try to run your tutorialspoint application. I assume you have connected your actual Android Mobile device with your computer. To run the app from Android studio, open one of your project's activity files and click Run icon from the toolbar. Before starting your application, Android studio installer will display following window to select an option where you want to run your Android application.
  • 166. Now you can enter a desired mobile number and a text message to be sent on that number. Finally click on Send SMS button to send your SMS. Make sure your GSM/CDMA connection is working fine to deliver your SMS to its recipient. You can take a number of SMS separated by comma and then inside your program you will have to parse them into an array string and finally you can use a loop to send message to all the given numbers. That's how you can write your own SMS client. Next section will show you how to use existing SMS client to send SMS. Using Built-in Intent to send SMS You can use Android Intent to send SMS by calling built-in SMS functionality of the Android. Following section explains different parts of our Intent object required to send an SMS. Intent Object - Action to send SMS You will use ACTION_VIEW action to launch an SMS client installed on your Android device. Following is simple syntax to create an intent with ACTION_VIEW action Intent smsIntent = new Intent(Intent.ACTION_VIEW);
  • 167. Intent Object - Data/Type to send SMS To send an SMS you need to specify smsto: as URI using setData() method and data type will be to vnd.android-dir/mms-sms using setType() method as follows − smsIntent.setData(Uri.parse("smsto:")); smsIntent.setType("vnd.android-dir/mms-sms"); Intent Object - Extra to send SMS Android has built-in support to add phone number and text message to send an SMS as follows − smsIntent.putExtra("address" , new String("0123456789;3393993300")); smsIntent.putExtra("sms_body" , "Test SMS to Angilla"); Here addressand sms_bodyare case sensitive andshouldbe specifiedinsmall charactersonly.Youcan specifymore thanone numberinsingle stringbutseparatedbysemi-colon(;). Example Following example shows you in practical how to use Intent object to launch SMS client to send an SMS to the given recipients. To experimentwiththisexample,youwillneedactual Mobile device equippedwithlatestAndroidOS, otherwise youwillhave tostruggle withemulatorwhichmaynotwork. Step Description 1 You will use AndroidstudioIDEto create an Androidapplicationandname itas tutorialspoint undera package com.example.tutorialspoint.Whilecreatingthisproject,make sure you Target SDK andCompile With at the latestversionof AndroidSDKtouse higherlevelsof APIs. 2 Modify src/MainActivity.java file andaddrequiredcode totake care of sendingSMS. 3 ModifylayoutXML file res/layout/activity_main.xmladdanyGUI componentif required.I'm addinga simple buttontolaunchSMS Client. 4 No needtodefine defaultconstants.Androidstudiotakescare of defaultconstants. 5 Modify AndroidManifest.xmlasshownbelow 6 Run the applicationtolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/com.example.tutorialspoint/MainActivity.java. package com.example.tutorialspoint; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.Menu;
  • 168. import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startBtn = (Button) findViewById(R.id.button); startBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { sendSMS(); } }); } protected void sendSMS() { Log.i("Send SMS", ""); Intent smsIntent = new Intent(Intent.ACTION_VIEW); smsIntent.setData(Uri.parse("smsto:")); smsIntent.setType("vnd.android-dir/mms-sms"); smsIntent.putExtra("address" , new String ("01234")); smsIntent.putExtra("sms_body" , "Test "); try { startActivity(smsIntent); finish(); Log.i("Finished sending SMS...", ""); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(MainActivity.this, "SMS faild, please try again later.", Toast.LENGTH_SHORT).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } Following will be the content of res/layout/activity_main.xml file − <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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin"
  • 169. android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Drag and Drop Example" android:id="@+id/textView" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials Point " android:id="@+id/textView2" android:layout_below="@+id/textView" android:layout_centerHorizontal="true" android:textSize="30dp" android:textColor="#ff14be3c" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:src="@drawable/abc" android:layout_marginTop="48dp" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Compose SMS" android:id="@+id/button" android:layout_below="@+id/imageView" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" android:layout_marginTop="54dp" android:layout_alignLeft="@+id/imageView" android:layout_alignStart="@+id/imageView" /> </RelativeLayout> Following will be the content of res/values/strings.xml to define two new constants − <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">tutorialspoint</string> <string name="action_settings">Settings</string> </resources> Following is the default content of AndroidManifest.xml −
  • 170. <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tutorialspoint" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.tutorialspoint.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> Let's try to run your tutorialspoint application. I assume you have connected your actual Android Mobile device with your computer. To run the app from Android studio, open one of your project's activity files and click Run icon from the toolbar. Before starting your application, Android studio will display following window to select an option where you want to run your Android application.
  • 171. Select your mobile device as an option and then check your mobile device which will display following screen:
  • 172. Now use Compose SMS button to launch Android built-in SMS clients which is shown below:
  • 173. You can modify either of the given default fields and finally use send SMS button to send your SMS to the mentioned recipient.
  • 174. Android - Phone Calls Android provides Built-in applications for phone calls, in some occasions we may need to make a phone call through our application. This could easily be done by using implicit Intent with appropriate actions. Also, we can use PhoneStateListener and TelephonyManager classes, in order to monitor the changes in some telephony states on the device. This chapter lists down all the simple steps to create an application which can be used to make a Phone Call. You can use Android Intent to make phone call by calling built-in Phone Call functionality of the Android. Following section explains different parts of our Intent object required to make a call. Intent Object - Action to make Phone Call You will use ACTION_CALL action to trigger built-in phone call functionality available in Android device. Following is simple syntax to create an intent with ACTION_CALL action Intent phoneIntent = new Intent(Intent.ACTION_CALL); You can use ACTION_DIAL action instead of ACTION_CALL, in that case you will have option to modify hardcoded phone number before making a call instead of making a direct call. Intent Object - Data/Type to make Phone Call To make a phone call at a given number 91-000-000-0000, you need to specify tel: as URI using setData() method as follows − phoneIntent.setData(Uri.parse("tel:91-000-000-0000")); The interesting point is that, to make a phone call, you do not need to specify any extra data or data type. Example Following example shows you in practical how to use Android Intent to make phone call to the given mobile number. To experimentwiththisexample,youwillneedactual Mobile deviceequippedwithlatestAndroidOS, otherwise youwillhave to struggle withemulatorwhichmaynotwork. Step Description 1 You will use AndroidstudioIDEto create an Androidapplicationandname itas My Application undera package com.example.saira_000.myapplication.While creatingthisproject,make sure youTarget SDK andCompile With at the latestversionof AndroidSDKtouse higherlevelsof APIs. 2 Modify src/MainActivity.java file andaddrequiredcode totake care of makinga call.
  • 175. 3 ModifylayoutXML file res/layout/activity_main.xmladdanyGUI componentif required.I'm addinga simple buttontoCall 91-000-000-0000 number 4 No needtodefine defaultstringconstants.Androidstudiotakescare of defaultconstants. 5 Modify AndroidManifest.xmlasshownbelow 6 Run the application tolaunchAndroidemulatorandverifythe resultof the changesdone inthe application. Following is the content of the modified main activity file src/MainActivity.java. package com.example.saira_000.myapplication; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.Toast; public class MainActivity extends Activity { Button b1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1=(Button)findViewById(R.id.button); call(); } private void call() { Intent in=new Intent(Intent.ACTION_CALL,Uri.parse("0000000000")); try{ startActivity(in); } catch (android.content.ActivityNotFoundException ex){ Toast.makeText(getApplicationContext(),"yourActivity is not founded",Toast.LENGTH_SHORT).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; }
  • 176. @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } Following will be the content of res/layout/activity_main.xml file − <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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Drag and Drop Example" android:id="@+id/textView" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials Point" android:id="@+id/textView2" android:layout_below="@+id/textView" android:layout_centerHorizontal="true" android:textSize="30dp" android:textColor="#ff14be3c" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:src="@drawable/abc" android:layout_marginTop="48dp" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" />
  • 177. <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Call" android:id="@+id/button" android:layout_below="@+id/imageView" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" android:layout_marginTop="54dp" android:layout_alignLeft="@+id/imageView" android:layout_alignStart="@+id/imageView" /> </RelativeLayout> Following will be the content of res/values/strings.xml to define two new constants − <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Application</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> </resources> Following is the default content of AndroidManifest.xml − <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.saira_000.myapplication" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.saira_000.myapplication.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>
  • 178. Let's try to run your My Application application. I assume you have connected your actual Android Mobile device with your computer. To run the app from Android studio, open one of your project's activity files and click Run icon from the toolbar. Before starting your application, Android studio installer will display following window to select an option where you want to run your Android application. Select your mobile device as an option and then check your mobile device which will display following screen −
  • 179. Now use Call button to make phone call as shown below:
  • 181. Publishing Android Application Android application publishing is a process that makes your Android applications available to users. Infect, publishing is the last phase of the Android application development process. Android development life cycle Once you developed and fully tested your Android Application, you can start selling or distributing free using Google Play (A famous Android marketplace). You can also release your applications by sending them directly to users or by letting users download them from your own website. You can check a detailed publishing process at Android official website, but this tutorial will take you through simple steps to launch your application on Google Play. Here is a simplified check list which will help you in launching your Android application − Step Activity 1 RegressionTestingBefore youpublishyourapplication,youneedtomake sure thatitsmeeting the basic qualityexpectationsforall Androidapps,onall of the devicesthatyouare targeting.So performall the requiredtestingondifferentdevicesincludingphone andtablets. 2 ApplicationRating Whenyou will publishyourapplicationatGoogle Play,youwill have tospecify a contentrating foryour app,whichinformsGoogle Playusersof itsmaturitylevel.Currently available ratingsare (a) Everyone (b) Low maturity(c) Mediummaturity(d) Highmaturity. 3 Targeted RegionsGoogle Playletsyoucontrol whatcountriesandterritorieswhereyour
  • 182. applicationwillbe sold.Accordinglyyoumusttake care of settinguptime zone,localizationor any otherspecificrequirementasper the targetedregion. 4 ApplicationSize Currently,the maximumsizeforanAPKpublishedonGoogle Playis50 MB. If your appexceedsthatsize,orif youwant to offera secondarydownload,youcanuse APK ExpansionFiles,whichGoogle Playwill hostforfree onitsserverinfrastructure andautomatically handle the downloadtodevices. 5 SDK and ScreenCompatibility Itis importanttomake sure that yourapp isdesignedtorun properlyonthe Androidplatformversionsanddevice screensizesthatyouwanttotarget. 6 ApplicationPricing Decidingwhetheryouappwill be free orpaidisimportantbecause,on Google Play,free app'smustremainfree.If youwantto sell yourapplicationthenyouwillhave to specifyitsprice indifferentcurrencies. 7 Promotional Content It isa good marketingpractice tosupplyavarietyof high-qualitygraphic assetsto showcase yourappor brand. Afteryoupublish,theseappearonyourproductdetails page,instore listingsandsearchresults,andelsewhere. 8 Buildand Uploadrelease-readyAPKThe release-readyAPKiswhatyouyouwill uploadtothe DeveloperConsole anddistributetousers.Youcan check complete detailonhow tocreate a release-readyversionof yourapp: PreparingforRelease. 9 Finalize ApplicationDetail Google Playgivesyouavarietyof waysto promote yourapp and engage withusersonyourproduct detailspage,fromcolourful graphics,screenshots,andvideos to localizeddescriptions,releasedetails,andlinkstoyourotherapps.Soyou can decorate your applicationpage andprovide asmuchas clear crispdetail youcan provide. Export Android Application Process Apk development process Before exporting the apps, you must some of tools  Dx tools(Dalvikexecutable tools):Itgoingtoconvert .class file to .dexfile.ithas useful for memoryoptimizationandreduce the boot-upspeedtime  AAPT(Androidassistance packagingtool):ithasuseful toconvert.Dexfile to.Apk  APK(Androidpackagingkit):The final stage of deploymentprocessiscalledas.apk.
  • 183. You will need to export your application as an APK (Android Package) file before you upload it Google Play marketplace. To export an application, just open that application project in Android studio and select Build → Generate Signed APK from your Android studio and follow the simple steps to export your application − Next select, Generate Signed APK option as shown in the above screen shot and then click it so that you get following screen where you will choose Create new keystore to store your application.
  • 184. Enter your key store path,key store password,key alias and key password to protect your application and click on Next button once again. It will display following screen to let you create an application: Once you filled up all the information,like app destination,build type and flavours click finish button While creating an application it will show as below Finally, it will generate your Android Application as APK formate File which will be uploaded at Google Play marketplace. Google Play Registration The most important step is to register with Google Play using Google Play Marketplace. You can use your existing google ID if you have any otherwise you can create a new Google ID and then register with the marketplace. You will have following screen to accept terms and condition.
  • 185. You can use Continue to payment button to proceed to make a payment of $25 as a registration fee and finally to complete your account detail. Once you are a registered user at Google Play, you can upload release-ready APK for your application and finally you will complete application detail using application detail page as mentioned in step 9 of the above mentioned checklist. Signing Your App Manually You do not need Android Studio to sign your app. You can sign your app from the command line using standard tools from the Android SDK and the JDK. To sign an app in release mode from the command line −  Generate a private keyusingkeytool $ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000  Compile yourappinrelease mode to obtainanunsignedAPK  Signyour appwithyour private keyusing jarsigner− $ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name  VerifythatyourAPKissigned.Forexample − $ jarsigner -verify -verbose -certs my_application.apk
  • 186.  Alignthe final APKpackage using zipalign. $ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk Some of App markets  Google play  phoload  APTOiDE 
  • 188. F-Droid  Samsung Galaxy AppStore Android - Alert Dialog Tutorial A Dialog is small window that prompts the user to a decision or enter additional information. Some times in your application, if you wanted to ask the user about taking a decision between yes or no in response of any particular action taken by the user, by remaining in the same activity and without changing the screen, you can use Alert Dialog. In order to make an alert dialog, you need to make an object of AlertDialogBuilder which an inner class of AlertDialog. Its syntax is given below AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); Now you have to set the positive (yes) or negative (no) button using the object of the AlertDialogBuilder class. Its syntax is alertDialogBuilder.setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener) alertDialogBuilder.setNegativeButton(CharSequence text, DialogInterface.OnClickListener listener) Apart from this , you can use other functions provided by the builder class to customize the alert dialog. These are listed below Sr.No Method type & description 1 setIcon(Drawable icon) This method set the icon of the alert dialog box. 2 setCancelable(booleancancel able) This method sets the property that the dialog can be cancelled or not 3 setMessage(CharSequence message)
  • 189. This method sets the message to be displayed in the alert dialog 4 setMultiChoiceItems(CharSequence[]items,boolean[]checkedItems, DialogInterface.OnMultiChoiceClickListenerlistener) This method sets list of items to be displayed in the dialog as the content. The selected option will be notified by the listener 5 setOnCancelListener(DialogInterface.OnCancelListeneronCancelListener) This method Sets the callback that will be called if the dialog is cancelled. 6 setTitle(CharSequence title) This method set the title to be appear in the dialog After creating and setting the dialog builder , you will create an alert dialog by calling the create() method of the builder class. Its syntax is AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show(); This will create the alert dialog and will show it on the screen. Dialog fragment Before enter into an example we should need to know dialog fragment.Dialog fragment is a fragment which can show fragment in dialog box public class DialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the Builder class for convenient dialog construction AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { toast.makeText(this,"enter a text here",Toast.LENTH_SHORT).show(); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { finish(); }); // Create the AlertDialog object and return it return builder.create(); } } }
  • 190. List dialog It has used to show list of items in a dialog box.For suppose, user need to select a list of items or else need to click a item from multiple list of items.At this situation we can use list dialog. public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(Pick a Color) .setItems(R.array.colors_array, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // The 'which' argument contains the index position // of the selected item } }); return builder.create(); } Single-choice list dialog It has used to add single choice list to Dialog box.We can check or uncheck as per user choice. public Dialog onCreateDialog(Bundle savedInstanceState) { mSelectedItems = new ArrayList(); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("This is list choice dialog box"); .setMultiChoiceItems(R.array.toppings, null,new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { if (isChecked) { // If the user checked the item, add it to the selected items mSelectedItems.add(which); } else if (mSelectedItems.contains(which)) { // Else, if the item is already in the array, remove it mSelectedItems.remove(Integer.valueOf(which)); } } }) // Set the action buttons .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { // User clicked OK, so save the mSelectedItems results somewhere // or return them to the component that opened the dialog ... } })
  • 191. .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { ... } }); return builder.create(); } Example The following example demonstrates the use of AlertDialog in android. To experiment with this example , you need to run this on an emulator or an actual device. Steps Description 1 You will use Androidstudiotocreate an Androidapplicationandname itas My Application undera package package com.example.sairamkrishna.myapplication;Whilecreatingthis project,make sure youTarget SDK andCompile Withat the latestversionof AndroidSDKtouse higherlevelsof APIs. 2 Modifysrc/MainActivity.javafile toaddalertdialogcode tolaunchthe dialog. 3 ModifylayoutXML file res/layout/activity_main.xml addanyGUI componentif required. 4 No needto change defaultstringconstants.Androidstudiotakescare of defaultstringsat values/string.xml 9 Run the applicationandchoose arunningandroiddevice andinstall the applicationonitand verifythe results. Here is the modified code of src/MainActivity.java package com.example.sairamkrishna.myapplication; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void open(View view){ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
  • 192. alertDialogBuilder.setMessage("Are you sure,You wanted to make decision"); alertDialogBuilder.setPositiveButton("yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { Toast.makeText(MainActivity.this,"You clicked yes button",Toast.LENGTH_LONG).show(); } }); alertDialogBuilder.setNegativeButton("No",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } Here is the modified code of res/layout/activity_main.xml <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" android:paddingLeft="@dimen/activity_horizontal_margin"
  • 193. android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Alert Dialog" android:id="@+id/textView" android:textSize="35dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorialspoint" android:id="@+id/textView2" android:textColor="#ff3eff0f" android:textSize="35dp" android:layout_below="@+id/textView" android:layout_centerHorizontal="true" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:src="@drawable/logo" android:layout_below="@+id/textView2" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" android:layout_alignLeft="@+id/textView" android:layout_alignStart="@+id/textView" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Alert dialog" android:id="@+id/button" android:layout_below="@+id/imageView" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" android:layout_marginTop="42dp" android:onClick="open" android:layout_alignLeft="@+id/imageView" android:layout_alignStart="@+id/imageView" /> </RelativeLayout> Here is ofStrings.xml <resources> <string name="app_name">My Application</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> </resources>
  • 194. Here is the default code of AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.alertdialog" android:versionCode="1" android:versionName="1.0" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.sairamkrishna.myapplication.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> Let's try to run your application. I assume you have connected your actual Android Mobile device with your computer. To run the app from Android studio, open one of your project's activity files and click Run icon from the toolbar. Before starting your application, ]Android studio will display following window to select an option where you want to run your Android application.
  • 195. Select your an option and then click on it. For suppose, if you have clicked on yes button, then result would as follows
  • 196. if you click on no button it will call finish() and it will close your application.