2010-11-19 11 views
18

Ho visto questo in alcuni tutorial ora ... ma come nel mondo il codice sorgente Android non ha un metodo principale ed è ancora in esecuzione.In che modo il codice sorgente Android non ha un metodo principale ed è ancora in esecuzione?

Per esempio (da http://developer.android.com/guide/tutorials/hello-world.html):

public class HelloAndroid extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

che corre, ma non v'è alcuna principale !!!

Ho anche pensato che l'uso di cose come onCreate (o formLoad, ecc.) Era sbagliato perché un costruttore dovrebbe fare quel lavoro e tali metodi incorporati possono essere a volte puzzolenti. Ma onCreate è un punto di ingresso? Anche senza un main?

Cosa succede se c'è più di un'attività ... c'è una gerarchia a questi gestori di eventi integrati? OnCreate trionfa su tutto il resto? Altrimenti, in che modo l'app dovrebbe sapere cosa eseguire o dove inserire il programma?

Grazie!

risposta

5

Si indica quale si esegue all'avvio nel file manifest. Non c'è un main() perché non c'è bisogno di esserlo, main potrebbe essere una convenzione usata per le app java "normali", ma non è per cose come le applet del browser. Il sistema crea l'oggetto attività e chiama i metodi al suo interno, che possono o non possono essere chiamati principali. In questo caso, non lo è.

onCreate è diverso da un main e da un costruttore, in quanto può essere chiamato due volte su una singola attività, ad esempio se il processo viene ucciso e l'utente torna all'attività. Vedi http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

8

Che funziona ma non c'è il principale !!!

Naturalmente. Molte cose che potreste pensare come "applicazioni" Java non hanno il loro metodo main(). Ad esempio, IIRC, servlet, WAR e simili non hanno metodi main() - il metodo main(), se ce n'è uno, è nel contenitore.

Ma onCreate è un punto di ingresso?

onCreate() è un metodo.

Cosa succede se c'è più di un'attività ... c'è una gerarchia a questi gestori di eventi integrati?

Non proprio.

OnCreate trionfa su tutto il resto?

Non proprio.

Altrimenti, in che modo l'app sa cosa deve essere eseguito o dove inserire il programma?

Un'app non "sa cosa eseguire o dove inserire il programma".

Un'applicazione Android è un paniere di componenti. Alcuni componenti possono essere legati alle icone in una schermata iniziale. Alcuni componenti possono essere collegati a timer pianificati, come i lavori cron o le attività pianificate di Windows. Alcuni componenti possono essere legati ad eventi di sistema, come quando il dispositivo viene inserito o rimosso da un dock per auto. Tali componenti verranno automaticamente creati e utilizzati quando appropriato (ad esempio, quando un utente tocca l'icona nella schermata iniziale di avvio). Tuttavia, altri componenti vengono creati e utilizzati solo quando il codice li richiede in modo specifico.

Pensare a un'applicazione Android come se fosse un programma Java monolitico in modalità console non causerà problemi.

1

C'è una sorta di principale, è semplicemente fuori dalle tue mani. Dopo tutto, non c'è niente di speciale in una funzione main in qualsiasi lingua. È solo il punto di ingresso in cui il codice inizia ad essere eseguito. Il sistema operativo Android si aspetta che le applicazioni abbiano una certa struttura e chiama il tuo codice in base alle convenzioni che segui.

0

frame UI Android incapsulare alcuni dettagli comuni Java, si può studiare il codice sorgente del framework di interfaccia utente di Android

1

applet Non hanno anche i metodi main(). Dipende solo da come il tuo codice è confezionato.

2

Mentre non esiste un punto di ingresso principale specifico, i filtri di intent descrivono l'attività avviata all'avvio dell'applicazione. sono controllati in AndroidManifest.xml come descritto di seguito:

http://developer.android.com/guide/topics/intents/intents-filters.html

dove un esempio di applicazione blocco note è descritto:

Questo filtro dichiara il punto di ingresso principale nella Appunti applicazione. L'azione MAIN standard è un punto di ingresso che non richiede altre informazioni nell'Intent (ad esempio, nessuna specifica dei dati) e la categoria LAUNCHER dice che questo punto di ingresso dovrebbe essere elencato nell'avvio dell'applicazione.

0

