2016-05-31 30 views
17

Bazı bağlantıları açmak için Chrome custom tabs kullanarak bir uygulamam var. Kullanıcının Chrome'da kaldığı her saatte bir olaya sahip olması veya Chrome'da kaç kez kaldığını bilmem gerekiyor. Benim için bunu yapmanın tek yolu bir Service kullanmaktır. Bunu farklı yapmak mümkün mü?Krom özel sekme ilerleme olayını dinle

+0

iptal etmek asla unutmam. Bu doğru mu? – ade

+0

Evet, kullanıcının oturumunun toplam zamanını geri aramada kullanırsam işe yarayabilir, ancak en iyisi her X zamanındaki bir olaya sahip olmaktır. – Dichoben

cevap

1

Krom özel sekmelerin uygulanması için, this eğiticisini takip ettim, github link.

Çözümümün temelde boolean ve System.currentTimeMillis() güvenmektedir.

Adım - 1: iki sınıf global değişkenler bildirmek

private boolean isCustomTabsLaunched = false; 
    private long customTabsEnterTime; 

Adım - 2: Yukarıdaki değişkenlere launchUrl için ayar değerleri.

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

Adım - 3: hesaplayın onResume yönteminde zaman kalır.

@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); 
    } 

eğer etkinlik olsun arka planda yok olabilir, bu iki parametreler yok olsun her durumda böylece tercihleri ​​veya veritabanında Boole isCustomTabsLaunched ve uzun customTabsEnterTime saklamak isteyebileceğiniz kod daha sağlam hale getirmek için uzun süre kullanım kalmak chrome özel sekmesinde saat. Özel sekme başarıyla YourBroadCastReceiver kez her 60 saniyede tetikleyecek Alarm PendingIntent oluşturmak başlattıktan sonra

public class YourBroadCastReceiver extends BroadcastReceiver { 

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

} 

şöyle

+1

Cevabınız için teşekkür ederiz @Chitrang, çözümünüzle ilgili sorun, krom gezinme sırasında etkinliği durdurursanız, 'onResume()' asla arama yapmazsınız ve veri kaybedersiniz:/ – Dichoben

+0

Nasıl öldürüleceksiniz? aktivite? Yoksa uygulamayı öldürmek istemiyorsunuz, bu durumda çözüm işe yaramıyor. – Chitrang

2

senin YourBroadCastReceiver sınıf oluşturun.

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

özel sekmeyi kapattıktan sonra sizin PendingIntent Custom Tab kapatıldığında kovuluyor bir olayı dinlemek istediğiniz gibi geliyor

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