2010-08-23 10 views
7

Esiste una semplice riga di codice che consentirebbe solo il caricamento del codice se la versione del sistema operativo soddisfa i requisiti?È possibile caricare solo righe di codice specifiche in base alla versione del sistema operativo Android?

Diciamo che ho il mio OS di destinazione come 2.2 ma il min sdk è 3 per Android 1.5 quindi anche se ho del codice nel mio progetto che non è compatibile con 1.5 verrà comunque compilato poiché il SO di destinazione è 2.2. Ad ogni modo, desidero pubblicare una funzione che richiede un codice che non sia nell'SDK 1.5 e causerà un arresto anomalo se è caricato su un telefono 1.5. C'è una cosa semplice come questa che posso fare? Quindi non devo rendere l'intera app non disponibile per 1,5 utenti?

if (Android OS == >2.1){ 
      //Insert code here that requires 2.1 and up} 
     else{ 
      //insert code that would appear is OS is <2.1} 
+0

Oltre alle vostre risposte, ecco alcuni progetti di esempio che dimostrano le tecniche: http://github.com/commonsguy/cw-advandroid/tree/ master/Contatti/Seleziona/http://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Spinners/ – CommonsWare

risposta

11

Sì, è possibile farlo. In realtà c'è più di un modo. (Nota: l'unica parte specifica di Android di questa risposta è il modo in cui si trova la versione della piattaforma.)

Supponiamo che la classe X abbia il metodo void y() nella versione 2.0 in poi, ma non prima.

Un modo per richiamare questo metodo senza introdurre alcuna dipendenza di tempo di compilazione di qualsiasi tipo è utilizzare la riflessione per individuare il metodo e chiamare invoke su di esso. Per esempio:

X x = ... 
if (BUILD.VERSION.RELEASE.compareTo("2.0") >= 0) { 
    // (exception handling omitted ...) 
    Method m = c.getClass().getDeclaredMethod("y"); 
    m.invoke(x); 
} 

Un altro modo è quello di creare un adattatore di compatibilità della versione API per l'applicazione in questo modo:

/** Version compatibility adapter API */ 
interface Compat { 
    void doY(); 
} 

/** Adapter class for version 1 */ 
class CompatV1 { 
    public void y(X x) { 
     // do nothing 
    } 
} 

/** Adapter class for version 2 */ 
class CompatV2 { 
    public void y(X x) { 
     x.y(); 
    } 
} 

// 
// Code to instantiate the relevant adapter for the current platform. 
// 
Class<?> compatClass; 
// (Exception handling omitted) 
if (BUILD.VERSION.RELEASE.compareTo("2.0") < 0) { 
    compatClass = Class.forName("...CompatV1"); 
} else { 
    compatClass = Class.forName("...CompatV2"); 
} 
// (Exception handling omitted) 
Compat compat = (Compat) compatClass.newInstance(); 

// The adapter object can be passed around as a parameter, wrapped 
// as a singleton or injected using dependency injection. 

// Invoke X.y() as follows: 

X x = ... 
compat.y(x); 

La seconda versione sembra un po 'pesante, ma ha il vantaggio che la dinamica (lento, non sicuro al testo) il codice viene eseguito solo una volta e che il codice specifico della versione è isolato dal resto del codice. Nella vita reale, probabilmente inserirai un certo numero di metodi nell'interfaccia dell'adattatore.

Questo approccio richiede un po 'più pensiero, per capire come progettare API compatibilità modo che isola in modo pulito le dipendenze versione dal resto del codice. Potrebbe anche essere necessario rivedere l'API dell'adattatore e creare nuove classi di adattatori per ogni nuova versione principale (incompatibile).

Infine, se i cambiamenti della piattaforma API che è necessario adattarsi a comportare utilizzando le classi o metodi nella versione precedente che sono rimosso nella versione più recente, allora si avrà bisogno di compilare i vari classi adattatore (ad esempio, il CompatV* classi) utilizzando diversi SDK Android. Ciò renderà i processi di compilazione piuttosto complicati.


Per altre "prende" su questo problema, leggere i seguenti articoli sul blog Android:

0

È possibile controllare con Build.VERSION.RELEASE, ti dà la versione attuale del sistema Android (1.5,1.6,2.1,2.2)

C'è più su Build.VERSION

Problemi correlati