2016-05-31 9 views
17

Ho un'applicazione che utilizza Chrome custom tabs per aprire alcuni collegamenti, ho bisogno di avere un evento ogni secondo durante tutto il tempo in cui l'utente rimane su Chrome, o sapere quante volte rimane su Chrome. Per me l'unico modo per farlo è usare uno Service. È possibile farlo in modo diverso?Ascolta cronologia personalizzata cruscotto evento evento

+0

Sembra che si desidera ascoltare per un evento che viene attivato quando la scheda personalizzata è chiuso. È corretto? – ade

+0

Sì, potrebbe funzionare se ho il tempo totale della sessione dell'utente nel callback, ma il migliore sarà avere un evento ogni volta X. – Dichoben

risposta

1

Per l'implementazione delle schede personalizzate di Chrome ho seguito il tutorial this, github link.

La mia soluzione fondamentalmente si basano su booleane e System.currentTimeMillis().

Step - 1: dichiarare variabili globali due classi,

private boolean isCustomTabsLaunched = false; 
    private long customTabsEnterTime; 

Step - 2: Impostare i valori per le variabili di cui sopra per quando launchUrl.

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Log.d(TAG, "FloatingActionButton"); 
      // Launch Chrome Custom Tabs on click 
      customTabsIntent.launchUrl(CustomTabsActivity.this, Uri.parse(URL)); 
      isCustomTabsLaunched = true; 
      customTabsEnterTime = System.currentTimeMillis(); 
      Log.d(TAG, "customTabsEnterTime = " + customTabsEnterTime); 
     } 
    }); 

Step - 3: Calcolare periodo di permanenza in metodo onResume.

@Override 
    protected void onResume() { 
     super.onResume(); 
     Log.d(TAG, "onResume"); 
     if (isCustomTabsLaunched) { 
      isCustomTabsLaunched = false; 
      calculateStayTime(); 
     } 
    } 

    private void calculateStayTime() { 
     long customTabsExitTime = System.currentTimeMillis(); 
     Log.d(TAG, "customTabsExitTime = " + customTabsExitTime); 
     long stayTime = (customTabsExitTime - customTabsEnterTime)/1000; //convert in seconds 
     Log.d(TAG, "stayTime = " + stayTime); 
    } 

Al fine di rendere il codice più robusto come si può memorizzare isCustomTabsLaunched booleano e lunga customTabsEnterTime nelle preferenze o database in modo, in ogni caso queste due params vengono distrutti come la vostra attività può diventare distruggere in background se il soggiorno utente a lungo ora nella scheda personalizzata di Chrome.

+1

Grazie per la tua risposta @Chitrang, il problema con la tua soluzione è se uccidi l'attività durante la navigazione di Chrome, 'onResume()' non sarà mai chiamata e perderai i dati:/ – Dichoben

+0

Come stai per uccidere il attività? O vuoi dire uccidere l'applicazione in quel caso nessuna soluzione funzionerà. – Chitrang

2

Creare la YourBroadCastReceiver classe come segue

public class YourBroadCastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i("Called every 60 seconds","called"); 
    } 

} 

Dopo aver iniziato la scheda personalizzata creare con successo PendingIntent allarme che attiveranno YourBroadCastReceiver una volta ogni 60 sec.

// Retrieve a PendingIntent that will perform a broadcast 

    Intent repeatingIntent = new Intent(context, 
      YourBroadCastReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
      context, _pendingIntentId, alarmIntent, 0); 

    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    // Set the alarm to start at 10:00 AM 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 

    manager.setRepeating(AlarmManager.RTC_WAKEUP, 
      calendar.getTimeInMillis(), 60 * 1000, // repeat for every 60 seconds 
      pendingIntent); 

dopo aver chiuso la vostra scheda personalizzata mai dimenticare di cancellare la vostra PendingIntent

PendingIntent.getBroadcast(
     context, _pendingIntentId, alarmIntent, 0).cancel(); 
Problemi correlati