I have used Alarm Service. I have implemented the the alarm to run on every 1 minute. So the broadcast receiver onReceive method gets called even after the app quits. I want to implement a timer inside of this onReceive method. I have to start location tracking and wait for 20 Seconds after that I need to stop the location tracking.
I have tried the below,
TimerTask
Handler
Local Broadcast Receiver
But all the above not capable of running once the app quits.
Inside the alarm receiver I want to implement timer to wait for 20 seconds.
How can I achieve this when the app is in quit state?
My AlaramReceiver onReceive Method:
@Override
public void onReceive(Context context, Intent intent) {
mContext = context;
mSharedPrefManager = SharedPrefManager.getInstance(mContext);
mAppUtilInstance.logDebugMessage(TAG, "Track interval alarm receiver.");
// // Check the preference having any current activity
if (mSharedPrefManager.checkForCurrentActivityPref()) {
userActivity = mSharedPrefManager.getCurrentUserActivityPref();
if (mSharedPrefManager.getIsUserMovedPref()) {
// User MOVED
// Call the location service
LocationUpdateTimer locationUpdateTimer = new LocationUpdateTimer(
mContext, userActivity, true);
locationUpdateTimer.initialize();
mSharedPrefManager.setIsUserMovedPref(false);
} else {
// User not MOVED in between the track interval period. He is
// IDLE
// Check whether the location information is returned by the
// google API
if (mSharedPrefManager.checkForLocationEntityPref()
&& mSharedPrefManager.getLocationEntityPref()
.getLatitude().length() > 0) {
// Send the packet information to the Fleetilla server
StoreAndSendLocationInformation storeAndSendLocationInformation = new StoreAndSendLocationInformation(
mContext,
mSharedPrefManager.getLocationEntityPref(),
userActivity);
storeAndSendLocationInformation.storeAndSend();
} else {
// If the location information is not available
mAppUtilInstance
.logDebugMessage(TAG,
"Location information is not generated to store and send.");
}
}
}
}
Location Update Timer Class:
/**
* LocationUpdateTimer Constructor
*/
public LocationUpdateTimer(Context context, String userActivity,
boolean isTosend) {
// Save the context
mContext = context;
mUserCurrentActivity = userActivity;
isToSendLocationInfo = isTosend;
}
/**
* To start the location reporting
*/
private void startLocationReporting() {
if (mLocationProviderStatusListener != null) {
mLocationProviderStatusListener
.requestLocationProvidersToUpdateStatus(mConstants.EMPTY_STRING);
scheduleTimerTask();
}
}
/**
* To schedule the 20 seconds timer task to get the best location
* information and send it to Fleetilla server.
*/
private void scheduleTimerTask() {
bestGPSInfoTimerHandler = new Handler();
bestGPSInfoTimerHandler.postDelayed(bestGPSInfoRunnable,
Constants.TIMER_TASK_DELAY);
mAppUtilInstance.logDebugMessage(TAG,
"20 Sec Location Update TimerTask Scheduled");
}
/**
* To cancel the timer tack which was scheduled for 30sec location update
*/
private void cancelTimerTask() {
if (bestGPSInfoTimerHandler != null) {
mAppUtilInstance.logDebugMessage(TAG, "20 sec TimerTask canceled");
bestGPSInfoTimerHandler.removeCallbacks(bestGPSInfoRunnable);
bestGPSInfoTimerHandler = null;
}
}
/**
* A runnable will be called after the 20 sec time interval
*/
Runnable bestGPSInfoRunnable = new Runnable() {
@Override
public void run() {
// Called after 20 seconds
mAppUtilInstance.logDebugMessage(TAG,
"TimerTask running after 20 sec interval.");
stopLocationReporting();
cancelTimerTask();
if (isToSendLocationInfo) {
// Check whether the location information is returned by the
// google api
if (mSharedPrefManager.checkForLocationEntityPref()
&& mSharedPrefManager.getLocationEntityPref()
.getLatitude().length() > 0) {
// Send the packet information to the server
StoreAndSendLocationInformation storeAndSendLocationInformation = new StoreAndSendLocationInformation(
mContext,
mSharedPrefManager.getLocationEntityPref(),
mUserCurrentActivity);
storeAndSendLocationInformation.storeAndSend();
} else {
// If the location information is not available
mAppUtilInstance
.logDebugMessage(TAG,
"Location information is not generated to store and send.");
mAppUtilInstance
.broadcastStatusMessage(
mContext,
Constants.STATUS_MSG_127
+ "Location information is not generated to store and send.",
Constants.STATUS_CODE_127);
}
}
}
};