Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

  • Если вы хотите использовать внешнее приложение: 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"/>

Ответ 2

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

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

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

Ответ 3

используйте это:

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" />

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

Ответ 4

Вы можете сделать свое приложение в качестве запуска, добавив 2 тега категории в теги <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.

Ответ 5

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

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