2.using Intents
2.using Intents
Example:
String q = "tutorialspoint";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, q);
startActivity(intent);
Context.startActivity()
1 The Intent object is passed to this method to launch a new activity or get an
existing activity to do something new.
Context.startService()
2 The Intent object is passed to this method to initiate a service or deliver new
instructions to an ongoing service.
Context.sendBroadcast()
3 The Intent object is passed to this method to deliver the message to all
interested broadcast receivers.
Exploring Intent Objects:
ACTION_DIAL content://contacts/people/1
2
Display the phone dialer with the person filled in.
ACTION_VIEW tel:123
3
Display the phone dialer with the given number filled in.
ACTION_DIAL tel:123
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
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
3. Category
The category is an optional part of Intent object and it's a string containing
additional information about the kind of component that should handle the
intent. The addCategory() method places a category in an Intent object,
removeCategory() deletes a category previously added, and getCategories()
gets the set of all categories currently in the object. Here is a list of Android
Intent Standard Categories.
You can check detail on Intent Filters in below section to understand how do
we use categories to choose appropriate activity corresponding to an Intent.
4. Extras
This will be in key-value pairs for additional information that should be
delivered to the component handling the intent.
The extras can be set and read using the putExtras() and getExtras() methods
respectively. Here is a list of Android Intent Standard Extra Data
5. 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.
FLAG_ACTIVITY_CLEAR_TASK
FLAG_ACTIVITY_CLEAR_TOP
If set, and the activity being launched is already running in the current
2 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
6. 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
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 −
// Starts TargetActivity
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 −
Because of the arbitrary nature of Implicit Intents, the system uses a process
called Intent Resolution to map them correctly. The system does this by matching
the Intent description with the default descriptions in the system.
Intent Object, defined earlier comes into play here. The Intent Resolution
compares the contents of Intent Object against the Intent Filters. (Intent Filters
are associated with the different Android components, and can receive
Intent. Intent filter is a way for Android components to declare their
capabilities to the Android system.)
The Intent Resolution uses the following information to map the Intent to the
appropriate Android component:
The action
The type (data type and URI)
The category
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.
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.example.My Application.LAUNCH" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
Once this activity is defined along with above mentioned filters, other
activities will be able to invoke this activity using either the
android.intent.action.VIEW, or using the com.example.My
Application.LAUNCH action provided their category is
android.intent.category.DEFAULT.
The <data> element specifies the data type expected by the activity to be
called and for above example our custom activity expects the data to start with
the "http://"
There may be a situation that an intent can pass through the filters of more
than one activity or service, the user may be asked which component to
activate. An exception is raised if no target can be found.
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
Create a project in Android Studio and named it “Intents”. Make an activity, which
would consists Java file; MainActivity.java and an xml file for User interface which
would be activity_main.xml
Step 1: Let’s design the UI of activity_main.xml:
First design the text view displaying basic details of the App
Second design the two button of Explicit Intent Example and Implicit Intent
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView2"
android:clickable="false"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_marginTop="42dp"
android:background="#3e7d02"
android:textColor="#ffffff" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/explicit_Intent"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="147dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/implicit_Intent"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Now lets design UI of another activity where user will navigate after he click on
Explicit Example button. Go to layout folder, create a new activity and name it
activity_second.xml.
In this activity we will simply use TextView to tell user he is now on second
activity.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:background="#CCEEAA"
tools:context="com.example.android.intents.SecondActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Step 3: Implement onClick event for Implicit And Explicit Button inside
MainActivity.java
package com.example.android.intents;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
@Override
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
explicit_btn = (Button)findViewById(R.id.explicit_Intent);
explicit_btn.setOnClickListener(new View.OnClickListener() {
@Override
startActivity(intent);
});
implicit_btn.setOnClickListener(new View.OnClickListener() {
@Override
intent.setData(Uri.parse("https://www.abhiandroid.com"));
startActivity(intent);
});
Now we need to create another SecondActivity.java which will simply open the layout
of activity_second.xml . Also we will use Toast to display message that he is on
second activity.
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
@Override
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Make sure Manifest file has both the MainActivity and SecondActivity listed it. Also
here MainActivity is our main activity which will be launched first. So make sure
intent-filter is correctly added just below MainActivity.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.intents" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<intent-filter>
</intent-filter>
</activity>
</activity>
</application>
</manifest>
Output:
Now run the above program in your Emulator. The App will look like this: