-- Leo's gemini proxy

-- Connecting to republic.circumlunar.space:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

Detecting whether an Android app is stopping (or starting)


I am writing an Android app (called Rabbit Escape), and I want it to start playing music when the user enters the app, and stop when the user leaves.


Not as easy as it sounds because Android largely doesn't think in apps, but Activities.


Rabbit Escape

Activities


Update: real-life code for this is here: Code for detecting when you leave an Android app.


In my previous post Order of Android Activity lifecycle events I tracked the methods that get called on activities on my two test devices when the user does various actions. There was some variation between devices, but we can determine some useful rules.


First, let's enumerate what we need to detect.


Code for detecting when you leave an Android app

Order of Android Activity lifecycle events


The user leaves by:


pressing "home" at any time

pressing the power button when the app is running

pressing "back" when in the first activity

launching an external activity (e.g. web browser)


The user enters by:


starting the app (e.g. from the home page, or the "running apps" panel)

pressing the power button when the app has been suspended

pressing "back" when in an external activity launched by us


From the previous post we can work out these rules:


When the user is entering, onResume is always called (on the activity that will be current)

When the user is leaving, onStop is always called (on the current activity), except when pressing the power button (to turn off) where you may only see an onPause call.

When the user is moving between activities, onResume is always called on the new activity, and onStop is always called on the old one. The onResume call is always before onStop


Thus, if we are OK with leaving ourselves running when the power button is pressed, we can detect leaving and entering the app using the code below.


If we need to stop something when the power button is pressed too, it seems we must be prepared to stop it when we receive onPause, and immediately restart it if we receive onResume, hoping that doesn't cause a problem (e.g. a break in the music).


// All activities have these two methods:
@Override
public void onResume()
{
   super.onResume();
   LeavingOrEntering.activityResumed( this );
}

@Override
public void onStop()
{
   super.onStop();
   LeavingOrEntering.activityStopped( this );
}

// And we detect leaving and entering like this:
class LeavingOrEntering
{
   private static Activity currentActivity = null;

   public static void activityResumed( Activity activity )
   {
       if ( currentActivity == null )
       {
           // We were resumed and no-one else was running.
           notifyEntering() // Start the music!
       }
       currentActivity = activity;
   }

   public static void activityStopped( Activity activity )
   {
       assert currentActivity != null;

       if ( currentActivity == activity )
       {
           // We were stopped and no-one else has been started.
           notifyLeaving(); // Stop the music!
       }
       currentActivity == null;
   }
}


Originally posted at 2015-06-05 00:14:40+00:00. Automatically generated from the original post : apologies for the errors introduced.


original post

-- Response ended

-- Page fetched on Sun May 19 07:58:24 2024