20 votes

Comment faire fonctionner une application de premier plan 24 heures sur 24 et 7 jours sur 7 ?

Je cherche à savoir comment faire pour que mon application Android fonctionne en premier plan.

Il s'agira d'une application distribuée de manière privée, je peux donc faire tout ce qui est possible pour m'assurer qu'elle fonctionne constamment sur l'appareil (HDMI TV Stick).

Alors, comment puis-je m'assurer que l'application reste en marche quoi qu'il arrive ? L'application est assez légère en termes d'utilisation des ressources, donc la faire fonctionner 24 heures sur 24 et 7 jours sur 7 ne devrait pas poser de problème.

J'ai lu des informations sur le paramètre persistant dans le manifeste, mais il semble qu'il ne s'applique qu'aux applications système ?

Dois-je faire de mon application une application système ? Comment le faire et est-ce utile ?

15voto

Tanasis Points 507
  • Si vous voulez une application externe, utilisez : Démarrage automatique et StaY !

  • Si vous voulez faire cela de manière programmatique, vous pouvez utiliser un service qui interroge toutes les "x" millisecondes pour voir si votre application est au premier plan. Si ce n'est pas le cas, il démarrera/amènera votre application au premier plan. Faites comme ceci :

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

Le code ci-dessus a également une "option" pour forcer l'écran à rester toujours allumé ! Bien sûr, vous aurez besoin des permissions suivantes :

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

et n'oubliez pas non plus d'enregistrer votre service :

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

3voto

Thomas K Points 2695

Utilisez ça :

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

Et dans le manifeste :

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

Vu ici : Comment puis-je garder l'écran allumé dans mon App ?

2voto

Boardy Points 5332

Il n'est pas facile d'y parvenir, car les applications de premier plan ne sont techniquement pas censées fonctionner en continu. De plus, si Android manque de mémoire, il commencera à tuer les applications qui présentent le moins de risques, ce qui obligera l'utilisateur à redémarrer l'application.

Comme mentionné, vous pouvez soit en faire une application système, mais je pense que vous devez Rooter l'appareil ou construire votre propre ROM et faire de votre application une partie de la ROM. Ce n'est probablement pas la meilleure solution pour vos besoins car peu de gens seront capables de flasher une ROM sur leurs appareils.

Je pense que la solution la plus simple serait de mettre dans le manifeste que votre application est un remplacement de l'écran d'accueil, c'est-à-dire une application lanceur. Je ne connais pas le code exact, mais il s'agit de la section application du manifeste Android. Cela signifie que dès que l'appareil démarre, ou que l'utilisateur appuie sur le bouton d'accueil, il sera dirigé vers votre application.

2voto

J'ai résolu ce problème en faisant tourner un service qui relance l'application lorsque l'activité est fermée.

//Your activity

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

    if (yourservice != null) {
        yourservice.validateActivityOnPause();
    }
}

et dans le validateActivityOnPause() avoir quelque chose comme :

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

1voto

Yann G Points 111

Maintenant que activityManager.getRunningAppProcesses() est déprécié (à partir de l'API21), vous voudrez remplacer :

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

avec :

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

n'oubliez pas d'importer List avec :

import java.util.List;

Par ailleurs, je ne suis pas sûr de la façon dont l'OP garde l'écran allumé en permanence. Je ne suis pas sûr que cela fonctionne de la façon dont il l'a fait, mais plus important encore, il est déprécié et très déconseillé d'utiliser Wake Locks car vous devez ajouter des permissions, ce qui ouvre la porte à des bugs. Il est plutôt préférable d'utiliser les drapeaux du gestionnaire de fenêtres : https://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X