Как сохранить приложение переднего плана на 24/7?

Я изучаю, как сохранить приложение Android на переднем плане.

Это будет частное приложение, поэтому я могу сделать все возможное, чтобы он постоянно работал на устройстве (HDMI TV Stick)

Итак, как я могу убедиться, что приложение будет работать независимо от того, что? Приложение довольно легкое с точки зрения использования ресурсов, поэтому, если он работает 24/7, мы, надеюсь, не будем проблемой.

Я читал о постоянном параметре в манифесте, но похоже, что он может применяться только к системным приложениям?

Должен ли я сделать свое приложение системным приложением? Как я могу это сделать и это поможет?

Solutions Collecting From Web of "Как сохранить приложение переднего плана на 24/7?"

  • Если вы хотите использовать внешнее приложение: Autostart и StaY!

  • Если вы хотите сделать это программно, вы можете использовать службу, которая опросает каждые миллисекунды «x», чтобы узнать, находится ли ваше приложение на переднем плане. Если это не так, оно начнет / приведет ваше приложение на передний план. Делай это так:

    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(); } } 

В приведенном выше коде также есть «опция», чтобы заставить экран оставаться на месте! Конечно, вам понадобятся следующие разрешения:

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

И не забудьте также зарегистрировать свой сервис:

  <service android:name="YOURPACAKGE.PersistService" android:enabled="true"/> 

Этого нелегко достичь, поскольку приложения на переднем плане технически не должны работать без остановок. Также, если у android заканчивается память, он начнет убивать приложения, которые представляют наименьший риск, который затем потребует перезапуска приложения.

Как уже упоминалось, вы можете сделать это системным приложением, но я думаю, вам нужно укоренить устройство или создать собственный ПЗУ и сделать свое приложение частью ПЗУ. Наверное, это не лучшее решение для ваших нужд, хотя мало кто сможет выпустить ПЗУ на свои устройства.

Я думаю, что самым простым решением было бы добавить манифест, что ваше приложение будет заменой домашнего экрана, то есть приложением для запуска. Я не знаю точного кода с верхней части головы, но это пойдет в раздел приложения в манифесте android. Это означает, что как только устройство загрузится, или пользователь нажмет кнопку «домой», они будут отправлены в ваше приложение.

использовать это:

 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(); } } 

И в манифесте:

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

Видно здесь: как сохранить экран в своем приложении?

Вы могли бы сделать свое приложение в качестве запуска, добавив 2 <intent-filter> категории в теги <intent-filter> :

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

То вы должны всегда проверять, есть ли другое приложение, выполняемое сверху, запустить следующий код, чтобы направить пользователя в наше приложение:

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

Я пробовал это решение, но он не может скрывать приложения, которые используются сверху, например, чат Facebook Messenger.

Я решил эту проблему, запуская липкую службу, которая перезапускает приложение, когда активность закрывается.

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

И в validateActivityOnPause () есть что-то вроде:

 //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); }