I have an application using Chrome custom tabs
to open some links, I need to have event each second during all the time the user stay on Chrome, or know how many time he stay on Chrome. For me the only way to do it is to use a Service
. Is it possible to do it differently?

- 193
- 9
-
It sounds like you want to listen for an event that gets fired when the Custom Tab is closed. Is this correct? – ade Jun 02 '16 at 01:19
-
Yes it might work if I have the total time of the user's session in the callback, but the best will be to have an event each X time. – Dichoben Jun 02 '16 at 13:05
2 Answers
Create your YourBroadCastReceiver class as follows
public class YourBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("Called every 60 seconds","called");
}
}
After starting your custom tab successfully create Alarm PendingIntent that will trigger YourBroadCastReceiver once every 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);
after closing your custom tab never forget to cancel your PendingIntent
PendingIntent.getBroadcast(
context, _pendingIntentId, alarmIntent, 0).cancel();

- 975
- 9
- 28
For implementation of chrome custom tabs I've followed this tutorial, github link.
My solution basically rely on boolean and System.currentTimeMillis().
Step - 1 : Declare two class global variables,
private boolean isCustomTabsLaunched = false;
private long customTabsEnterTime;
Step - 2 : Set values for above to variables when 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 : Calculate stay time in onResume method.
@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);
}
In order to make code more robust you may like to store boolean isCustomTabsLaunched and long customTabsEnterTime in preferences or database so in any case these two params get destroyed as your activity may get destroy in background if user stay for long time in chrome custom tab.

- 5,097
- 1
- 35
- 58
-
1Thank you for your answer @Chitrang, the problem with your solution is if you kill the activity during chrome navigation, `onResume()` will never be call and you will lose the data :/ – Dichoben Jun 14 '16 at 14:59
-
How you're going to kill the activity? Or do you mean kill the application in that case no solution will work. – Chitrang Jun 14 '16 at 15:36