Getting Started with Android Jetpack Lifecycle

Implementing Lifecycle Componants in Android

First, add the required dependency to your app's build.gradle file:

implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")

  1. Decoupling UI Components from Activities with Lifeccyle

Main Activity

package com.example.lifecycle;

import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private CustomChronometer chronometer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chronometer = findViewById(R.id.chronometer);
        getLifecycle().addObserver(chronometer);
    }
}

Custom Compnoent

package com.example.lifecycle;

import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.widget.Chronometer;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

public class CustomChronometer extends Chronometer implements LifecycleObserver {
    private long accumulatedTime = 0;

    public CustomChronometer(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private void resumeChronometer(){
        setBase(SystemClock.elapsedRealtime() - accumulatedTime);
        start();
    }
    
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    private void pauseChronometer(){
        accumulatedTime = SystemClock.elapsedRealtime() - getBase();
        stop();
    }
}

Layout XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.example.lifecycle.CustomChronometer
        android:id="@+id/chronometer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="00:00"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </com.example.lifecycle.CustomChronometer>

</androidx.constraintlayout.widget.ConstraintLayout>

  1. Decoupling Services from Components with Lifecycle

Activity

package com.example.lifecycle;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

public class ServiceActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_service);
    }

    public void startLocationService(View view) {
        startService(new Intent(this, LocationTrackingService.class));
    }

    public void stopLocationService(View view) {
        stopService(new Intent(this, LocationTrackingService.class));
    }
}

Service

package com.example.lifecycle;

import androidx.lifecycle.LifecycleService;

public class LocationTrackingService extends LifecycleService {

    public LocationTrackingService() {
        LocationMonitor locationMonitor = new LocationMonitor(this);
        getLifecycle().addObserver(locationMonitor);
    }
}

Observer

package com.example.lifecycle;

import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

import java.util.List;

public class LocationMonitor implements LifecycleObserver {
    private final Context context;
    private LocationManager locationManager;
    private LocationUpdateListener locationUpdateListener;

    public LocationMonitor(Context context) {
        this.context = context;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private void startLocationMonitoring() {
        locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        locationUpdateListener = new LocationUpdateListener();
        
        if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 1, locationUpdateListener);
    }
    
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private void stopLocationMonitoring(){
        locationManager.removeUpdates(locationUpdateListener);
    }

    private static class LocationUpdateListener implements LocationListener {
        @Override
        public void onLocationChanged(@NonNull Location location) {
            // Handle location updates
        }

        @Override
        public void onLocationChanged(@NonNull List<location> locations) {
            LocationListener.super.onLocationChanged(locations);
        }

        @Override
        public void onFlushComplete(int requestCode) {
            LocationListener.super.onFlushComplete(requestCode);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            LocationListener.super.onStatusChanged(provider, status, extras);
        }

        @Override
        public void onProviderEnabled(@NonNull String provider) {
            LocationListener.super.onProviderEnabled(provider);
        }

        @Override
        public void onProviderDisabled(@NonNull String provider) {
            LocationListener.super.onProviderDisabled(provider);
        }
    }
}
</location>
  1. Monitoring Application Lifecycle with ProcessLifecycleOwner

Application Observer

package com.example.lifecycle;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

public class AppLifecycleObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onAppCreate() {
        // Application created
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onAppStart() {
        // Application visible
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onAppResume() {
        // Application in foreground
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onAppPause() {
        // Application going to background
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onAppStop() {
        // Application no longer visible
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onAppDestroy() {
        // Application terminated
    }
}

Custom Application Class

package com.example.lifecycle;

import android.app.Application;

import androidx.lifecycle.ProcessLifecycleOwner;

public class CustomApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(new AppLifecycleObserver());
    }
}

Don't forget to register your custom Application class in the AndroidManifest.xml:

<application
    android:name=".CustomApplication"
    ... >
    ...
</application>

Tags: Android Jetpack Lifecycle Architecture Components ProcessLifecycleOwner

Posted on Thu, 20 Aug 2026 16:37:06 +0000 by ronald29x