Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to keep a foreground app running 24/7?

Tags:

android

I am looking into how to keep my Android app running in the foreground.

It will be a privately distributed app, so I can do anything possible to make sure it runs constantly on the device (HDMI TV Stick)

So, how can I make sure that the app stays running no matter what? The app is pretty light weight in terms of resource usage, so having it run 24/7 should hopefully not be a problem.

I read about the persistent parameter in the manifest, but it looks like it might only apply to system apps?

Should I make my app a system app? How would I do that and would it help?

like image 381
Mr Pablo Avatar asked Aug 16 '13 15:08

Mr Pablo


People also ask

How do I make my android app always running?

You have to start a service in your Application class to run it always. If you do that, your service will be always running. Even though user terminates your app from task manager or force stop your app, it will start running again.


1 Answers

  • 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:

    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:

<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:

    <service android:name="YOURPACAKGE.PersistService" 
     android:enabled="true"/>
like image 99
Tanasis Avatar answered Nov 16 '22 00:11

Tanasis