Search code examples
androidbroadcastreceiver

Show Dialog in BroadcastReceiver if App is running or not


I'm trying to display a notification (if you click on it, opens an Activity with Dialog) if App is closed or running on background, but if it is open or running on foreground I want to show the Dialog directly.

I have this code:

@Override
public void onReceive( Context context, Intent intent )
{
    if ( RunningHelper.isAppRunning(context, Constants.PROJECT_NAME ) )
    {
        Log.d("Running", "--------APP RUNNING");


    }
    else
    {

        Log.d("Running", "--------APP NOT RUNNING");
        showNotification();
    }
}

My RunningHelper:

 public static boolean isAppRunning(final Context context, final String packageName) {
    final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    final List<ActivityManager.RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
    if (procInfos != null)
    {
        for (final ActivityManager.RunningAppProcessInfo processInfo : procInfos) {
            if (processInfo.processName.equals(packageName)) {
                return true;
            }
        }
    }
    return false;
}

The problem is the App always detect that is running onReceive(), Have someone any clue for do it correctly? Thanks.


Solution

  • Implement custom Application class

        public class ProjectApplication extends Application {
    
      public static boolean isActivityVisible() {
        return activityVisible;
      }  
    
      public static void activityResumed() {
        activityVisible = true;
      }
    
      public static void activityPaused() {
        activityVisible = false;
      }
    
      private static boolean activityVisible;
    }
    

    Dont forget to make entry in AndroidManifest of your application class.

    Add onPause and onResume to every Activity in the project or you can create a BaseActivity extending AppCompatActivity/FragmentActivity and all your project activity must extend BaseActivity

    @Override

    protected void onResume() {
      super.onResume();
      ProjectApplication.activityResumed();
    }
    
    @Override
    protected void onPause() {
      super.onPause();
      ProjectApplication.activityPaused();
    }
    

    and when broadcast is received you can check if activity is in foreground or background

    @Override
    public void onReceive( Context context, Intent intent )
    {
        if ( ProjectApplication.activityVisible)        {
         // application is in foreground and running
        // do stuff here
        }
        else
        {
            // application is in background
        // do stuff here
    
        }
    }