APS Analytics for Android

Pro or Enterprise Subscription Required


This AMPLIFY Appcelerator Services feature requires a Pro or Enterprise Subscription. 

This page describes how to use the AMPLIFY Appcelerator Services Analytics for native Android applications, built with Java and the Android APIs.

Not developing a native Android application with Java?

See the following topics to use the Appcelerator Analytics Service on other platforms:

For native iOS applications built with Objective-C, see APS Analytics for iOS.

For Titanium Applications, see Appcelerator Analytics.


Appcelerator Analytics collects and presents information in real time about how your application's user acquisition, engagement, and usage. By default, it provides the number of applications installs, the number of sessions, and the average application session length organized by application name, platform, and geography. Your application can send custom analytic events, which are collected and logged by Analytics, to learn how users use your application. You can also create event funnels —ordered sets of custom events that correspond to a business process or application flow you want to track as a whole.

This document provides an overview of the features provided by Analytics, and how to use them using the Titanium SDK. If you are developing an iOS application with Objective-C or Swift or an Android application with Java, see APS Analytics for iOS or APS Analytics for Android for details on using Analytics.

See also:


Analytics refers to data about how your application has been used, as well as information about how users interact with your application. Analytics data is transmitted in the form of events

Events are operational milestones in the application. Some events are generated automatically, such as those that mark an installation, or the beginning and end of a session. Others may be custom events, which have a meaning specific to an application, such as tapping a specific button or opening a certain window.

There are two types of custom events: feature events and navigation events.  feature event represents an action a user could take in an application, such as 'liking an item' or launching a video'.  navigation event is used to track a users' navigation from one area of the UI to another. Applications use the Titanium or APSAnalytics API to create custom events.

Event funnels let you define custom, ordered event sequences that let you track a specific user process, such as finding a product and making a purchase.

The Analytics dashboard organizes, analyzes, and presents analytics data captured for your applications. You also use the Analytics dashboard to create and view event funnels.


Navigation events are not currently available through the Analytics UI, only through raw data export.

Getting started

