0% found this document useful (0 votes)
79 views168 pages

UDSM Android App Development Guide

The document provides a comprehensive overview of Android application development, covering topics such as the Android operating system, environment setup, architecture, application components, and development tools. It includes detailed sections on creating applications, managing resources, user interface design, and publishing apps. Additionally, it outlines the history of Android and its features, emphasizing the importance of the Android Software Development Kit (SDK) and various libraries used in development.

Uploaded by

allymnyiwe
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
79 views168 pages

UDSM Android App Development Guide

The document provides a comprehensive overview of Android application development, covering topics such as the Android operating system, environment setup, architecture, application components, and development tools. It includes detailed sections on creating applications, managing resources, user interface design, and publishing apps. Additionally, it outlines the history of Android and its features, emphasizing the importance of the Android Software Development Kit (SDK) and various libraries used in development.

Uploaded by

allymnyiwe
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

ANDROID APP DEVELOPMENT

Table of Contents
Introduction to Android Application Development.................................................................................................. 5
What is Android? .......................................................................................................................................................... 5
Why Android?................................................................................................................................................................ 5
Features of Android ..................................................................................................................................................... 6
Android Applications.................................................................................................................................................... 7
History of Android ....................................................................................................................................................... 7
What is API level? ......................................................................................................................................................... 7
Android - Environment Setup......................................................................................................................................... 9
Set-up Java Development Kit (JDK).......................................................................................................................... 9
Android IDEs................................................................................................................................................................ 10
Android - Architecture .................................................................................................................................................. 11
Linux kernel .................................................................................................................................................................. 11
Libraries ......................................................................................................................................................................... 11
Android Libraries ........................................................................................................................................................ 12
Android Runtime......................................................................................................................................................... 12
Application Framework ............................................................................................................................................. 13
Applications .................................................................................................................................................................. 13
Android - Application Components............................................................................................................................ 14
Activities ........................................................................................................................................................................ 14
Services .......................................................................................................................................................................... 14
Broadcast Receivers ................................................................................................................................................... 15
Content Providers ...................................................................................................................................................... 15
Additional Components ............................................................................................................................................ 15
Android - Hello World Example ................................................................................................................................. 17
Create Android Application ..................................................................................................................................... 17
Anatomy of Android Application ............................................................................................................................ 19
The Main Activity File................................................................................................................................................. 21
The Manifest File ......................................................................................................................................................... 22
The Strings File ............................................................................................................................................................ 23
The Layout File ............................................................................................................................................................ 24
Running the Application............................................................................................................................................. 24
Android Resources Organizing & Accessing ............................................................................................................. 26
Organize resource in Android Studio .................................................................................................................... 26

1|Page
University of Dar es Salaam
Alternative Resources ................................................................................................................................................ 27
Accessing Resources .................................................................................................................................................. 29
Accessing Resources in Code .................................................................................................................................. 29
Accessing Resources in XML ................................................................................................................................... 30
Android - UI Layouts ...................................................................................................................................................... 32
Android Layout Types ............................................................................................................................................... 33
Layout Attributes ........................................................................................................................................................ 34
View Identification ...................................................................................................................................................... 38
Android - UI Controls .................................................................................................................................................... 39
Android UI Controls .................................................................................................................................................. 40
Create UI Controls .................................................................................................................................................... 41
Android - Activities ......................................................................................................................................................... 43
Android - Services ........................................................................................................................................................... 49
Android - Broadcast Receivers .................................................................................................................................... 62
Creating the Broadcast Receiver ............................................................................................................................ 62
Registering Broadcast Receiver ............................................................................................................................... 62
Broadcasting Custom Intents ................................................................................................................................... 64
Android - Content Providers ....................................................................................................................................... 73
Content URIs ............................................................................................................................................................... 73
Create Content Provider .......................................................................................................................................... 74
Android – Fragments ...................................................................................................................................................... 93
Fragment Life Cycle .................................................................................................................................................... 94
How to use Fragments? ............................................................................................................................................. 95
Types of Fragments .................................................................................................................................................... 96
Android - Intents and Filters ......................................................................................................................................... 97
Intent Objects .............................................................................................................................................................. 99
Action ........................................................................................................................................................................ 99
Data ........................................................................................................................................................................... 99
Category ................................................................................................................................................................ 100
Extras ...................................................................................................................................................................... 101
Flags......................................................................................................................................................................... 101
Component Name .............................................................................................................................................. 101
Types of Intents ........................................................................................................................................................ 101
Explicit Intents ...................................................................................................................................................... 102

2|Page
University of Dar es Salaam
Implicit Intents ...................................................................................................................................................... 103
Intent Filters .............................................................................................................................................................. 111
Android - Event Handling ........................................................................................................................................... 123
Event Listeners & Event Handlers ........................................................................................................................ 123
Event Listeners Registration .................................................................................................................................. 124
Touch Mode .............................................................................................................................................................. 124
Focus ........................................................................................................................................................................... 125
onTouchEvent() ........................................................................................................................................................ 125
Event Handling Examples........................................................................................................................................ 126
Android - Styles and Themes ..................................................................................................................................... 133
Defining Styles........................................................................................................................................................... 133
Using Styles ................................................................................................................................................................ 133
Style Inheritance ....................................................................................................................................................... 134
Applying Colors to Theme Attributes ................................................................................................................ 135
Using a Custom Nine-Patch With Buttons........................................................................................................ 136
Android Themes....................................................................................................................................................... 138
Styling the colour palette ....................................................................................................................................... 139
Default Styles & Themes ........................................................................................................................................ 140
Android – Restful API (PHP/MYSQL) ...................................................................................................................... 141
Creating Database.................................................................................................................................................... 141
Creating Tables .................................................................................................................................................... 141
Inserting Values in tables.................................................................................................................................... 142
PHP - GET and POST methods ....................................................................................................................... 142
Android - Connecting MYSQL ............................................................................................................................. 143
Connecting Via Get Method ............................................................................................................................. 143
Connecting Via Post Method ............................................................................................................................ 143
PHP - MYSQL part .............................................................................................................................................. 144
Android Part ......................................................................................................................................................... 145
Publishing Android Application ................................................................................................................................. 161
ANDROID DEVELOPMENT LIFE CYCLE ........................................................................................................ 161
Export Android Application Process................................................................................................................... 162
Google Play Registration ........................................................................................................................................ 165
Signing Your App Manually .................................................................................................................................... 165

3|Page
University of Dar es Salaam
4|Page
University of Dar es Salaam
Introduction to 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.

The source code for Android is available under free and open source software licenses.

Why Android?

5|Page
University of Dar es Salaam
Features of Android
 Android is a powerful operating system with great features. Few of them are listed below –

 Beautiful UI - Android OS basic screen provides a beautiful and intuitive user interface.

 Connectivity - GSM/EDGE, IDEN, CDMA, EV-DO, UMTS, Bluetooth, Wi-Fi, LTE, NFC and
WiMAX.

 Storage - SQLite, a lightweight relational database, is used for data storage purposes.

 Media support - H.263, H.264, MPEG-4 SP, AMR, AMR-WB, AAC, HE-AAC, AAC 5.1,
MP3, MIDI, Ogg Vorbis, WAV, JPEG, PNG, GIF, and BMP.

 Messaging - SMS and MMS

 Web browser - Based on the open-source WebKit layout engine, coupled with Chrome's
V8 JavaScript engine supporting HTML5 and CSS3.

 Multi-touch - Android has native support for multi-touch which was initially made available
in handsets such as the HTC Hero.

 Multi-tasking - User can jump from one task to another and same time various application
can run simultaneously.

 Multi-tasking - User can jump from one task to another and same time various application
can run simultaneously.

 Resizable widgets - Widgets are resizable, so users can expand them to show more
content or shrink them to save space.

 Multi-Language - Supports single direction and bi-directional text.

 GCM - Google Cloud Messaging (GCM) is a service that lets developers send short message
data to their users on Android devices, without needing a proprietary sync solution.

 Wi-Fi Direct - A technology that lets apps discover and pair directly, over a high-bandwidth
peer-to-peer connection.

 Android Beam - A popular NFC-based technology that lets users instantly share, just by
touching two NFC-enabled phones together.

6|Page
University of Dar es Salaam
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.

History of Android
The code names of android ranges from A to N currently, such as Aestro, Blender, Cupcake,
Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream Sandwitch, Jelly Bean, KitKat,
Lollipop and Marshmallow. 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.

7|Page
University of Dar es Salaam
Platform Version API Level VERSION_CODE
Android 6.0 23 MARSHMALLOW
Android 5.1 22 LOLLIPOP_MR1
Android 5.0 21 LOLLIPOP

KitKat for Wearables


Android 4.4W 20 KITKAT_WATCH
Only

Android 4.4 19 KITKAT


Android 4.3 18 JELLY_BEAN_MR2
Android 4.2, 4.2.2 17 JELLY_BEAN_MR1
Android 4.1, 4.1.1 16 JELLY_BEAN
Android 4.0.3, 4.0.4 15 ICE_CREAM_SANDWICH_MR1
Android 4.0, 4.0.1, 4.0.2 14 ICE_CREAM_SANDWICH
Android 3.2 13 HONEYCOMB_MR2
Android 3.1.x 12 HONEYCOMB_MR1
Android 3.0.x 11 HONEYCOMB

Android 2.3.4
10 GINGERBREAD_MR1
Android 2.3.3

Android 2.3.2

9 GINGERBREAD
Android 2.3.1

Android 2.3
Android 2.2.x 8 FROYO
Android 2.1.x 7 ECLAIR_MR1
Android 2.0.1 6 ECLAIR_0_1
Android 2.0 5 ECLAIR
Android 1.6 4 DONUT
Android 1.5 3 CUPCAKE
Android 1.1 2 BASE_1_1
Android 1.0 1 BASE

8|Page
University of Dar es Salaam
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 Studio

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.8.0_102, you would have to put the
following line in your C:\[Link] file.

9|Page
University of Dar es Salaam
set PATH=C:\jdk1.8.0_102\bin;%PATH%
set JAVA_HOME=C:\jdk1.8.0_102

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.8.0_102 and you use the C shell, you would
put the following code into your .cshrc file.
setenv PATH /usr/local/jdk1.8.0_102/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.8.0_102

Alternatively, if you use Android studio, 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(Deprecated)

10 | P a g e
University of Dar es Salaam
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.

11 | P a g e
University of Dar es Salaam
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 −

 [Link] − Provides access to the application model and is the cornerstone of all Android
applications.

 [Link] − Facilitates content access, publishing and messaging between applications and
application components.

 [Link] − Used to access data published by content providers and includes SQLite
database management classes.

 [Link] − A Java interface to the OpenGL ES 3D graphics rendering API.

 [Link] − Provides applications with access to standard operating system services including
messages, system services and inter-process communication.

 [Link] − Used to render and manipulate text on a device display.

 [Link] − The fundamental building blocks of application user interfaces.

 [Link] − A rich collection of pre-built user interface components such as buttons, labels,
list views, layout managers, radio buttons etc.

 [Link] − 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.

12 | P a g e
University of Dar es Salaam
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, and
Games etc.

13 | P a g e
University of Dar es Salaam
Android - Application Components
Application components are the essential building blocks of an Android application. These
components are loosely coupled by the application manifest file [Link] 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 −

[Link] Components & Description

Activities
1
They dictate the UI and handle the user interaction to the smart phone screen.

Services
2
They handle background processing associated with an application.

Broadcast Receivers
3
They handle communication between Android OS and applications.

Content Providers
4
They handle data and database management issues.

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.

14 | P a g e
University of Dar es Salaam
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 BroadcastReceiverclass 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 ContentResolverclass. 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 −

15 | P a g e
University of Dar es Salaam
[Link] Components & Description

Fragments
1
Represents a portion of user interface in an Activity.

Views
2
UI elements that are drawn on-screen including buttons, lists forms etc.

Layouts
3
View hierarchies that control screen format and appearance of the views.

Intents
4
Messages wiring components together.

Resources
5
External elements, such as strings, constants and drawable pictures.

Manifest
6
Configuration file for the application.

16 | P a g e
University of Dar es Salaam
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 earlier sessions.

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 Android studio. When you click
on Android studio icon, it will show screen as shown below

You can start your application development by calling start a new android studio project. in a
new installation frame should ask Application name, package information and location of the
project.−

17 | P a g e
University of Dar es Salaam
After entered application name, it going to be called select the form factors your application
runs on, here need to specify Minimum SDK, in our tutorial, I have declared as API23: Android
6.0(Mashmallow) −

The next level of installation should contain selecting the activity to mobile, it specifies the default
layout for Applications.

18 | P a g e
University of Dar es Salaam
At the final stage it going to be open development tool to write the application code.

Anatomy of Android Application


Before you run your app, you should be aware of a few directories and files in the Android
project −

19 | P a g e
University of Dar es Salaam
[Link]. Folder, File & Description

Java
1 This contains the .java source files for your project. By default, it includes
an [Link] source file having an activity class that runs when your app is launched
using the app icon.

res/drawable-hdpi
2
This is a directory for drawable objects that are designed for high-density screens.

20 | P a g e
University of Dar es Salaam
res/layout
3
This is a directory for files that define your app's user interface.

res/values
4 This is a directory for other various XML files that contain a collection of resources, such as
strings and colours definitions.

[Link]
5 This is the manifest file which describes the fundamental characteristics of the app and defines
each of its components.

[Link]
6 This is an auto generated file which contains compileSdkVersion, buildToolsVersion,
applicationId, minSdkVersion, targetSdkVersion, versionCode and versionName

Following section will give a brief overview of the important application files.

The Main Activity File


The main activity code is a Java file [Link]. 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 [Link];

import [Link];

import [Link];

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].activity_main);

21 | P a g e
University of Dar es Salaam
Here, [Link].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 [Link] 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 −

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="[Link]

package="[Link]">

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity android:name=".MainActivity">

<intent-filter>

<action android:name="[Link]" />

<category android:name="[Link]" />

</intent-filter>

</activity>

</application>

</manifest>

22 | P a g e
University of Dar es Salaam
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 [Link] to indicate that this activity
serves as the entry point for the application. The categoryfor the intent-filter is
named [Link] to indicate that the application can be launched from
the device's launcher icon.

The @string refers to the [Link] file explained below. Hence, @string/app_name refers to
the app_name string defined in the [Link] 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 [Link] 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>

23 | P a g e
University of Dar es Salaam
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="[Link]

xmlns:tools="[Link]

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 [Link] file located in the res/values folder. Hence,
@string/hello_world refers to the hello string defined in the [Link] 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 Android studio, open one of

24 | P a g e
University of Dar es Salaam
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 −

Congratulations!!! you have developed your first Android Application !

25 | P a g e
University of Dar es Salaam
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 chapter will explain you how you can organize your application resources, specify
alternative resources and access them in your applications.

Organize resource in Android Studio


MyProject/
app/
manifest/
[Link]
java/
[Link]
res/
drawable/
[Link]
layout/
activity_main.xml
[Link]
values/
[Link]

[Link]. Directory & Resource Type

1 anim/
XML files that define property animations. They are saved in res/anim/ folder and accessed from
the [Link] class.

2 color/
XML files that define a state list of colors. They are saved in res/color/ and accessed from
the [Link] class.

3 drawable/
Image files like .png, .jpg, .gif or XML files that are compiled into bitmaps, state lists, shapes,
animation drawable. They are saved in res/drawable/ and accessed from the [Link] class.

4 layout/

26 | P a g e
University of Dar es Salaam
XML files that define a user interface layout. They are saved in res/layout/ and accessed from
the [Link] class.

5 menu/
XML files that define application menus, such as an Options Menu, Context Menu, or Sub Menu.
They are saved in res/menu/ and accessed from the [Link] class.

6 raw/
Arbitrary files to save in their raw form. You need to call [Link]() with the
resource ID, which is [Link] to open such raw files.

7 values/
XML files that contain simple values, such as strings, integers, and colors. For example, here are
some filename conventions for resources you can create in this directory −
 [Link] for resource arrays, and accessed from the [Link] class.
 [Link] for resource integers, and accessed from the [Link] class.
 [Link] for resource boolean, and accessed from the [Link] class.
 [Link] for color values, and accessed from the [Link].
 [Link] for dimension values, and accessed from the [Link] class.
 [Link] for string values, and accessed from the [Link] class.
 [Link] for styles, and accessed from the [Link] class.

8 xml/
Arbitrary XML files that can be read at runtime by calling [Link](). You can save various
configuration files here which will be used at run time.

Alternative Resources
Your application should provide alternative resources to support specific device configurations.
For example, you should include alternative drawable resources ( [Link] ) 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

27 | P a g e
University of Dar es Salaam
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.

Example which specifies images for a default screen and alternative images for high resolution
screen.
MyProject/
app/
manifest/
[Link]
java/
[Link]
res/
drawable/
[Link]
[Link]
drawable-hdpi/
[Link]
[Link]
layout/
activity_main.xml
[Link]
values/
[Link]

Below is another example which specifies layout for a default language and alternative layout for
swahili language.
MyProject/
app/
manifest/
[Link]
java/
[Link]
res/
drawable/
[Link]
[Link]
drawable-hdpi/
[Link]
[Link]
layout/
activity_main.xml
[Link]
layout-sw/
[Link]
values/
[Link]

28 | P a g e
University of Dar es Salaam
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 −

Accessing Resources in Code


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/[Link] and set an ImageView you will use following code −

ImageView imageView = (ImageView) findViewById([Link]);

