I'm using GCMNetworkManager
to load some data or set some data into a database.
But for some reason, the tasks do not run if my application gets killed (in taskmanager or because of memory reasons).
Is there a posibility to run the tasks even if the application is dead?
Here is my code to enable the tasks:
public void enableTasks(Context context) {
GcmNetworkManager networkManager = GcmNetworkManager.getInstance(context);
scheduleTask(networkManager, BackgroundTasks.WORK_THROUGH_QUEUE);
scheduleTask(networkManager, BackgroundTasks.LOAD_MONTAGEORDERS);
scheduleTask(networkManager, BackgroundTasks.UPDATE_MONIINFO);
PreferenceDao.getInstance().setTasksSet(true);
}
private void scheduleTask(GcmNetworkManager networkManager, String taskTag) {
Task task = BackgroundTasks.getTask(taskTag);
if (task != null) {
networkManager.schedule(task);
}
}
The class BackgroundTasks
@Override
public int onRunTask(TaskParams taskParams) {
Log.i(TAG, "Task runs: " + taskParams.getTag());
try {
switch (taskParams.getTag()) {
case WORK_THROUGH_QUEUE:
workThroughQueues();
return GcmNetworkManager.RESULT_SUCCESS;
case LOAD_MONTAGEORDERS:
MainController.getInstance().getMontageOrderController().refreshMontageOrders();
return GcmNetworkManager.RESULT_SUCCESS;
case UPDATE_MONIINFO:
UpdateHelper.getInstance().updateInfos();
return GcmNetworkManager.RESULT_SUCCESS;
default:
return GcmNetworkManager.RESULT_FAILURE;
}
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
return GcmNetworkManager.RESULT_FAILURE;
}
}
public static Task getTask(String taskTag) {
switch (taskTag) {
case WORK_THROUGH_QUEUE:
return buildTask(taskTag, 300L, 60L);
case LOAD_MONTAGEORDERS:
return buildTask(taskTag, 900L, 60L);
case UPDATE_MONIINFO:
return buildTask(taskTag, 1800L, 120L);
default:
return null;
}
}
private static Task buildTask(String tag, long period, long flex) {
return new PeriodicTask.Builder()
.setTag(tag)
.setPeriod(period)
.setFlex(flex)
.setService(BackgroundTasks.class)
.setRequiredNetwork(Task.NETWORK_STATE_CONNECTED)
.setPersisted(true)
.setUpdateCurrent(true)
.build();
}
Service in AndroidManifest.xml
<service
android:name=".BroadcastReceiver.BackgroundTasks"
android:exported="true"
android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
<intent-filter>
<action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" />
</intent-filter>
</service>