Penso che la risposta di Jonathon stia andando nella giusta direzione. Dice che il sistema operativo si aspetta una certa struttura. C'è un nome per quella struttura che è una "macchina di stato". In questo caso Android lo chiama "ciclo di vita delle attività". Rob fornisce un collegamento alla documentazione che contiene un diagramma importante di quella macchina a stati sebbene il testo sia un po 'asciutto. Una ricerca rapida mi ha anche trovato il seguente link che lo spiega abbastanza chiaramente: http://www.android-app-market.com/android-activity-lifecycle.html

-2

In Java, c'è un main anche se non è elencato come main(). La pagina che si ottiene dopo il clic sull'icona, qualunque sia il suo nome, è main().

+1

[tag: Android] non è [tag: java] per iniziare, e anche in Java, quello che dici non è sempre vero: ad esempio Java ME [tag: midp] non ha 'main' e funziona bene – gnat

+0

JavaFX richiede anche nessun main. Dai, questo è solo sbagliato! – ThePerson

11

Ogni applicazione avrà la propria macchina virtuale. Per eseguire un'app, all'interno del suo spazio (VM), deve avere un metodo principale.

Le attività non sono le classi effettive da richiamare per l'avvio dell'applicazione. Esiste una classe chiamata Application, che sarà la classe radice per l'avvio di un'applicazione.

Se non esiste un metodo principale, come può una VM riconoscere come avviare un'app?

Framework ha classi denominate Process, VMRuntime che sono responsabili dell'avvio di un'applicazione. Che in effetti si occupano del metodo principale.

Per una migliore comprensione, studiare il servizio Zygote di Android. si occupa di Applicationmanager Service, ActivityStack Activity Threadd ecc.

+0

Nota: questo può essere visto come * Inversion Of Control *, dove Android FrameWork chiama i componenti delle applicazioni. Quindi, non hai bisogno di un metodo 'main()'. – TheLostMind

5

In realtà, questo tipo di modello non è peculiare di Android, ma accade ogni volta che si dispone di una struttura nel mezzo. Alcuni esempi di base sono le applet e i servlet Java. Alcune risposte forniscono già la risposta corretta, ma cercherò di elaborare un po '.

Quando si avvia un'applicazione Java, si avvia una JVM e quindi si deve caricare qualcosa in essa: quindi è necessario un metodo statico (il principale) perché non ci sono oggetti (ancora) che vivono nella JVM che è possibile fare riferimento a

Se si dispone di una sorta di framework nel mezzo, è il framework che avvierà la JVM e inizierà a popolarlo con i propri oggetti di servizio: scrivere il codice quindi significa scrivere i propri oggetti (che saranno sottoclassi di dato "modello"). I tuoi oggetti possono quindi essere iniettati (caricati) dal framework. Gli oggetti del servizio framework gestiscono il ciclo di vita degli oggetti iniettati chiamando i metodi del ciclo di vita definiti nella superclasse "modello".

Quindi, ad esempio, quando si fornisce un'applet a un browser, non si avvia un metodo main static: si fornisce solo una sottoclasse di java.applet.Applet che implementa alcuni metodi di istanza che fungono da callback per gestire il ciclo di vita (init, paint, stop ...). È il browser che avvierà la JVM, creare un'istanza necessaria per avviare un'applet, caricare l'applet e chiamarla.

Analogamente, con i servlet si sottoclasse la classe javax.servlet.http.HttpServlet e si implementano alcuni metodi di istanza (non statici) (doGet, doPost ...). Il contenitore Web (ad esempio Tomcat) avrà il compito di avviare la JVM, creare un'istanza necessaria per avviare un servlet, caricare il servlet e chiamarlo.

Il modello in Android è praticamente lo stesso: cosa si fa è creare una sottoclasse di android.app.Activity. Quando si avvia un'app, il sistema cerca nel manifest per scoprire quale attività deve essere avviata, quindi il "framework" lo carica e chiama i suoi metodi di istanza (onCreate, onPause, onResume ...).

3

Nei programmi Java è necessario un metodo main(), poiché durante l'esecuzione del codice byte la JVM cercherà il metodo main() nella classe e inizierà a eseguirlo.

In Android, la Dalvik Virtual Machine è progettata per trovare una classe che è una sottoclasse di Activity e che è impostata per avviare l'esecuzione dell'applicazione dal suo metodo onCreate(), quindi non è necessario un main () metodo.

L'ordine in cui Dalvik Virtual Machine chiama i metodi si basa su ordine di priorità chiamato Android ciclo di vita per ulteriori informazioni sul ciclo di vita Android controllare il link qui sotto Android del ciclo di vita: https://developer.android.com/guide/components/activities/activity-lifecycle.html