2012-07-17 3 views
20

Stavo inviando il logout al mio server quando l'utente ha spento il dispositivo. L'ordine degli eventi in 2.3 e 4.0.3 è il seguente. Quindi ora il logout è fallito.
dispositivo: Samsung Galaxy s2Android: rete radio disattivata prima dell'evento ACTION_SHUTDOWN.Ordine degli ordini modificato in ICS


Android: 2,3


1) Ricevere ACTION_SHUTDOWN
2) Invia un evento Logout, dormire per 5 secondi, LOG OUT inviata con successo
3) Dati Network Radio off event.
4) Dispositivo spento.


Android: 4.0.3


1) Radio Data Network off evento.
2) Ricevi ACTION_SHUTDOWN
3) Invia evento di disconnessione, LOG OUT FAIL Poiché la rete è inattiva.
Un modo per ottenere ACTION_SHUTDOWN prima della disattivazione di Data Network Radio?

risposta

0

Hai provato a utilizzare un Servizio per questo? È possibile registrare un servizio sempre in esecuzione in modo che quando riceve onDestroy() si sappia che la propria app viene uccisa e si esegue la richiesta di disconnessione.

Solo un'idea. Non so se il servizio onDestroy() venga chiamato prima che la rete vada giù, ma ci proverei per ogni evenienza.

0

Creare un servizio che riceve la trasmissione per l'arresto in questo modo:

public class MyAppShutdown extends BroadcastReceiver{ 
    private static final String TAG = "MyAppShutdown"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     Log.v(TAG, "onReceive - ++ ENTER ++"); 
     if (intent != null && intent.getAction().equals(Intent.ACTION_SHUTDOWN)){ 
      Log.v(TAG, "onReceive - ***] SHUTDOWN [***"); 
      // perhaps send a broadcast to your app via intent to perform a log out. 
      Intent intent = new Intent(); 
      intent.addAction("intent.myapp.action.shutdown"); 
      sendBroadcast(intent); 
     } 
     Log.v(TAG, "onReceive - ++ LEAVE ++");   
    } 
} 

Nella tua AndroidManifest.xml, Incorpora questo frammento di seguito all'interno dei <application> tag:

<receiver android:name=".MyAppShutdown"> 
    <intent-filter> 
     <action android:name="android.intent.action.SHUTDOWN"/> 
    </intent-filter> 
</receiver> 

Da l'attività della tua applicazione registrare un ricevitore di broadcast con il filtro appropriato per intenti:

public class myApp extends Activity{ 
    private myAppBroadcastRcvr myAppRcvr = new myAppBroadcastRcvr(); 
    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("intent.myapp.action.shutdown"); 
     registerReceiver(myAppRcvr, filter); 
    } 
    // Perhaps you have this 
    private void LogOff(){ 
    } 
    class myAppBroadcastRcvr extends BroadcastReceiver{ 
     @Override 
     public void onReceive(Context context, Intent intent){ 
      if (intent.getAction().equals("intent.myapp.action.shutdown")){ 
       LogOff(); 
      } 
     } 
    } 
} 
+0

Gli oklet danno per scontato che chiami LogOff(). Poiché la piattaforma Network Radio è spenta, non sono in grado di inviare dati !!! – NitZRobotKoder

+0

Sì! Mi sono in qualche modo reso conto dopo aver riletto di nuovo la tua domanda ... sono sorpreso, non posso credere che Android l'abbia cambiato, avrei pensato che la radio fosse l'ultima cosa da spegnere - mi spiace per il post sconclusionato perché non è quello che stai cercando per ... – t0mm13b

+0

thats Ok !! Sì, strano perché il comportamento è stato cambiato !! – NitZRobotKoder

1

Non sembra un comportamento vaniglia Android. Può essere che il produttore del tuo dispositivo abbia apportato alcuni miglioramenti interni al processo di spegnimento per accelerarlo.

È possibile vedere come viene gestito lo spegnimento a frameworks/base/services/java/com/android/server/pm/ShutdownThread.java#L296 sul ramo master corrente.

Tuttavia, come sviluppatore di applicazioni mobili non si deve fare affidamento su una connessione di rete costante.