Intento e Parcelable object Android

Perché devo compilare il mio object anche se ho solo bisogno di inviarlo ad un altro thread dello stesso task? In realtà ho bisogno di aprire un'attività che verrà eseguita anche sullo stesso thread (il thread principale).

In altre parole, perché Google non ha fornito una versione di startActivity che prende un parametro di annuncio generico dell'object anziché un pacchetto per consentirmi di iniziare un'attività nel caso in cui lo so che è nello stesso process o (la maggior parte delle volte) anche lo stesso thread (il principale)?

  • Come consentire all'utente di submit un'image su Wall utilizzando la cartella SDCard
  • Ottieni IP da hotspot wifi in android
  • Posiziona ImageView sopra Button android
  • Imansible rilevare Sony Xperia in Eclipse
  • ffmpeg per Android (usando il tutorial: "ffmpeg e Android.mk")
  • Perché dichiarare un argomento function per essere definitivo?
  • La conversione in formato Dalvik non è rioutput con l'errore 1 - Esport APK
  • Come rimuovere lo spazio superiore e inferiore sulla visualizzazione di text di Android
  • Lancio del gestore Android SDK - La directory di strumenti non esiste? Mac
  • Modifica model Autore in Android Studio
  • Disegna WebView in una canvas in Android-L
  • Ottenere l'elenco delle sottocartelle nome e file nome nel pacchetto sorgente android
  • 5 Solutions collect form web for “Intento e Parcelable object Android”

    Non è necessario utilizzare Parcelable per passare un object da un'attività all'altra. È ansible memorizzare un riferimento all'object in una variabile membro statica, come questo:

    public class Globals { public static MyObject myObject; } 

    Ora, nel codice che ha l'object, fai semplicemente:

     Globals.myObject = object; 

    e nella nuova attività, puoi farlo così:

     doSomethingWith(Globals.myObject); 

    Ora, dopo aver detto, è necessario essere consapevoli di quanto segue:

    Android può uccidere il tuo process se la tua applicazione è in background praticamente each volta che vuole. Quando l'utente torna all'applicazione, Android creerà un nuovo process per la tua applicazione e ricrea quindi solo l'attività che era in cima all'attività stack (cioè quella che stava mostrando). In tal caso, l'attività appena creata non sarà in grado di get l'iobject accedendo a Globals.myObject perché il process è stato creato di recente e che la variabile membro è nullo.

    Per aggirarlo puoi:

    1. Determinate che il process sia stato ucciso e riavviato (controllando Globals.myObject == null e reactjs di conseguenza – Informi l'utente di cui ha bisogno per tornare indietro o torna indietro o mostri un dialogo o qualsiasi altra cosa)
    2. Salvare l'object quando Android chiama onSaveInstanceState() nell'attività (che Android farà prima di submit l'applicazione allo background) e ripristinare l'object in onCreate()

    Speriamo che sia entrambi risponda alla tua domanda e spiega cosa fare.

    EDIT: Aggiunta di ulteriori informazioni sul perché gli intenti contengono oggetti serializzati (Parcelable) e non gli stessi oggetti

    1. Quando si chiama startActivity() o startService() Android potrebbe finire per avviare l'attività o il servizio in un altro process. In questo caso, se hai passato un object nell'intento, Android avrebbe in qualche modo bisogno di serializzare l'object per passarlo all'altro process. A causa della "risoluzione implicita implicita" utilizzata da Android per determinare quale componente viene gestito l'intento, il chiamante può o non sapere quale componente inizierà.

    2. Android salva il contenuto degli Intenti per vari motivi:

      A. Android può uccidere un process in qualsiasi momento. Se lo fa e l'utente desidera tornare all'applicazione, Android crea un nuovo process e ricrea le attività in quel process come necessario. Per creare le attività Android ha anche bisogno di rendere disponibili gli intenti alle attività. Se il process è stato ucciso, gli eventuali "oggetti" negli Intenti dovrebbero essere salvati e ripristinati. Poiché gli intenti contengono oggetti serializzati, non è un problema per ricrearli come necessario. B. In attesa di intenti sono utilizzati da Android come un modo per il sistema operativo di agire come proxy per il mittente di un intento. Una componente Android può creare un PendingIntent e dare a tale sistema il sistema operativo in modo che possa triggersre l'invio di tale intento in un momento successivo. Il componente di invio può o non essere attivo al momento in cui il PendingIntent è effettivamente inviato. Ciò significa che qualsiasi object che potrebbe essere passato in un PendingIntent deve essere in grado di essere serializzato in modo che Android possa mantenerlo anche se il componente chiamante non esiste più.

    3. Gli intenti non sono intesi come un meccanismo generale "passaggio di parametri" tra i componenti. Naturalmente puoi utilizzarlo in questo modo, ma puoi anche usare altri meccanismi (più facili). All'interno di un determinato process è ansible passare oggetti utilizzando meccanismi Java standard. Non c'è niente di sbagliato nell'utilizzo di variables statiche (class).

    La documentazione ufficiale di Android (nella FAQ) fornisce molte informazioni su come passare strutture di dati complesse.

    Come faccio a passare i dati tra Attività / Servizi all'interno di una singola applicazione? http://developer.android.com/guide/faq/framework.html#3

    Tipi di dati primitivi

    Per condividere dati primitivi tra Attività / Servizi in un'applicazione, utilizzare Intent.putExtras (). Per il passaggio di dati primitivi che deve persistere utilizzare il meccanismo di memorizzazione Preferenze. Oggetti non persistenti

    Per la condivisione di oggetti complessi non persistenti per utente a breve durata, si suggeriscono i seguenti approcci:

    Singleton class

    È ansible trarre vantaggio dal fatto che i componenti delle applicazioni eseguono nello stesso process tramite l'uso di un singolo. Questa è una class che è progettata per avere solo un'istanza. Ha un metodo statico con un nome come getInstance () che restituisce l'istanza; la prima volta che questo metodo viene chiamato, crea l'istanza globale. Poiché tutti i chiamanti ricevono la stessa istanza, possono utilizzare questo come punto di interazione. Ad esempio, l'attività A può recuperare l'istanza e la chiamata setValue (3); l'attività successiva B può recuperare l'istanza e call getValue () per recuperare l'ultimo valore impostato.

    Un field statico pubblico / metodo

    Un modo alternativo per rendere accessibili i dati tra attività / servizi è utilizzare campi e / o methods statici pubblici. È ansible accedere a questi campi statici da qualsiasi altra class dell'applicazione. Per condividere un object, l'attività che crea l'object imposta un field statico per puntare a questo object e qualsiasi altra attività che vuole utilizzare questo object accede solo a questo field statico.

    Un HashMap di WeakReferences agli Oggetti

    È inoltre ansible utilizzare un HashMap di WeakReferences per oggetti con tasti Long. Quando un'attività desidera passare un object ad un'altra attività, mette semplicemente l'object nella mappa e invia l'elemento chiave (che è un unico lungo basato su un contatore o un timestamp) all'attività destinataria tramite gli extra intenti. L'attività del destinatario recupera l'object utilizzando questa chiave.

    Oggetti persistenti

    Anche mentre un'applicazione sembra continuare a funzionare, il sistema può scegliere di uccidere il process e di riavviarlo più tardi. Se hai dei dati da persistere da un'attività di invocazione all'altra, devi rappresentare questi dati come stato salvati da un'attività quando viene informato che potrebbe andare via.

    Per la condivisione di oggetti complessi persistenti utente persistenti, si suggeriscono i seguenti approcci:

     - Application Preferences - Files - contentProviders - SQLite DB 

    Se i dati condivisi devono essere conservati in punti in cui è ansible uccidere il process di applicazione, inserire i dati in un archivio persistente come Preferenze di applicazione, SQLite DB, File o ContentProviders. Per ulteriori informazioni sull'utilizzo di questi componenti, fare riferimento alla sezione Memorizzazione dati.

    Perché questo è necessario:

    A causa della capacità unica di Android di multitask e dell'idea di loops di vita dei componenti. Per consentire a un utente di lasciare un'applicazione (per esempio con Attività A, B e C e intenti i1, i2, i3) Il sistema separa l'applicazione in componenti .

    In questo modo, se l'utente avvia l'attività B utilizzando l'intento i2, ma ottiene una chiamata telefonica o controlla la propria posta elettronica, può tornare all'attività B e il sistema Android può redeliver l'intento i2. E l'utente può facilmente e senza soluzione di continuità riprenderci where sono partiti nella tua app.

    Con i loops di vita del componente si rende molto più facile entrare ed uscire ad each singolo componente. Consente inoltre la comunicazione asynchronous tra diversi tipi di componenti come BroadcastReceivers , Services e Activities .

    Per fare questo, il sistema operativo fa quello che viene chiamato " marshalling ". Si appiattisce i dati a tipi di dati primitivi (come int e char ) in modo che possa essere facilmente memorizzato o scritto in archiviazione temporanea per recuperare in seguito.

    Inoltre, questo è richiesto per qualsiasi tipo di IPC (comunicazione interprocessuale).

    L'utilizzo di un Intent consente a uno sviluppatore di lasciare che il sistema operativo Android esegua la marshalling – che normalmente sarebbe noioso (e forse difficile o buggy).

    Tutte le attività, si crea eseguire solo sul thread UI. Non c'è altro modo. Per quanto riguarda la tua domanda sulla necessità di compilare i tuoi oggetti, in realtà non è l'unico modo. È ansible passare gli oggetti rendendo gli oggetti implementare anche l'interface Serializable.

    A livello elevato, Intents è un meccanismo di messaggistica asynchronous per la comunicazione tra diversi componenti come: attività, servizi e ricevitori di trasmissione. Il componente di origine e destinazione può essere o less parte della stessa applicazione (quindi process) e del framework Android richiede un modo standardizzato di passare gli oggetti attraverso i processi, se necessario.

    Android richiede che tutti gli oggetti che passate tra attività, attività, thread o servizi devono essere appiattiti in un Parcel o implementare Serializable . Lo fanno in modo che tu possa passare l'object per valore. Quando si passano oggetti a methods o funzioni, si passa per riferimento. Gli intenti vengono passati al sistema e il sistema determina where percorrere l'intenzione, se inizia una delle tue attività o forse apre un'altra app.

    Nel caso in cui l'object ricevente non fa parte della tua applicazione, il destinatario non avrà accesso alla memory dell'app. Per questo motivo, passare un riferimento di Oggetto potrebbe causare l'arresto dell'applicazione ricevente. Spianando l'object a un pacco o un block Serializable, il ricevitore può agire sui valori inviati senza avere l'accesso al riferimento originale. Se Google wheresse implementare una struttura in cui è ansible passare un object di base, ciò richiederebbe loro di scrivere funzioni di copia in profondità per tutti gli oggetti e dovresti scrivere funzioni di copia profonda per tutti i tuoi oggetti personalizzati che verrebbero davvero disordinati, lenti e richiederebbe un po 'di memory di sistema che potrebbe overflow il VM. Fornendo una struttura di base comune per la trasmissione di oggetti, è in grado di accelerare le performance, ridurre i requisiti di memory e garantire la sicurezza, impedendo alle altre applicazioni di fare riferimento alla memory dell'app.

    Come già accennato in precedenza, è ansible creare riferimenti globali all'object che si desidera passare tra le attività finché sono tutte parte dell'applicazione. Non è la soluzione più elegante e richiede di annullare i riferimenti quando hai finito con loro in modo da non mangiare la memory non necessaria ma funziona abbastanza bene.

    Per passare gli oggetti di class personalizzati tra Attività / Servizi / etc. utilizzando Bundle all'interno di Intent , la class deve Parcelable implementare Parcelable o Serializable .

    Questo è il motivo per cui è necessario compilare il proprio object prima di spingerlo in Bundle

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.