How to keep a foreground app running 24/7?

前端 未结 7 616
时光说笑
时光说笑 2021-01-30 18:25

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 consta

相关标签:
7条回答
  • 2021-01-30 18:57

    use this:

    import android.os.PowerManager;
    
    public class MyActivity extends Activity {
    
        protected PowerManager.WakeLock mWakeLock;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(final Bundle icicle) {
            setContentView(R.layout.main);
    
            /* This code together with the one in onDestroy() 
             * will make the screen be always on until this Activity gets destroyed. */
            final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
            this.mWakeLock.acquire();
        }
    
        @Override
        public void onDestroy() {
            this.mWakeLock.release();
            super.onDestroy();
        }
    }
    

    And in the manifest:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

    Seen here: How do I keep the screen on in my App?

    0 讨论(0)
  • 2021-01-30 18:57

    You may try startLockTask(); For More info, visit here

    0 讨论(0)
  • 2021-01-30 19:01

    I solved that issue by having a sticky service running that relaunches the app when the activity is getting closed.

    //Your activity
    
    @Override
    public void onPause() {
        super.onPause();
    
        if (yourservice != null) {
            yourservice.validateActivityOnPause();
        }
    }
    

    and in the validateActivityOnPause() have something like:

    //Your service
    
    public void validateLynxActivityOnPause() {
        //Do some stuff here
    
        Intent startActivityIntent = new Intent(this, LynxActivity.class);
        startActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        this.startActivity(startActivityIntent);
    }
    
    0 讨论(0)
  • 2021-01-30 19:06

    Now that activityManager.getRunningAppProcesses() is deprecated( as of API21 ), you will want to replace :

    RunningTaskInfo foregroundTaskInfo = activityManager.getRunningTasks(1).get(0);
    String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();
    

    with:

    List<ActivityManager.RunningAppProcessInfo> tasks = activityManager.getRunningAppProcesses();
    String foregroundTaskPackageNameTest = tasks.get(0).processName;
    

    do not forget to import List with:

    import java.util.List;
    

    As a side note, I am not sure about OP's way of keeping the screen always on. I'm not sure that it works the way he's done it, but more importantly, it is deprecated and very much advised against to be using Wake Locks as you need to add permissions, which opens the door to bugs. Rather, it is generally better practice to use Window manager flags: https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON

    0 讨论(0)
  • 2021-01-30 19:06

    You could make your app become a launcher, by adding 2 following category tags into <intent-filter> tags:

      <category android:name="android.intent.category.DEFAULT"/>
      <category android:name="android.intent.category.HOME"/>
    

    then you should always check if there's another app run on top, run following code to direct user to our app:

      Intent startMain = new Intent(Intent.ACTION_MAIN);
      startMain.addCategory(Intent.CATEGORY_HOME);
      startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      startActivity(startMain);
    

    I have tried this solution, but it cannot hide apps that draw on top, like Facebook Messenger chat head.

    0 讨论(0)
  • 2021-01-30 19:14
    • 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"/>
    
    0 讨论(0)
提交回复
热议问题