2016-05-31 26 views
17

Mam aplikację używającą Chrome custom tabs do otwierania niektórych linków, potrzebuję mieć wydarzenie co sekundę przez cały czas pozostawania użytkownika w Chrome lub wiedzieć, ile czasu pozostanie w Chrome. Moim jedynym sposobem na to jest użycie Service. Czy można to zrobić inaczej?Posłuchaj zdarzenia postępu na karcie niestandardowej Chrome

+0

Brzmi jak chcesz słuchać za zdarzenia, które pobiera opalane gdy Tab klienta jest zamknięty. Czy to jest poprawne? – ade

+0

Tak, może to działać, jeśli mam łączny czas sesji użytkownika w wywołaniu zwrotnym, ale najlepiej będzie mieć wydarzenie każdorazowo. – Dichoben

Odpowiedz

1

W celu implementacji niestandardowych zakładek Chrome skorzystałem z samouczka this, github link.

Moje rozwiązanie zasadniczo polegać na logicznych i System.currentTimeMillis().

Krok - 1: deklarujemy dwie klasy zmiennych globalnych,

private boolean isCustomTabsLaunched = false; 
    private long customTabsEnterTime; 

Etap - 2: Set wartości powyżej zmiennych kiedy 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); 
     } 
    }); 

krok - 3: Oblicz czas pobytu w metodzie 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); 
    } 

W celu uczynienia kodu bardziej wytrzymałe może chcesz zachować logiczną isCustomTabsLaunched i długą customTabsEnterTime w preferencjach lub bazy danych, tak w każdym razie te dwa params dostać zniszczone jako swoją aktywność może się zniszczyć w tle, jeśli pobyt użytkownika za długo czas w niestandardowej zakładce chrome.

+1

Dziękuję za odpowiedź @Chitrang, problem z rozwiązaniem polega na tym, że jeśli zabijesz aktywność podczas nawigacji w systemie chrome, funkcja 'onResume()' nigdy nie będzie wywoływana, a utracisz dane:/ – Dichoben

+0

Jak zamierzasz zabić czynność? Czy masz na myśli zabicie aplikacji w takim przypadku żadne rozwiązanie nie zadziała. – Chitrang

2

stworzyć swój YourBroadCastReceiver klasę następująco

public class YourBroadCastReceiver extends BroadcastReceiver { 

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

} 

Po uruchomieniu Twój zakładka zwyczaj powodzeniem tworzyć PendingIntent alarmową, która wyzwoli YourBroadCastReceiver raz na 60 sekund.

// 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); 

po zamknięciu swoją kartę niestandardową nigdy zapomnieć, aby anulować PendingIntent

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