Android Question About keeping Activity alive in background

vfafou

Well-Known Member
Licensed User
Longtime User
Hello!
Searching about this issue, I've found the following:
http://stackoverflow.com/questions/18276355/how-to-keep-a-foreground-app-running-24-7

I would like to ask you if this is applicable in B4A and of course, if anyone has implemented it and it works!
The content of the above URL is:
  • If you want an external app use: Autostart and StaY!

  • If you want to do this programmatically you can use a service that polls every "x" milliseconds to see if your app is in the foreground. If it is not, it will start/bring your app in the foreground. Do it like this:
B4X:
public class PersistService extends Service {

    private static final int INTERVAL = 3000; // poll every 3 secs
    private static final string YOUR_APP_PACKAGE_NAME = "YOUR_APP_PACKAGE_NAME";

    private static boolean stopTask;
    private PowerManager.WakeLock mWakeLock;

    @Override
    public void onCreate() {
        super.onCreate();

        stopTask = false;

        // Optional: Screen Always On Mode!
        // Screen will never switch off this way
        mWakeLock = null;
        if (settings.pmode_scrn_on){
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "a_tag");
            mWakeLock.acquire();
        }

        // Start your (polling) task
        TimerTask task = new TimerTask() {
            @Override
            public void run() {

                // If you wish to stop the task/polling
                if (stopTask){
                    this.cancel();
                }

                // The first in the list of RunningTasks is always the foreground task.
                RunningTaskInfo foregroundTaskInfo = activityManager.getRunningTasks(1).get(0);
                String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();

                // Check foreground app: If it is not in the foreground... bring it!
                if (!foregroundTaskPackageName.equals(YOUR_APP_PACKAGE_NAME)){
                    Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage(YOUR_APP_PACKAGE_NAME);
                    startActivity(LaunchIntent);
                }
            }
        };
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(task, 0, INTERVAL);
    }

    @Override
    public void onDestroy(){
        stopTask = true;
        if (mWakeLock != null)
            mWakeLock.release();
        super.onDestroy();
    }
}
The above code has also the "option" to force the Screen to stay always on! Of course you will need the following permissions:
B4X:
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
and do not also forget to register your service:
B4X:
<service android:name="YOURPACAKGE.PersistService"
     android:enabled="true"/>

Thank you in advance!
 

vfafou

Well-Known Member
Licensed User
Longtime User
Hello DonManfred!
Thank you for your response! I already use START_STICKY and StartForeground!
I'm looking for a way to keep an activity of my app alive!
 
Upvote 0

Erel

B4X founder
Staff member
Licensed User
Longtime User
I would like to ask you if it is possible to call CallSubDelayed2(Me,"StartActivity","ActName") from a service every XX minutes for other activity than Main!
You can call any activity you like. However CallSubDelayed will not start the activity if the app is in the background (by design). You should use StartActivity instead.
 
Upvote 0
Cookies are required to use this site. You must accept them to continue using the site. Learn more…