Выполнение планировщика заданий в 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.");
    }

}

}

0 ответов