[Link]([Link]);

Here first line of the code make use of [Link] to get ImageView defined with
id myimageview in a Layout file. Second line of code makes use of [Link] to get an
image with name myimage available in drawable sub-directory under /res.
Example

Consider next example where res/values/[Link] 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([Link]);

[Link]([Link]);

Example

Consider a layout res/layout/activity_main.xml with the following definition −

29 | P a g e
University of Dar es Salaam
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="[Link]

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) {

[Link](savedInstanceState);

setContentView([Link].activity_main);

Accessing Resources in XML


Consider the following resource XML res/values/[Link] file that includes a color resource and
a string resource −

<?xml version="1.0" encoding="utf-8"?>

<resources>

30 | P a g e
University of Dar es Salaam
<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="[Link]

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.

31 | P a g e
University of Dar es Salaam
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/ViewGroupobjects 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="[Link]

android:layout_width="fill_parent"

32 | P a g e
University of Dar es Salaam
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 [Link]() callback implementation as shown below −

public void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].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.

[Link] Layout & Description

33 | P a g e
University of Dar es Salaam
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:

[Link] Attribute & Description

1
android:id

This is the ID which uniquely identifies the view.

34 | P a g e
University of Dar es Salaam
2
android:layout_width

This is the width of the layout.

3
android:layout_height

This is the height of the layout

4
android:layout_marginTop

This is the extra space on the top side of the layout.

5
android:layout_marginBottom

This is the extra space on the bottom side of the layout.

6
android:layout_marginLeft

This is the extra space on the left side of the layout.

7
android:layout_marginRight

This is the extra space on the right side of the layout.

8
android:layout_gravity

This specifies how child Views are positioned.

9
android:layout_weight

This specifies how much of the extra space in the layout should be allocated to the View.

10
android:layout_x

This specifies the x-coordinate of the layout.

11
android:layout_y

This specifies the y-coordinate of the layout.

35 | P a g e
University of Dar es Salaam
12
android:layout_width

This is the width of the layout.

13
android:layout_width

This is the width of the layout.

14
android:paddingLeft

This is the left padding filled for the layout.

15
android:paddingRight

This is the right padding filled for the layout.

16
android:paddingTop

This is the top padding filled for the layout.

17
android:paddingBottom

This is the bottom padding filled for the 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

36 | P a g e
University of Dar es Salaam
top 0x30 Push object to the top of its container, not changing its size.

bottom 0x50 Push object to the bottom of its container, not changing its size.

left 0x03 Push object to the left of its container, not changing its size.

right 0x05 Push object to the right of its container, not changing its size.

center_vertical 0x10 Place object in the vertical center of its container, not changing its
size.

fill_vertical 0x70 Grow the vertical size of the object if needed so it completely fills
its container.

center_horizontal 0x01 Place object in the horizontal center of its container, not changing
its size.

fill_horizontal 0x07 Grow the horizontal size of the object if needed so it completely
fills its container.

center 0x11 Place the object in the center of its container in both the vertical
and horizontal axis, not changing its size.

fill 0x77 Grow the horizontal and vertical size of the object if needed so it
completely fills its container.

clip_vertical 0x80 Additional option that can be set to have the top and/or bottom
edges of the child clipped to its container's bounds. The clip will be
based on the vertical gravity: a top gravity will clip the bottom
edge, a bottom gravity will clip the top edge, and neither will clip
both edges.

clip_horizontal 0x08 Additional option that can be set to have the left and/or right
edges of the child clipped to its container's bounds. The clip will be
based on the horizontal gravity: a left gravity will clip the right

37 | P a g e
University of Dar es Salaam
edge, a right gravity will clip the left edge, and neither will clip both
edges.

start 0x00800003 Push object to the beginning of its container, not changing its size.

end 0x00800005 Push object to the end of its container, not changing its size.

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([Link].my_button);

38 | P a g e
University of Dar es Salaam
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="[Link]

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" />

39 | P a g e
University of Dar es Salaam
<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.

[Link]. 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
An ImageButton is an AbsoluteLayout which enables you to specify the exact location of its
children. This shows a button with an image (instead of text) that can be pressed or clicked
by the user.

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

40 | P a g e
University of Dar es Salaam
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="[Link]

41 | P a g e
University of Dar es Salaam
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([Link].text_id);

42 | P a g e
University of Dar es Salaam
Android - Activities
An activity represents a single screen with a user interface just like window or frame of [Link] activity
is the subclass of ContextThemeWrapper class.

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 :
[Link] )

43 | P a g e
University of Dar es Salaam
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.

[Link] Callback & Description

onCreate()
1
This is the first callback and called when the activity is first created.

onStart()
2
This callback is called when the activity becomes visible to the user.

onResume()
3
This is called when the user starts interacting with the application.

onPause()
4 The paused activity does not receive user input and cannot execute any code and called when
the current activity is being paused and the previous activity is being resumed.

onStop()
5
This callback is called when the activity is no longer visible.

onDestroy()
6
This callback is called before the activity is destroyed by the system.

onRestart()
7
This callback is called when the activity restarts after stopping it.

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 –

44 | P a g e
University of Dar es Salaam
Step Description

1 You will use Android studio to create an Android application and name it as HelloWorld under a
package [Link] as explained in the Hello World Example chapter.

2 Modify main activity file [Link] as explained below. Keep rest of the files unchanged.

3 Run the application to launch Android emulator and verify the result of the changes done in the
application.

Following is the content of the modified main activity


file src/[Link]/[Link]. This file includes each of the
fundamental life cycle methods. The Log.d() method has been used to generate log messages

package [Link];

import [Link];

import [Link];

import [Link];

public class MainActivity extends Activity {

String msg = "Android : ";

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].activity_main);

Log.d(msg, "The onCreate() event");

45 | P a g e
University of Dar es Salaam
/** Called when the activity is about to become visible. */

@Override

