Выполнение планировщика заданий в GCMListenerService
Я хочу, чтобы какой-то код (я использую jobscheduler для установки моего обычного сервиса) выполнялся после отправки уведомления. Кроме того, в моем GCMListenerService работает также LocationService.
Мне удалось запустить LocationService без каких-либо проблем. Однако, когда я также хочу выполнить свой JobService, когда я получаю onMessageReceived(), onStart() в моем JobService никогда не вызывается.
Я опубликую свой код и надеюсь, что вы поможете мне разобраться с тем, что не так с моим кодом, и заранее извините за мой беспорядок, а пока я просто надеюсь, что мой код будет запущен.
public class GCMPushReceiverService extends GcmListenerService {
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"onCreate de GCMPushReceiverService x elias");
mServiceComponent = new ComponentName(this, MyJobService.class);
mHandler = new IncomingMessageHandler(this);
LocalBroadcastManager.getInstance(this).registerReceiver(
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG,"llego al receive del broad");
mlatitud = intent.getStringExtra(MonitoreoLocationService.EXTRA_LATITUD);
mlongitud= intent.getStringExtra(MonitoreoLocationService.EXTRA_LONGITUD);
if (mlatitud != null && mlongitud!= null) {
Log.d(TAG, "Latitud: " + mlatitud + "\n Longitud: " + mlongitud);
}
}
}, new IntentFilter(MonitoreoLocationService.ACTION_LOCATION_BROADCAST)
);
startStep3();
}
@Override
public void onMessageReceived(String from, Bundle data) {
try {
Intent startServiceIntent = new Intent (this,MyJobService.class);
Messenger messengerIncoming = new Messenger(mHandler);
startServiceIntent.putExtra(MESSENGER_INTENT_KEY, messengerIncoming);
startService(startServiceIntent);
semaphore.acquire();
String message = data.getString("message");
Log.i("Push Receive", "onMessageReceived: " + message);
cargarSetDataNoticaciones();
setNotificacion.add(message);
JSONArray jsonArrayNotificacion = new JSONArray(setNotificacion);
editor.putString(getResources().getString(R.string.notificacion_preferences_campo_notificaciones_key), jsonArrayNotificacion.toString());
editor.commit();
//para sincronizar
cargarSetDataNoticacionesSincronizar();
setNotificacionSincronizar.add(message);
JSONArray jsonArrayNotificacionSincronizar = new JSONArray(setNotificacionSincronizar);
editor.putString(getResources().getString(R.string.notificacion_preferences_campo_notificaciones_sincronizar_key), jsonArrayNotificacionSincronizar.toString());
editor.commit();
//numMessages++;
sendNotification();
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
Log.i(TAG, "onMessageReceived: " + "error");
semaphore.release();
}
try {
JobInfo.Builder builder = new JobInfo.Builder(mJobId, mServiceComponent);
builder.setPeriodic(10000);
JobScheduler mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
if (mJobScheduler.schedule(builder.build()) == JobScheduler.RESULT_SUCCESS) {
Log.d(TAG, "Tarea RESULT_SUCCESS");
} else {
Log.d(TAG, "Hubo un error al mandar ejecutar la tarea");
}
}catch (SecurityException e){
Log.d(TAG, "Llegó al securityexception");
e.printStackTrace();
JobScheduler mJobScheduler = (JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE);
mJobScheduler.cancelAll();
}
}
private void startStep3() {
Log.d(TAG, "En startstep3");
//And it will be keep running until you close the entire application from task manager.
//This method will executed only once.
if (!mAlreadyStartedService) {
Log.d(TAG,"Servicio location empezado");
//Start location sharing service to app server.........
Intent intent = new Intent(this, MonitoreoLocationService.class);
startService(intent);
mAlreadyStartedService = true;
//Ends................................................
}
}
private static class IncomingMessageHandler extends Handler {
private WeakReference<GCMPushReceiverService> mPushReceiverService;
IncomingMessageHandler(GCMPushReceiverService pushReceiverService){
super();
Log.d(TAG,"En constructor IncomingMessageHandler");
this.mPushReceiverService = new WeakReference<GCMPushReceiverService>(pushReceiverService);
}
@Override
public void handleMessage(Message msg) {
GCMPushReceiverService gcmPushReceiverService = mPushReceiverService.get();
Log.d(TAG,"llegó al handlemessage");
if (!(gcmPushReceiverService == null)){
Log.d(TAG,"El PushReceiverservice no es vacio");
Message m;
switch (msg.what){
case MSG_JOB_EMPIEZA:
Log.d(TAG,"Job Empieza");
m = Message.obtain(this,MSG_JOB_TERMINA);
sendMessage(m);
Coordenada beanLocation = new Coordenada();
//formato fecha
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
Date date = new Date();
String strDate = dateFormat.format(date).toString();
//fin formato fecha
//formato tiempo
DateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
Date time = new Date();
String strTime = timeFormat.format(time).toString();
//fin formato tiempo
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
/*
Double xlatitud;
Double xlongitud;
xlatitud = Global.mlatitud;
xlongitud = Global.mlongitud;*/
//se setea uid automatico
beanLocation.setId(mDatabase.child("locations").push().getKey());
beanLocation.setLatitud(Double.parseDouble(mlatitud));
beanLocation.setLongitud(Double.parseDouble(mlongitud));
beanLocation.setUsuario("usuario prueba" );
beanLocation.setFecha(strDate);
beanLocation.setHora(strTime);
//se graba la información en firebase en el nodo padre 'locations'
mDatabase.child("locations").child(beanLocation.getFecha() +" - "+ beanLocation.getHora()).setValue(beanLocation);
mJobId++;
break;
case MSG_JOB_TERMINA:
Log.i(TAG,"Se grabaron los datos correctamente");
//Toast.makeText(mainActivity, "Se grabaron los datos correctamente", Toast.LENGTH_SHORT).show();
break;
}
}/*else{
Log.d(TAG,"El PushReceiverservice está vacio");
}*/
}
}
}
И это мой JobService:
public class MyJobService extends JobService{ private static final String TAG = MyJobService.class.getSimpleName(); private Messenger mActivityMessenger; @Override public void onCreate() { super.onCreate(); Log.i(TAG,"Servicio creado"); } @Override public void onDestroy() { super.onDestroy(); Log.i(TAG,"Servicio destruido"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG,"en onStartCommand"); //no está cogiendo nada esta variable de abajo!! mActivityMessenger = intent.getParcelableExtra(MESSENGER_INTENT_KEY); if(mActivityMessenger == null){ Log.d(TAG,"el mActivitymessenger es nulo"); }else{ Log.d(TAG,"el mactivitymsg no es nulo"); } return START_NOT_STICKY; } @Override public boolean onStartJob(final JobParameters jobParameters) { sendMessage(MSG_JOB_EMPIEZA,jobParameters.getJobId()); Log.i(TAG,"en Start Job: " /*+ jobParameters.getJobId()*/); Handler handler = new Handler(/*Looper.getMainLooper()*/); handler.postDelayed(new Runnable() { @Override public void run() { Log.i(TAG,"Llegó al metodo run() del handler" ); sendMessage(MSG_JOB_TERMINA,jobParameters.getJobId()); //Toast.makeText(JobSchedulerService.this,"Se grabó al Firebase "+jobParameters.getJobId(),Toast.LENGTH_SHORT).show(); jobFinished(jobParameters,false); } },100); return true; } @Override public boolean onStopJob(JobParameters jobParameters) { sendMessage(MSG_JOB_TERMINA,jobParameters.getJobId()); Log.i(TAG, "en Stop job: " + jobParameters.getJobId()); return true; } private void sendMessage(int messageID, @Nullable Object params){ Log.d(TAG,"Llegó al metodo sendMessage"); if(mActivityMessenger == null){ Log.d(TAG,"El servicio está unido, no inicializado. No hay un callback a quien enviar un mensaje"); return; } Message m = Message.obtain(); m.what = messageID; m.obj = params; try{ mActivityMessenger.send(m); Log.i(TAG,"Enviando mensaje"); }catch (RemoteException e){ Log.e(TAG,"Error passing service object back to activity."); } }
}