2016-05-31 5 views
17

У меня есть приложение, использующее Chrome custom tabs, чтобы открыть некоторые ссылки, мне нужно иметь событие каждую секунду в течение всего времени пребывания пользователя в Chrome или знать, сколько раз он остается в Chrome. Для меня единственный способ сделать это - использовать Service. Можно ли сделать это по-другому?Прослушать хром пользовательский вкладка события события

+0

Это звучит, как вы хотите прослушивать событие, которое увольняет, когда Пользовательская вкладка закрывается. Это верно? – ade

+0

Да, это может сработать, если у меня есть общее время сеанса пользователя в обратном вызове, но лучше всего будет иметь событие каждый Х-время. – Dichoben

ответ

1

Для реализации пользовательских вкладок chrome я следил за this учебником, github link.

Мое решение в основном полагаться на булевыми и System.currentTimeMillis().

Шаг - 1: Объявляет глобальные переменные два класса,

private boolean isCustomTabsLaunched = false; 
    private long customTabsEnterTime; 

Шаг - 2: Установка значений для выше переменных при 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); 
     } 
    }); 

Шаг - 3: Вычислить время пребывания в методе 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); 
    } 

Для того, чтобы сделать код более надежным вы можете, как хранить булево isCustomTabsLaunched и долго customTabsEnterTime в настройках или базы данных, так что в любом случае эти два PARAMS разрушаться, как ваша деятельность может получить уничтожить в фоновом режиме, если пользователь пребывания долго время в хромированной пользовательской вкладке.

+1

Спасибо за ваш ответ @Chitrang, проблема с вашим решением заключается в том, что вы убиваете активность во время навигации по хромированию, 'onResume()' никогда не будет вызывать, и вы потеряете данные:/ – Dichoben

+0

Как вы собираетесь убить Мероприятия? Или вы хотите убить приложение, тогда решение не будет работать. – Chitrang

2

Создать свой YourBroadCastReceiver класс следующим образом

public class YourBroadCastReceiver extends BroadcastReceiver { 

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

} 

После запуска пользовательская вкладка успешно создать Alarm PendingIntent, который будет запускать YourBroadCastReceiver один раз каждые 60 сек.

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

после закрытия пользовательской вкладки не забудьте отменить вашему PendingIntent

PendingIntent.getBroadcast(
     context, _pendingIntentId, alarmIntent, 0).cancel(); 
Смежные вопросы