protected void onStart() {

[Link]();

Log.d(msg, "The onStart() event");

/** Called when the activity has become visible. */

@Override

protected void onResume() {

[Link]();

Log.d(msg, "The onResume() event");

/** Called when another activity is taking focus. */

@Override

protected void onPause() {

[Link]();

Log.d(msg, "The onPause() event");

/** Called when the activity is no longer visible. */

@Override

protected void onStop() {

[Link]();

Log.d(msg, "The onStop() event"); }

/** Called just before the activity is destroyed. */

@Override

46 | P a g e
University of Dar es Salaam
public void onDestroy() {

[Link]();

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([Link].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 [Link] 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:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="[Link]

package="[Link]">

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity android:name=".MainActivity">

<intent-filter>

<action android:name="[Link]" />

<category android:name="[Link]" />

</intent-filter>

</activity>

</application>

47 | P a g e
University of Dar es Salaam
</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 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 Emulator window and you should see following log messages in LogCatwindow in
Android studio −
08-23 10:32:07.682 4480-4480/[Link] D/Android :: The onCreate() event
08-23 10:32:07.683 4480-4480/[Link] D/Android :: The onStart() event
08-23 10:32:07.685 4480-4480/[Link] D/Android :: The onResume() event

Let us try to click lock screen button on the Android emulator and it will generate following
events messages in LogCat window in android studio:
08-23 10:32:53.230 4480-4480/[Link] D/Android :: The onPause() event
08-23 10:32:53.294 4480-4480/[Link] D/Android :: The onStop() event

Let us again try to unlock your screen on the Android emulator and it will generate following
events messages in LogCat window in Android studio:
08-23 10:34:41.390 4480-4480/[Link] D/Android :: The onStart() event
08-23 10:34:41.392 4480-4480/[Link] D/Android :: 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 Android studio and this completes the Activity
Life Cycle for an Android Application.
08-23 10:37:24.806 4480-4480/[Link] D/Android :: The onPause() event
08-23 10:37:25.668 4480-4480/[Link] D/Android :: The onStop() event
08-23 10:37:25.669 4480-4480/[Link] D/Android :: The onDestroy() event

48 | P a g e
University of Dar es Salaam
Android - Services
A service is a component that runs in the background to perform long-running operations without needing
to interact with the user and it works even if application is destroyed. A service can essentially take two
states −

[Link]. State & Description

1
Started

A service is started when an application component, such as an activity, starts it by


calling startService(). Once started, a service can run in the background indefinitely, even if the
component that started it is destroyed.

2
Bound

A service is bound when an application component binds to it by calling bindService(). A


bound service offers a client-server interface that allows components to interact with the
service, send requests, get results, and even do so across processes with interprocess
communication (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 :
[Link] )

49 | P a g e
University of Dar es Salaam
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.

[Link]. Callback & Description

1
onStartCommand()

The system calls this method when another component, such as an activity, requests that the
service be started, by calling startService(). If you implement this method, it is your

50 | P a g e
University of Dar es Salaam
responsibility to stop the service when its work is done, by
calling stopSelf() or stopService() methods.

2
onBind()

The system calls this method when another component wants to bind with the service by
calling bindService(). If you implement this method, you must provide an interface that clients
use to communicate with the service, by returning an IBinder object. You must always
implement this method, but if you don't want to allow binding, then you should return null.

3
onUnbind()

The system calls this method when all clients have disconnected from a particular interface
published by the service.

4
onRebind()

The system calls this method when new clients have connected to the service, after it had
previously been notified that all had disconnected in its onUnbind(Intent).

5
onCreate()

The system calls this method when the service is first created
using onStartCommand() or onBind(). This call is required to perform one-time set-up.

6
onDestroy()

The system calls this method when the service is no longer used and is being destroyed. Your
service should implement this to clean up any resources such as threads, registered listeners,
receivers, etc.

51 | P a g e
University of Dar es Salaam
The following skeleton service demonstrates each of the life cycle methods −

package [Link];

import [Link];

import [Link];

import [Link];

import [Link];

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

52 | P a g e
University of Dar es Salaam
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() {

53 | P a g e
University of Dar es Salaam
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 Android StudioIDE to create an Android application and name it as My
Application under a package [Link] as explained in the Hello World
Example chapter.

2 Modify main activity file [Link] to add startService() and stopService() methods.

3 Create a new java file [Link] under the package [Link] Application. This file will
have implementation of Android service related methods.

4 Define your service in [Link] file using <service.../> tag. An application can have
one or more services without any restrictions.

5 Modify the default content of res/layout/activity_main.xml file to include two buttons in linear
layout.

6 No need to change any constants in res/values/[Link] file. Android studio take care of string
values

7 Run the application to launch Android emulator and verify the result of the changes done in
the application.

Following is the content of the modified main activity file [Link]. This file can
include each of the fundamental life cycle methods. We have
added startService() and stopService() methods to start and stop the service.

54 | P a g e
University of Dar es Salaam
package [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

public class MainActivity extends Activity {

String msg = "Android : ";

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].activity_main);

Log.d(msg, "The onCreate() event");

public void startService(View view) {

startService(new Intent(getBaseContext(), [Link]));

// Method to stop the service

public void stopService(View view) {

55 | P a g e
University of Dar es Salaam
stopService(new Intent(getBaseContext(), [Link]));

Following is the content of [Link]. 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 [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

/**

* Created by Coict7 on 01/19/2018.

*/

public class MyService extends Service {

@Nullable

@Override

public IBinder onBind(Intent intent) {

return null;

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

// Let it continue running until it is stopped.

56 | P a g e
University of Dar es Salaam
[Link](this, "Service Started", Toast.LENGTH_LONG).show();

return START_STICKY;

@Override

public void onDestroy() {

[Link]();

[Link](this, "Service Destroyed", Toast.LENGTH_LONG).show();

Following will the modified content of [Link] file. Here we have added <service.../>
tag to include our service −

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="[Link]

package="[Link]">

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity android:name=".MainActivity">

<intent-filter>

<action android:name="[Link]" />

<category android:name="[Link]" />

57 | P a g e
University of Dar es Salaam
</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="[Link]

xmlns:tools="[Link] 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"

58 | P a g e
University of Dar es Salaam
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"

59 | P a g e
University of Dar es Salaam
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>

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 −

60 | P a g e
University of Dar es Salaam
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 −

To stop the service, you can click the Stop Service button.

61 | P a g e
University of Dar es Salaam
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 BroadcastReceiverclass 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) {

[Link](context, "Intent Detected.", Toast.LENGTH_LONG).show();

Registering Broadcast Receiver


An application listens for specific broadcast intents by registering a broadcast receiver
in [Link] 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.

62 | P a g e
University of Dar es Salaam
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="[Link].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.

63 | P a g e
University of Dar es Salaam
[Link] Event Constant & Description

[Link].BATTERY_CHANGED
1
Sticky broadcast containing the charging state, level, and other information about the battery.

[Link].BATTERY_LOW
2
Indicates low battery condition on the device.

[Link].BATTERY_OKAY
3
Indicates the battery is now okay after being low.

[Link].BOOT_COMPLETED
4
This is broadcast once, after the system has finished booting.

[Link].BUG_REPORT
5
Show activity for reporting a bug.

[Link]
6
Perform a call to someone specified by the data.

[Link].CALL_BUTTON
7 The user pressed the "call" button to go to the dialer or other appropriate UI for placing a
call.

[Link].DATE_CHANGED
8
The date has changed.

[Link]
9
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 Intentyou are
sending stays around after the broadcast is complete.

64 | P a g e
University of Dar es Salaam
public void broadcastIntent(View view) {

Intent intent = new Intent();

[Link]("[Link].CUSTOM_INTENT");

sendBroadcast(intent);

This intent [Link].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="[Link].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 –

65 | P a g e
University of Dar es Salaam
Step Description

1 You will use Android studio to create an Android application and name it as My
Application under a package [Link] as explained in the Hello World
Example chapter.

2 Modify main activity file [Link] to add broadcastIntent()method.

3 Create a new java file called [Link] under the


package [Link] to define a BroadcastReceiver.

4 An application can handle one or more custom and system intents without any restrictions.
Every intent you want to intercept must be registered in your [Link] file using
<receiver.../> tag

5 Modify the default content of res/layout/activity_main.xml file to include a button to broadcast


intent.

6 No need to modify the string file, Android studio take care of [Link] file.

7 Run the application to launch Android emulator and verify the result of the changes done in
the application.

Following is the content of the modified main activity file [Link]. This file can
include each of the fundamental life cycle methods. We have added broadcastIntent() method to
broadcast a custom intent.

package [Link];

import [Link];

import [Link];

import [Link];

import [Link];

66 | P a g e
University of Dar es Salaam
public class MainActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].activity_main);

// broadcast a custom intent.

public void broadcastIntent(View view){

Intent intent = new Intent();

[Link]("[Link].CUSTOM_INTENT"); sendBroadcast(intent);

Following is the content of [Link]:

package [Link];

import [Link];

import [Link];

import [Link];

import [Link];

/**

67 | P a g e
University of Dar es Salaam
* Created by Coict7 on 01/19/2018.

*/

public class MyReceiver extends BroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent) {

[Link](context, "Intent Detected.", Toast.LENGTH_LONG).show();

Following will the modified content of [Link] file. Here we have added
<receiver.../> tag to include our service:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="[Link]

package="[Link]">

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity android:name=".MainActivity">

<intent-filter>

<action android:name="[Link]" />

<category android:name="[Link]" />

</intent-filter>

68 | P a g e
University of Dar es Salaam
</activity>

<receiver android:name="MyReceiver">

<intent-filter>

<action android:name="[Link].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="[Link]

xmlns:tools="[Link]

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"

69 | P a g e
University of Dar es Salaam
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"

70 | P a g e
University of Dar es Salaam
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>

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 "[Link].CUSTOM_INTENT"which will be intercepted by our

71 | P a g e
University of Dar es Salaam
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.

72 | P a g e
University of Dar es Salaam
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
sometimes it is required to share data across applications. This is where content providers
become 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>

73 | P a g e
University of Dar es Salaam
Here is the detail of various parts of the URI −

[Link] Part & Description

prefix
1
This is always set to content://

authority
2 This specifies the name of the content provider, for example contacts, browser etc. For third-
party content providers, this could be the fully qualified name, such as [Link]

data_type

3 This indicates the type of data that this particular provider provides. For example, if you are
getting all the contacts from the Contactscontent provider, then the data path would
be people and URI would look like thiscontent://contacts/people

id

4 This specifies the specific record requested. For example, if you are looking for contact
number 5 in the Contacts content provider then URI would look like
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 −

74 | P a g e
University of Dar es Salaam
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 Android StudioIDE to create an Android application and name it as My
Application under a package [Link], with blank Activity.

2 Modify main activity file [Link] to add two new


methods onClickAddName() and onClickRetrieveStudents().

3 Create a new java file called [Link] under the


package [Link] to define your actual provider and associated methods.

75 | P a g e
University of Dar es Salaam
4 Register your content provider in your [Link] file using <provider.../> tag

5 Modify the default content of res/layout/activity_main.xml file to include a small GUI to add
students records.

6 No need to change [Link] studio take care of [Link] file.

7 Run the application to launch Android emulator and verify the result of the changes done in
the application.

Following is the content of the modified main activity


file src/[Link]/[Link]. 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 [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

76 | P a g e
University of Dar es Salaam
import [Link];

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].activity_main);

public void onClickAddName(View view) {

// Add a new student record

ContentValues values = new ContentValues();

[Link]([Link],

((EditText)findViewById([Link].editText2)).getText().toString());

[Link]([Link],

((EditText)findViewById([Link].editText3)).getText().toString());

Uri uri = getContentResolver().insert(

StudentsProvider.CONTENT_URI, values);

[Link](getBaseContext(),

[Link](), Toast.LENGTH_LONG).show();

public void onClickRetrieveStudents(View view) {

// Retrieve student records

String URL = "content://[Link]";

77 | P a g e
University of Dar es Salaam
Uri students = [Link](URL);

Cursor c = managedQuery(students, null, null, null, "name");

if ([Link]()) {

do{

[Link](this,

[Link]([Link](StudentsProvider._ID)) +

", " + [Link]([Link]( [Link])) +

", " + [Link]([Link]( [Link])),

Toast.LENGTH_SHORT).show();

} while ([Link]());

Create new file [Link] under [Link] and following is


the content of src/[Link]/[Link] −

package [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

78 | P a g e
University of Dar es Salaam
import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

public class StudentsProvider extends ContentProvider {

static final String PROVIDER_NAME = "[Link]";

static final String URL = "content://" + PROVIDER_NAME + "/students";

static final Uri CONTENT_URI = [Link](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);

[Link](PROVIDER_NAME, "students", STUDENTS);

[Link](PROVIDER_NAME, "students/#", STUDENT_ID);

79 | P a g e
University of Dar es Salaam
}

/**

* 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) {

80 | P a g e
University of Dar es Salaam
[Link](CREATE_DB_TABLE);

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

[Link]("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 = [Link]();

return (db == null)? false:true;

@Override

public Uri insert(Uri uri, ContentValues values) {

/**

* Add a new student record

81 | P a g e
University of Dar es Salaam
*/

long rowID = [Link]( STUDENTS_TABLE_NAME, "", values);

/**

* If record is added successfully

*/

if (rowID > 0) {

Uri _uri = [Link](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();

[Link](STUDENTS_TABLE_NAME);

switch ([Link](uri)) {

case STUDENTS:

[Link](STUDENTS_PROJECTION_MAP);

break;

case STUDENT_ID:

[Link]( _ID + "=" + [Link]().get(1));

82 | P a g e
University of Dar es Salaam
break;

default:

if (sortOrder == null || sortOrder == ""){

/**

* By default sort on student names

*/

sortOrder = NAME;

Cursor c = [Link](db, projection, selection,

selectionArgs,null, null, sortOrder);

/**

* register to watch a content URI for changes

*/

[Link](getContext().getContentResolver(), uri);

return c;

@Override

public int delete(Uri uri, String selection, String[] selectionArgs) {

int count = 0;

switch ([Link](uri)){

case STUDENTS:

count = [Link](STUDENTS_TABLE_NAME, selection, selectionArgs);

break;

83 | P a g e
University of Dar es Salaam
case STUDENT_ID:

String id = [Link]().get(1);

count = [Link]( STUDENTS_TABLE_NAME, _ID + " = " + id +

(![Link](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 ([Link](uri)) {

case STUDENTS:

count = [Link](STUDENTS_TABLE_NAME, values, selection, selectionArgs);

break;

case STUDENT_ID:

count = [Link](STUDENTS_TABLE_NAME, values,

_ID + " = " + [Link]().get(1) +

(![Link](selection) ? "

84 | P a g e
University of Dar es Salaam
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 ([Link](uri)){

/**

* Get all student records

*/

case STUDENTS:

return "[Link]/[Link]";

/**

* Get a particular student

*/

case STUDENT_ID:

return "[Link]/[Link]";

default:

throw new IllegalArgumentException("Unsupported URI: " + uri);

85 | P a g e
University of Dar es Salaam
}

Following will the modified content of [Link] file. Here we have added
<provider.../> tag to include our content provider:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="[Link]

package="[Link]">

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity android:name=".MainActivity">

<intent-filter>

<action android:name="[Link]" />

<category android:name="[Link]" />

</intent-filter>

</activity>

<provider android:name="StudentsProvider"

android:authorities="[Link]"/>

</application>

</manifest>

Following will be the content of res/layout/activity_main.xml file−

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="[Link]

86 | P a g e
University of Dar es Salaam
xmlns:tools="[Link]

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="[Link]">

<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" />

87 | P a g e
University of Dar es Salaam
<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" />

88 | P a g e
University of Dar es Salaam
<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"

89 | P a g e
University of Dar es Salaam
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/[Link] file:

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="app_name">My Application</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 −

90 | P a g e
University of Dar es Salaam
Now let's enter student Name and Grade and finally click on Add Namebutton, 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.

91 | P a g e
University of Dar es Salaam
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 [Link] 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.

92 | P a g e
University of Dar es Salaam
Android – Fragments
A Fragment is a piece of an activity which enable more modular activity design. It will not be wrong if we
say, a fragment is a kind of 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-pane 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.

93 | P a g e
University of Dar es Salaam
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.

94 | P a g e
University of Dar es Salaam
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 [Link] 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.

95 | P a g e
University of Dar es Salaam
 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.

96 | P a g e
University of Dar es Salaam
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 intent itself, an Intent object, is a passive data structure holding an abstract description of
an operation to 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, [Link]("[Link]

[Link](Intent.EXTRA_EMAIL, recipients);

[Link](Intent.EXTRA_SUBJECT, [Link]().toString());

[Link](Intent.EXTRA_TEXT, [Link]().toString());

startActivity([Link](email, "Choose an email client from..."));

Above syntax is calling startActivity method to start an email activity and result should be as
shown below −

97 | P a g e
University of Dar es Salaam
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 = "coict";

Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );

[Link]([Link], q);

startActivity(intent);

Above example will search as coict on android search engine and it gives the result of coict in
your an activity

There are separate mechanisms for delivering intents to each type of component − activities,
services, and broadcast receivers.

[Link] Method & Description

[Link]()
1
The Intent object is passed to this method to launch a new activity or get an existing activity
to do something new.

[Link]()
2
The Intent object is passed to this method to initiate a service or deliver new instructions to
an ongoing service.

[Link]()
3
The Intent object is passed to this method to deliver the message to all interested broadcast
receivers.

98 | P a g e
University of Dar es Salaam
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 is not specified for the intent filter, all the other URI attributes are ignored.

 If a host is not specified for the filter, the port attribute and all the path attributes are 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 −

[Link]. Action/Data Pair & Description

ACTION_VIEW content://contacts/people/1
1
Display information about the person whose identifier is "1".

ACTION_DIAL content://contacts/people/1
2
Display the phone dialer with the person filled in.

99 | P a g e
University of Dar es Salaam
ACTION_VIEW [Link]
3
Display the phone dialer with the given number filled in.

ACTION_DIAL [Link]
4
Display the phone dialer with the given number filled in.

ACTION_EDIT content://contacts/people/1
5
Edit information about the person whose identifier is "1".

ACTION_VIEW content://contacts/people/
6
Display a list of people, which the user can browse through.

ACTION_SET_WALLPAPER
7
Show settings for choosing wallpaper

ACTION_SYNC
8
It going to be synchronous the data,Constant Value is [Link]

ACTION_SYSTEM_TUTORIAL
9
It will start the platform-defined tutorial(Default tutorial or start up tutorial)

ACTION_TIMEZONE_CHANGED
10
It intimates when time zone has changed

ACTION_UNINSTALL_PACKAGE
11
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. 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.

100 | P a g e
University of Dar es Salaam
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.

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.

[Link] Flags & Description

FLAG_ACTIVITY_CLEAR_TASK

1 If set in an Intent passed to [Link](), 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.

FLAG_ACTIVITY_CLEAR_TOP

2 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.

FLAG_ACTIVITY_NEW_TASK

3 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.

Component Name
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

101 | P a g e
University of Dar es Salaam
Explicit Intents
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([Link], [Link]);

// Starts TargetActivity

102 | P a g e
University of Dar es Salaam
startActivity(i);

Implicit Intents
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();
[Link]([Link].ACTION_VIEW);
[Link]([Link].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 = [Link]("Key1");

String value2 = [Link]("Key2");

103 | P a g e
University of Dar es Salaam
Example

Following example shows the functionality of a Android Intent to launch various Android built-
in applications.

Step Description

1 You will use Android studio IDE to create an Android application and name it as My
Application under a package [Link].saira_000.myapplication.

2 Modify src/main/java/[Link] file and add the code to define two listeners
corresponding two buttons ie. Start Browser and Start Phone.

3 Modify layout XML file res/layout/activity_main.xml to add three buttons in linear layout.

4 Run the application to launch Android emulator and verify the result of the changes done in
the application.

Following is the content of the modified main activity file src/[Link]


Application/[Link].

package [Link].saira_000.myapplication;

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

public class MainActivity extends AppCompatActivity {

Button b1,b2;

104 | P a g e
University of Dar es Salaam
@Override

protected void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].activity_main);

b1=(Button)findViewById([Link]);

[Link](new [Link]() {

@Override

public void onClick(View v) {

Intent i = new Intent([Link].ACTION_VIEW,

[Link]("[Link]

startActivity(i);

});

b2=(Button)findViewById([Link].button2);

[Link](new [Link]() {

@Override

public void onClick(View v) {

Intent i = new Intent([Link].ACTION_VIEW,

[Link]("[Link]

startActivity(i);

});

105 | P a g e
University of Dar es Salaam
Following will be the content of res/layout/activity_main.xml file −

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="[Link]

xmlns:tools="[Link]

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"

106 | P a g e
University of Dar es Salaam
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"

107 | P a g e
University of Dar es Salaam
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/[Link] to define two new constants −

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="app_name">My Applicaiton</string>

</resources>

Following is the default content of [Link] −

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="[Link]

package="[Link].saira_000.myapplication">

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

108 | P a g e
University of Dar es Salaam
android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity android:name=".MainActivity">

<intent-filter>

<action android:name="[Link]" />

<category android:name="[Link]" />

</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 [Link] 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 −

109 | P a g e
University of Dar es Salaam
Now click on Start Browser button, which will start a browser configured and display
[Link] as shown below −

Similar way you can launch phone interface using Start Phone button, which will allow you to
dial already given phone number.

110 | P a g e
University of Dar es Salaam
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 [Link] file to specify an


activity [Link] [Link] 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="[Link]" />

<action android:name="[Link] [Link]" />

<category android:name="[Link]" />

<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 [Link], or using
the [Link] [Link] action provided their category
is [Link].

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 "[Link]

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 −

111 | P a g e
University of Dar es Salaam
 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 android studio to create an Android application and name it as My
Application under a package [Link];.

2 Modify src/Main/Java/[Link] file and add the code to define three listeners
corresponding to three buttons defined in layout file.

3 Add a new src/Main/Java/[Link] file to have one custom activity which will be
invoked by different intents.

4 Modify layout XML file res/layout/activity_main.xml to add three buttons in linear layout.

5 Add one layout XML file res/layout/custom_view.xml to add a simple <TextView> to show the
passed data through intent.

112 | P a g e
University of Dar es Salaam
6 Modify [Link] to add <intent-filter> to define rules for your intent to invoke
custom activity.

7 Run the application to launch Android emulator and verify the result of the changes done in
the application.

Following is the content of the modified main activity file src/[Link].

package [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

public class MainActivity extends AppCompatActivity {

Button b1,b2,b3;

@Override

protected void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].activity_main);

b1=(Button)findViewById([Link]);

[Link](new [Link]() {

@Override

public void onClick(View v) {

Intent i = new Intent([Link].ACTION_VIEW,

[Link]("[Link]

113 | P a g e
University of Dar es Salaam
startActivity(i);

});

b2 = (Button)findViewById([Link].button2);

[Link](new [Link]() {

@Override

public void onClick(View v) {

Intent i = new Intent("[Link].

[Link].

LAUNCH",[Link]("[Link]

startActivity(i);

});

b3 = (Button)findViewById([Link].button3);

[Link](new [Link]() {

@Override

public void onClick(View v) {

Intent i = new Intent("[Link].

My [Link]",

[Link]("[Link]

startActivity(i);

});

114 | P a g e
University of Dar es Salaam
Following is the content of the modified main activity file src/[Link]
Application/[Link].

package [Link];

import [Link];

import [Link];

import [Link];

import [Link];

/**

* Created by Coict7 on 01/19/2018.

*/

public class CustomActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].custom_view);

TextView label = (TextView) findViewById([Link].show_data);

Uri url = getIntent().getData();

[Link]([Link]());

Following will be the content of res/layout/activity_main.xml file −

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

xmlns:android="[Link]

xmlns:tools="[Link]

115 | P a g e
University of Dar es Salaam
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="[Link]">

<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

116 | P a g e
University of Dar es Salaam
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_alignLeft="@+id/imageButton"

android:layout_alignStart="@+id/imageButton"

android:layout_alignEnd="@+id/imageButton" />

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

117 | P a g e
University of Dar es Salaam
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_alignEnd="@+id/button" />

<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_toStartOf="@+id/editText"

android:layout_alignParentEnd="true" />

</RelativeLayout>

Following will be the content of res/layout/custom_view.xml file −

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="[Link]

android:orientation="vertical" android:layout_width="match_parent"

android:layout_height="match_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/[Link] to define two new constants −

118 | P a g e
University of Dar es Salaam
<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="app_name">My Application</string>

</resources>

Following is the default content of [Link] −

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="[Link]

package="[Link]">

<application

android:allowBackup = "true"

android:icon = "@mipmap/ic_launcher"

android:label = "@string/app_name"

android:supportsRtl = "true"

android:theme = "@style/AppTheme">

<activity android:name = ".MainActivity">

<intent-filter>

<action android:name = "[Link]" />

<category android:name = "[Link]" />

</intent-filter>

</activity>

<activity android:name="[Link]">

<intent-filter>

<action android:name = "[Link]" />

<action android:name = "[Link]" />

119 | P a g e
University of Dar es Salaam
<category android:name = "[Link]" />

<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 −

120 | P a g e
University of Dar es Salaam
Now let's start with first button "Start Browser with VIEW Action". Here we have defined our
custom activity with a filter "[Link]", 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 [Link]
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 −

121 | P a g e
University of Dar es Salaam
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 httpsinstead of http though we are giving a correct action, so
Android raises an exception and shows following screen −

122 | P a g e
University of Dar es Salaam
Android - Event Handling
Events are a useful way to collect data about a user's interaction with interactive components
of [Link] 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

OnClickListener()
onClick() 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.

OnLongClickListener()

onLongClick() 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.

OnFocusChangeListener()

onFocusChange() 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.

OnFocusChangeListener()

onKey() 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.

123 | P a g e
University of Dar es Salaam
OnTouchListener()

onTouch() 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.

OnMenuItemClickListener()
onMenuItemClick() This is called when the user selects a menu item. You will use
onMenuItemClick() event handler to handle such event.

onCreateContextMenuItemListener()
onCreateContextMenu() 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
[Link] the screen puts the device into touch mode. The user can then interact with it
by touching the on-screen virtual buttons, images, [Link] can check if the device is in touch
mode by calling the View class’s isInTouchMode() method.

124 | P a g e
University of Dar es Salaam
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([Link]()){

case TOUCH_DOWN:

[Link](this,"you have clicked down Touch button",Toast.LENTH_LONG).show();

break();

case TOUCH_UP:

[Link](this,"you have clicked up touch button",Toast.LENTH_LONG).show();

break;

case TOUCH_MOVE:

[Link](this,"you have clicked move touch button"Toast.LENTH_LONG).show();

break;

return [Link](event) ;

125 | P a g e
University of Dar es Salaam
Event Handling Examples

Event Listeners Registration Using an Anonymous Inner Class

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 Android studio IDE to create an Android application and name it
as myapplication under a package [Link] as explained in the Hello World
Example chapter.

2 Modify src/[Link] file to add click event listeners and handlers for the two buttons
defined.

3 Modify the detault content of res/layout/activity_main.xml file to include Android UI controls.

4 No need to declare default string [Link] studio takes care default constants.

5 Run the application to launch Android emulator and verify the result of the changes done in
the aplication.

Following is the content of the modified main activity


file src/[Link]/[Link]. This file can include each of the
fundamental lifecycle methods.

126 | P a g e
University of Dar es Salaam
package [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

public class MainActivity extends ActionBarActivity {

private ProgressDialog progress;

Button b1,b2;

@Override

protected void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].activity_main);

progress = new ProgressDialog(this);

b1=(Button)findViewById([Link]);

b2=(Button)findViewById([Link].button2);

[Link](new [Link]() {

@Override

public void onClick(View v) {

TextView txtView = (TextView) findViewById([Link]);

[Link](25);

127 | P a g e
University of Dar es Salaam
});

[Link](new [Link]() {

@Override

public void onClick(View v) {

TextView txtView = (TextView) findViewById([Link]);

[Link](55);

});

Following will be the content of res/layout/activity_main.xml file −


Here abc indicates about coict logo

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

xmlns:android="[Link]

xmlns:tools="[Link]

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

128 | P a g e
University of Dar es Salaam
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

129 | P a g e
University of Dar es Salaam
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/[Link] to define two new constants −

130 | P a g e
University of Dar es Salaam
<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="app_name">myapplication</string>

</resources>

Following is the default content of [Link] −

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="[Link]

package="[Link]" >

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name="[Link]"

android:label="@string/app_name" >

<intent-filter>

<action android:name="[Link]" />

<category android:name="[Link]" />

</intent-filter>

</activity>

</application>

131 | P a g e
University of Dar es Salaam
</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.

132 | P a g e
University of Dar es Salaam
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 for the <item> can be a keyword string, a hex color, a reference to another resource type, or
other value depending on the style property.

Using Styles
Once your style is defined, you can use it in your XML Layout file using styleattribute as follows

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="[Link]

133 | P a g e
University of Dar es Salaam
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>

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/[Link] and add the


following −

<resources>

...

<style name="MyCustomTheme" parent="android:style/Theme">

<item name="android:textColorPrimary">#ffff0000</item>

</style>

...

</resources>

In your [Link] apply the theme to the activities you want to style −

<activity

android:name="[Link]"

134 | P a g e
University of Dar es Salaam
...

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 <item> elements to your custom theme.
These attributes are defined in your [Link] file. For example, to apply the custom color to
the window background, add the following two <item> elements to your custom theme, defined
in MyAndroidApp/res/values/[Link] file −

<resources>

...

<style name="MyCustomTheme" ...>

<item name="android:windowBackground">@color/my_custom_color</item>

135 | P a g e
University of Dar es Salaam
<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


Steps to create Nine-Patch Buttons

 Save this bitmap as /res/drawable/my_nine_patch.[Link]

136 | P a g e
University of Dar es Salaam
 Define a new style

 Apply the new button style to the buttonStyle attribute of your custom theme

Define a new Style

<resources>

...

<style name="MyCustomButton" parent="android:[Link]">

<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>

137 | P a g e
University of Dar es Salaam
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 [Link] 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 −

138 | P a g e
University of Dar es Salaam
<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:[Link]">

...

</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 [Link] file,Which has placed at res/values/

<resource>

139 | P a g e
University of Dar es Salaam
<style name="AppTheme" parent="android:[Link]">

<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 [Link] 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/[Link]". You can see the
following source code for Android styles and themes −

 Android Styles ([Link])

 Android Themes ([Link])

140 | P a g e
University of Dar es Salaam
Android – Restful API (PHP/MYSQL)
In this chapter, we are going to explain, how you can integrate PHP and MYSQL with your
android application. This is very useful in case you have a webserver, and you want to access its
data on your android application.

MYSQL is used as a database at the webserver and PHP is used to fetch data from the database.
Our application will communicate with the PHP page with necessary parameters and PHP will
contact MYSQL database and will fetch the result and return the results to us.

Creating Database
MYSQL database can be created easily using this simple script. The CREATE
DATABASE statement creates the database.

<?php

$con=mysqli_connect("[Link]","username","password");

$sql="CREATE DATABASE my_db";

if (mysqli_query($con,$sql)) {

echo "Database my_db created successfully";

?>

Creating Tables
Once database is created, its time to create some tables in the database. The CREATE
TABLE statement creates the database.

<?php

$con=mysqli_connect("[Link]","username","password","my_db");

$sql="CREATE TABLE table1(Username CHAR(30),Password CHAR(30),Role CHAR(30))";

if (mysqli_query($con,$sql)) {

echo "Table have been created successfully";

?>

141 | P a g e
University of Dar es Salaam
Inserting Values in tables
When the database and tables are created. Now its time to insert some data into the tables.
The Insert Into statement creates the database.

<?php

$con=mysqli_connect("[Link]","username","password","my_db");

$sql="INSERT INTO table1 (FirstName, LastName, Age) VALUES ('admin', 'admin','adminstrator')";

if (mysqli_query($con,$sql)) {

echo "Values have been inserted successfully";

?>

PHP - GET and POST methods


PHP is also used to fetch the record from the mysql database once it is created. In order to
fetch record some information must be passed to PHP page regarding what record to be fetched.

The first method to pass information is through GET method in which $_GETcommand is used.
The variables are passed in the url and the record is fetched. Its syntax is given below −

<?php

$con=mysqli_connect("[Link]","username","password","database name");

if (mysqli_connect_errno($con)) {

echo "Failed to connect to MySQL: " . mysqli_connect_error();

$username = $_GET['username'];

$password = $_GET['password'];

$result = mysqli_query($con,"SELECT Role FROM table1 where Username='$username'

and Password='$password'");

$row = mysqli_fetch_array($result);

$data = $row[0];

142 | P a g e
University of Dar es Salaam
if($data){

echo $data;

mysqli_close($con);

?>

The second method is to use POST method. The only change in the above script is to replace
$_GET with $_POST. In Post method, the variables are not passed through URL.

Android - Connecting MYSQL


Connecting Via Get Method
There are two ways to connect to MYSQL via PHP page. The first one is called Get method.
We will use HttpGet and HttpClient class to connect. Their syntax is given below −

URL url = new URL(link);

HttpClient client = new DefaultHttpClient();

HttpGet request = new HttpGet();

[Link](new URI(link));

After that you need to call execute method of HttpClient class and receive it in a HttpResponse
object. After that you need to open streams to receive the data.

HttpResponse response = [Link](request);

BufferedReader in = new BufferedReader

(new InputStreamReader([Link]().getContent()));

Connecting Via Post Method


In the Post method, the URLEncoder,URLConnection class will be used. The urlencoder
will encode the information of the passing variables. It's syntax is given below −

URL url = new URL(link);

String data = [Link]("username", "UTF-8")

143 | P a g e
University of Dar es Salaam
+ "=" + [Link](username, "UTF-8");

data += "&" + [Link]("password", "UTF-8")

+ "=" + [Link](password, "UTF-8");

URLConnection conn = [Link]();

The last thing you need to do is to write this data to the link. After writing, you need to open
stream to receive the responded data.

OutputStreamWriter wr = new OutputStreamWriter([Link]());

[Link]( data );

BufferedReader reader = new BufferedReader(new

InputStreamReader([Link]()));

Example

The below example is a complete example of connecting your android application with MYSQL
database via PHP page. It creates a basic application that allows you to login using GET and POST
method.

PHP - MYSQL part


In this example a database with the name of temp has been created at [Link]. In that
database, a table has been created with the name of table1. This table has three fields.
(Username, Password, Role). The table has only one record which is
("admin","admin","administrator").

The php page has been given below which takes parameters by post method.

<?php

$con=mysqli_connect("[Link]","username","password","db_name");

if (mysqli_connect_errno($con)) {

echo "Failed to connect to MySQL: " . mysqli_connect_error();

$username = $_POST['username'];

144 | P a g e
University of Dar es Salaam
$password = $_POST['password'];

$result = mysqli_query($con,"SELECT Role FROM table1 where

Username='$username' and Password='$password'");

$row = mysqli_fetch_array($result);

$data = $row[0];

if($data){

echo $data;

mysqli_close($con);

?>

Android Part
To experiment with this example , you need to run this on an actual device on which wifi internet
is connected.

Steps Description

1 You will use Android studio IDE to create an Android application and name it as PHPMYSQL
under a package [Link].

2 Modify src/[Link] file to add Activity code.

3 Create src/[Link] file to add PHPMYSQL code.

4 Modify layout XML file res/layout/activity_main.xml add any GUI component if required.

5 Modify res/values/[Link] file and add necessary string components.

145 | P a g e
University of Dar es Salaam
6 Modify [Link] to add necessary permissions.

7 Run the application and choose a running android device and install the application on it and
verify the results.

Here is the content of src/[Link]/[Link].

package [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

public class MainActivity extends Activity {

private EditText usernameField,passwordField;

private TextView status,role,method;

@Override

protected void onCreate(Bundle savedInstanceState) {

[Link](savedInstanceState);

setContentView([Link].activity_main);

usernameField = (EditText)findViewById([Link].editText1);

passwordField = (EditText)findViewById([Link].editText2);

status = (TextView)findViewById([Link].textView6);

role = (TextView)findViewById([Link].textView7);

method = (TextView)findViewById([Link].textView9);

146 | P a g e
University of Dar es Salaam
}

public void login(View view){

String username = [Link]().toString();

String password = [Link]().toString();

[Link]("Get Method");

new SigninActivity(this,status,role,0).execute(username,password);

public void loginPost(View view){

String username = [Link]().toString();

String password = [Link]().toString();

[Link]("Post Method");

new SigninActivity(this,status,role,1).execute(username,password);

Here is the content of src/[Link]/[Link].

package [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

147 | P a g e
University of Dar es Salaam
import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

import [Link];

public class SigninActivity extends AsyncTask{

private TextView statusField,roleField;

private Context context;

private int byGetOrPost = 0;

//flag 0 means get and 1 means post.(By default it is get.)

public SigninActivity(Context context,TextView statusField,TextView roleField,int flag) {

[Link] = context;

[Link] = statusField;

[Link] = roleField;

byGetOrPost = flag;

protected void onPreExecute(){

@Override

protected String doInBackground(String... arg0) {

if(byGetOrPost == 0){ //means by Get Method

148 | P a g e
University of Dar es Salaam
try{

String username = (String)arg0[0];

String password = (String)arg0[1];

String link = "[Link]


password="+password;

URL url = new URL(link);

HttpClient client = new DefaultHttpClient();

HttpGet request = new HttpGet();

[Link](new URI(link));

HttpResponse response = [Link](request);

BufferedReader in = new BufferedReader(new

InputStreamReader([Link]().getContent()));

StringBuffer sb = new StringBuffer("");

String line="";

while ((line = [Link]()) != null) {

[Link](line);

break;

[Link]();

return [Link]();

} catch(Exception e){

return new String("Exception: " + [Link]());

} else{

try{

149 | P a g e
University of Dar es Salaam
String username = (String)arg0[0];

String password = (String)arg0[1];

String link="[Link]

String data = [Link]("username", "UTF-8") + "=" +

[Link](username, "UTF-8");

data += "&" + [Link]("password", "UTF-8") + "=" +

[Link](password, "UTF-8");

URL url = new URL(link);

URLConnection conn = [Link]();

[Link](true);

OutputStreamWriter wr = new OutputStreamWriter([Link]());

[Link]( data );

[Link]();

BufferedReader reader = new BufferedReader(new

InputStreamReader([Link]()));

StringBuilder sb = new StringBuilder();

String line = null;

// Read Server Response

while((line = [Link]()) != null) {

[Link](line);

break;

150 | P a g e
University of Dar es Salaam
return [Link]();

} catch(Exception e){

return new String("Exception: " + [Link]());

@Override

protected void onPostExecute(String result){

[Link]("Login Successful");

[Link](result);

Add the following content to [Link] and rebuild the whole project.

android {

useLibrary '[Link]'

Here is the content of activity_main.xml.

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="[Link]

xmlns:tools="[Link]

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"

151 | P a g e
University of Dar es Salaam
android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".MainActivity" >

<EditText

android:id="@+id/editText2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignRight="@+id/editText1"

android:layout_below="@+id/editText1"

android:layout_marginTop="25dp"

android:ems="10"

android:inputType="textPassword" >

</EditText>

<EditText

android:id="@+id/editText1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_alignParentTop="true"

android:layout_marginTop="44dp"

android:ems="10" >

<requestFocus android:layout_width="wrap_content" />

</EditText>

<TextView

152 | P a g e
University of Dar es Salaam
android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/editText1"

android:layout_alignParentLeft="true"

android:text="@string/Username" />

<TextView

android:id="@+id/textView3"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:text="@string/App"

android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView

android:id="@+id/textView7"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/textView5"

android:layout_alignLeft="@+id/textView6"

android:text="@string/Role"

android:textAppearance="?android:attr/textAppearanceMedium"

android:textSize="10sp" />

<TextView

android:id="@+id/textView5"

android:layout_width="wrap_content"

153 | P a g e
University of Dar es Salaam
android:layout_height="wrap_content"

android:layout_below="@+id/textView6"

android:layout_marginTop="27dp"

android:layout_toLeftOf="@+id/editText1"

android:text="@string/LoginRole" />

<TextView

android:id="@+id/textView8"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_above="@+id/textView6"

android:layout_alignLeft="@+id/textView5"

android:layout_marginBottom="27dp"

android:text="@string/method" />

<TextView

android:id="@+id/textView4"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/textView8"

android:layout_below="@+id/button1"

android:layout_marginTop="86dp"

android:text="@string/LoginStatus" />

<TextView

android:id="@+id/textView6"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignTop="@+id/textView4"

android:layout_centerHorizontal="true"

154 | P a g e
University of Dar es Salaam
android:text="@string/Status"

android:textAppearance="?android:attr/textAppearanceMedium"

android:textSize="10sp" />

<TextView

android:id="@+id/textView9"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/textView8"

android:layout_alignLeft="@+id/textView6"

android:text="@string/Choose"

android:textAppearance="?android:attr/textAppearanceMedium"

android:textSize="10sp" />

<Button

android:id="@+id/button2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:layout_toRightOf="@+id/textView6"

android:onClick="loginPost"

android:text="@string/LoginPost" />

<Button

android:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBaseline="@+id/button2"

155 | P a g e
University of Dar es Salaam
android:layout_alignBottom="@+id/button2"

android:layout_alignLeft="@+id/textView2"

android:onClick="login"

android:text="@string/LoginGet" />

<TextView

android:id="@+id/textView2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBaseline="@+id/editText2"

android:layout_alignBottom="@+id/editText2"

android:layout_alignParentLeft="true"

android:text="@string/Password" />

</RelativeLayout>

Here is the content of [Link].

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="app_name">PHPMYSQL</string>

<string name="action_settings">Settings</string>

<string name="hello_world">Hello world!</string>

<string name="Username">Username</string>

<string name="Password">Password</string>

<string name="LoginGet">Login - Get</string>

<string name="LoginPost">Login - Post</string>

<string name="App">Login Application</string>

156 | P a g e
University of Dar es Salaam
<string name="LoginStatus">Login Status</string>

<string name="LoginRole">Login Role</string>

<string name="Status">Not login</string>

<string name="Role">Not assigned</string>

<string name="method">Login Method</string>

<string name="Choose">Choose Method</string>

</resources>

Here is the content of [Link].

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="[Link]

package="[Link]" >

<uses-permission android:name="[Link]"/>

<uses-permission android:name="[Link].ACCESS_NETWORK_STATE" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name="[Link]"

android:label="@string/app_name" >

<intent-filter>

157 | P a g e
University of Dar es Salaam
<action android:name="[Link]" />

<category android:name="[Link]" />

</intent-filter>

</activity>

</application>

</manifest>

Let's try to run your PHPMYSQL 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 tool bar. 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 −

158 | P a g e
University of Dar es Salaam
Now just type in your username and password. In my case i am typing admin as username and
password. It is shown in the figure −

Now press the Get button and wait a few seconds and response will be downloaded and will be
shown to you. In this case, the response is the ROLE that is fetched in case of admin as username
and [Link] is shown in the figure below −

159 | P a g e
University of Dar es Salaam
Now again press the POST button and same result would appear. It is shown in the figure below

160 | P a g e
University of Dar es Salaam
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.

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 Regression Testing Before you publish your application, you need to make sure that its
meeting the basic quality expectations for all Android apps, on all of the devices that you are
targeting. So perform all the required testing on different devices including phone and tablets.

2 Application Rating When you will publish your application at Google Play, you will have to
specify a content rating for your app, which informs Google Play users of its maturity level.
Currently available ratings are (a) Everyone (b) Low maturity (c) Medium maturity (d) High
maturity.

161 | P a g e
University of Dar es Salaam
3 Targeted Regions Google Play lets you control what countries and territories where your
application will be sold. Accordingly you must take care of setting up time zone, localization or
any other specific requirement as per the targeted region.

4 Application Size Currently, the maximum size for an APK published on Google Play is 50
MB. If your app exceeds that size, or if you want to offer a secondary download, you can use
APK Expansion Files, which Google Play will host for free on its server infrastructure and
automatically handle the download to devices.

5 SDK and Screen Compatibility It is important to make sure that your app is designed to
run properly on the Android platform versions and device screen sizes that you want to target.

6 Application Pricing Deciding whether you app will be free or paid is important because, on
Google Play, free app's must remain free. If you want to sell your application then you will have
to specify its price in different currencies.

7 Promotional Content It is a good marketing practice to supply a variety of high-quality


graphic assets to showcase your app or brand. After you publish, these appear on your
product details page, in store listings and search results, and elsewhere.

8 Build and Upload release-ready APK The release-ready APK is what you you will upload
to the Developer Console and distribute to users. You can check complete detail on how to
create a release-ready version of your app: Preparing for Release.

9 Finalize Application Detail Google Play gives you a variety of ways to promote your app
and engage with users on your product details page, from colourful graphics, screen shots, and
videos to localized descriptions, release details, and links to your other apps. So you can
decorate your application page and provide as much as clear crisp detail you can provide.

Export Android Application Process

162 | P a g e
University of Dar es Salaam
APK DEVELOPMENT PROCESS

Before exporting the apps, you must some of tools

 Dx tools(Dalvik executable tools ): It going to convert .class file to .dex file. it has useful for
memory optimization and reduce the boot-up speed time

 AAPT(Android assistance packaging tool):it has useful to convert .Dex file [Link]

 APK(Android packaging kit): The final stage of deployment process is called as .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.

163 | P a g e
University of Dar es Salaam
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.

164 | P a g e
University of Dar es Salaam
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 key using keytool

$ keytool -genkey -v -keystore [Link]

-alias alias_name -keyalg RSA -keysize 2048 -validity 10000

 Compile your app in release mode to obtain an unsigned APK

 Sign your app with your private key using jarsigner

165 | P a g e
University of Dar es Salaam
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1

-keystore [Link] my_application.apk alias_name

 Verify that your APK is signed. For example −

$ jarsigner -verify -verbose -certs my_application.apk

 Align the final APK package using zipalign.

$ zipalign -v 4 your_project_name-[Link] your_project_name.apk

166 | P a g e
University of Dar es Salaam
167 | P a g e
University of Dar es Salaam

You might also like