To integrate the Analytics service with a new or existing Android application:

  1. Go to the Dashboard and create a new native Android application.
  2. Download the Services SDK and get your Analytics application key.
  3. Unpack the Services SDK ZIP file.
  4. Copy the appcelerator-sdk-android-<VERSION>.jar to the  lib folder of your Android project.
  5. Modify the project's AndroidManifest.xml file to include the following permissions and to add the APSAnalytics package as a service: 

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        android:versionName="1.0" >
        <!-- Add these permissions to enable Analytics -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                     android:maxSdkVersion="18" />
            <!-- Add this service to enable Analytics -->
            <service android:name="com.appcelerator.aps.APSAnalyticsService"
                android:exported="false" />
  6. Add the following import statements to the main Activity of the project: 

    import com.appcelerator.aps.APSServiceManager;
    import com.appcelerator.aps.APSAnalytics;
  7. In the main Activity's  onCreate() method, enable the service by calling the APSServiceManager's enable method. Pass the method the application context as the first argument and the APS application key as the second argument.

    public void onCreate() {
        APSServiceManager.getInstance().enable(getApplicationContext(), "APP_KEY");

    To get your APS App key:

    1. Go to the Dashboard.
    2. Select your application from the Apps drop-down menu.
    3. Click the Overview tab.
    4. Click the Services button.
    5. Click Show Key under the Analytics, Performance and Cloud section.

The Android application can now make additional method calls using the  APSAnalytics class. Before making API calls to the APSAnalytics class, you need to retrieve a shared instance using the getInstance() method. Make APSAnalytics API calls using the shared instance.

For the Android platform, you need to set up the application to send user session events.

Advanced initialization options

Session timeout

By default, after the application has been backgrounded for 30000 milliseconds (30 seconds), the Analytics service ends the current user session and starts a new one when the application enters the foreground again. To adjust the timeout, use the APSAnalytics's setSessionTimeout() method.

// Sets the timeout to 15000 milliseconds (15 seconds) instead of 30000 milliseconds.
APSAnalytics.getInstance().setSessionTimeout(15000, TimeUnit.MILLISECONDS);

Setup user session events

On the Android platform, user session events are not automatically sent, unlike the iOS and Titanium platforms. You need to add three APSAnalyitcs method calls in the main Activity of your application in order to capture user session data.

  1. Call the sendAppEnrollEvent() method right after the application calls the APSServiceManager.getInstance().enable() in the onCreate() method. The enroll event indicates application installs or upgrades.
  2. Call the sendAppForegroundEvent() method inside the main Activity's onResume() method. The foreground event indicates when the application is being used.
  3. Call the sendAppBackgroundEvent() method inside the main Activity's onPause() method. The background event indicates when the application has been dismissed.
protected void onCreate(Bundle savedInstanceState) {
    APSServiceManager.getInstance().enable(getApplicationContext(), "APP_KEY");
public void onPause(){
public void onResume(){

Creating custom events

You use the A PSAnalytics API to log and report custom events. There are two main types of events you can capture: Feature Events and Navigation Events. Feature events are for capturing a user action, such as selecting a specific menu option or launching a video. Navigation events track a user's movement through an application, such as going from the application's home screen and then to a search screen.


Currently, the optional data parameter of the Titanium.Analytics methods, which is used to log a dictionary object, cannot be accessed through the Dashboard.

Feature events

You use the APSAnalytics' sendAppFeatureEvent() method to generate a feature event that captures a specific application or user activity. A feature event should represent an action, such as launching a video, or 'new item', 'launch video', and so forth. The name you assign to a feature event should incorporate the application state into the event name, rather than long descriptive names. The following naming convention is suggested, where group.event refers to the parent event: group.event.sub-event

Feature event names should be as generic as possible. For instance, if you want to track when users select a certain menu option, use a name like  "user.menu.selection",  not "joeuser.menu.selection". The first option is better because it groups all the same types of events into a single metric that's easy to view on Dashboard. The person analyzing the data only has to look at a single number to get an overview of how many users have selected that menu option. The second might be fine for very small user bases, but if you have more than 100 users it means that the person analyzing the data would have to look through 100 different event names to be able to generate any useful data. 

For example, to track a user's menu selection you might use the following code, where the 10 digit number uniquely identifies the selection in your code: 

Good Practice: Track the State with the Naming Syntax
APSAnalytics.getInstance().sendAppFeatureEvent("select.item.12345678910", null);

You should avoid using long, descriptive event names, as shown below:

Bad Practice: Avoid Long Descriptions
APSAnalytics.getInstance().sendAppFeatureEvent("Select Item THIS IS THE DESCRIPTION OF THE EVENT -12345678910", null);

Navigation events

Use the APSAnalytics' sendAppNavEvent() method to track a user's navigation within your application from one screen to another. The method's first and second parameters are strings that specify the "from" and "to" locations, respectively. Its third parameter is the name you want to assign to the event.


Currently, navigation events do not appear in Dashboard. As a workaround, consider using transition events.

In the following example, an event is generated when the user navigates from the application's home screen to an edit message screen:

Best Practice: Track User Navigations Using a navEvent
APSAnalytics.getInstance().sendAppNavEvent("Home", "Edit Message", "nav.editmessage", null);

Avoid passing a single long, descriptive string to navEvent(), for example:

Bad Practice: Do Not Track User Navigations Using featureEvent
APSAnalytics.getInstance().sendAppFeatureEvent("Home -> Edit Message", null);

Transition events

Currently, navigation events are not collected and presented in the Dashboard. As a workaround to this temporary issue, you can create "transition" events that serve the same purpose. A transition event is a feature event whose name uniquely identifies the user's navigation ("screen1-to-screen2", for example). You can create an event funnel in Dashboard from these events to analyze navigation within your application. 

For example, suppose you wanted to track user navigation between pages of a multi-step sign-up process. As the user moves from one step to the next, the application generates a feature event whose name follows the pattern "stepN-to-stepN+1", where N is the step number.

// Transition 1:
- (void)gotoStepTwo {
    // Generate transition event
    APSAnalytics.getInstance().sendFeatureEvent("step1-to-step2", null);
// Transition 2:
- (void)gotoStepThree {
    // Generate transition event
    APSAnalytics.getInstance().sendFeatureEvent("step2-to-step3", null);
// Transition 3:
- (void)gotoStepFour {
    // Generate transition event
    APSAnalytics.getInstance().sendFeatureEvent("step3-to-step4", null);

When you create the funnel, you order the events in their logical order to mirror the process.

Geo events

Use the APSAnalytics' sendAppGeoEvent() method to send real-time geographic data to the Analytics service. Pass the method an Android Location object.

In the following example, the application uses a default location provider to get location information from the device. The application sends the location data to the Analytics service.

 * Don't forget to add the ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION permissions
 * in the AndroidManifest.xml file.
public class MainActivity extends Activity implements LocationListener{
    private LocationManager locationManager;
    private String provider;

    protected void onCreate(Bundle savedInstanceState) {
        // Initialize Analytics
        APSServiceManager.getInstance().enable(getApplicationContext(), "APP_KEY");

        // Get the location manager and use a default provider
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);
        // Initialize the location
        if (location != null) {
            Log.i("GEO", "Provider " + provider + " has been selected.");

    // Get location updates
    public void onLocationChanged(Location location) {
        Log.i("GEO", location.getLatitude() + "," +  location.getLongitude());
    protected void onResume() {
        // Request location updates at least every 5 minutes
        // and only if the location between updates is at least 1000 meters
        locationManager.requestLocationUpdates(provider, 5 * 60 * 1000, 1000, this);

    protected void onPause() {
        // Stop update requests

    public void onStatusChanged(String s, int i, Bundle bundle) {
        // To be implemented
    public void onProviderEnabled(String s) {
        // To be implemented
    public void onProviderDisabled(String s) {
        // To be implemented

Related Links