2013-08-16 67 views
12

Sto cercando come mantenere la mia app per Android in esecuzione in primo piano.Come mantenere un'app in primo piano in esecuzione 24 ore su 24, 7 giorni su 7?

Sarà un'applicazione distribuita privatamente, così posso fare tutto il possibile per assicurarsi che gira costantemente sul dispositivo (HDMI TV Stick)

Quindi, come posso fare in modo che l'applicazione rimane in esecuzione, non importa che cosa? L'app è piuttosto leggera in termini di utilizzo delle risorse, quindi è preferibile non eseguirla 24 ore su 24, 7 giorni su 7.

Ho letto sul parametro persistente nel manifest, ma sembra che si possa applicare solo alle app di sistema?

Devo rendere la mia app un'app di sistema? Come lo farei e sarebbe d'aiuto?

+0

Credo che si può solo farvi App un'app di sistema se il dispositivo è radicata. Potresti considerare di rendere la tua app una sostituzione della schermata iniziale, come un'applicazione in modalità kiosk. Vedi la mia risposta [qui] (http://stackoverflow.com/questions/16657300/disable-all-home-button-and-task-bar-features-on-nexus-7/16657359#16657359). – TronicZomB

risposta

1

uso questo:

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

E nel manifesto:

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

visto qui: How do I keep the screen on in my App?

+1

Questo non è ciò che l'OP cercava. Vuole mantenere la sua app funzionante in modo permanente, questo manterrà lo schermo acceso mentre la sua app è in esecuzione ma gli utenti del dispositivo potranno accedere ad altre app – Boardy

+0

Ma una volta eseguito, dovrebbe funzionare esattamente all'infinito? Altrimenti potrebbe essere un'opzione per gestire OnDestroy e alcuni broadcastReceivers per avviare l'app se non è in primo piano. – Thkru

+0

Non ci sarebbe nulla fermando l'utente premendo il tasto home e quindi usando altre app che potrebbero essere installate sul dispositivo, quindi mettendo l'app OP in background. – Boardy

2

Questo è qualcosa di non troppo facile da raggiungere come le app in primo piano sono tecnicamente non dovrebbero stai correndo senza sosta. Inoltre, se Android sta esaurendo la memoria, inizierà ad uccidere le app che presentano il minor rischio che richiederebbe il riavvio dell'app da parte dell'utente.

Come accennato, è possibile renderlo un'app di sistema, ma penso che sia necessario eseguire il root del dispositivo o creare la propria ROM e rendere l'app parte della ROM. Probabilmente non è la soluzione migliore per le tue esigenze, anche se poche persone saranno in grado di eseguire il flashing di una ROM sui loro dispositivi.

Penso che la soluzione più semplice sarebbe quella di inserire nel manifest che la tua app è una sostituzione della schermata iniziale, ovvero un'app di avvio. Non conosco il codice esatto dalla cima della mia testa, ma questo andrebbe nella sezione delle applicazioni all'interno del manifest Android. Ciò significa che non appena il dispositivo si avvia o l'utente preme il pulsante Home, verrà indirizzato alla tua app.

+1

Qualcosa che l'OP potrebbe anche voler ricordare è che c'è un potenziale per avere problemi (ho fatto almeno) dopo un avvio con una custom sostituzione domestica. [Questo è quello che ho provato e come l'ho risolto.] (Http://stackoverflow.com/questions/17372781/home-launcher-issue-with-fragments-after-reboot) – TronicZomB

12
  • Se si desidera un uso esterno app: Autostart and StaY!

  • Se si vuole fare questo a livello di codice è possibile utilizzare un servizio che i sondaggi ogni "x" millisecondi per vedere se la vostra applicazione è in primo piano. In caso contrario, inizierà/porterà la tua app in primo piano. Fare in questo modo:

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

Il codice di cui sopra ha anche la "opzione" per forzare lo schermo per rimanere sempre avanti!Naturalmente avrete bisogno dei seguenti autorizzazioni:

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

e non anche dimenticare di registrare il vostro servizio:

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

Bella risposta, così in questo modo manterrai la l'app funziona anche se è invisibile (è aperta un'altra app)? – Dania

+1

Thx. Se non è in esecuzione o in esecuzione in background, verrà ripristinato, cioè portarlo in primo piano. – Tanasis

+0

Buona risposta, MA: l'unico problema che ho è quando ricevo la notifica via email, ad esempio, posso selezionare l'e-mail e ottiene l'app in primo piano. Come lo disabilito? – Meir

0

Si potrebbe fare la vostra applicazione diventare un lanciatore, con l'aggiunta di 2 seguenti tag categoria in <intent-filter> tags:

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

allora si dovrebbe sempre verificare se c'è un'altra corsa applicazione sulla parte superiore, eseguire codice riportato di seguito per l'utente direttamente alla nostra app:

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

Ho provato questa soluzione, ma non può nascondere le app che si disegnano in alto, come la testa di chat di Facebook Messenger.

0

Ho risolto il problema eseguendo un servizio appiccicoso che rilancia l'app quando l'attività viene chiusa.

//Your activity 

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

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

e nel validateActivityOnPause() hanno qualcosa di simile:

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