как запустить фоновую работу при получении уведомления

привет всем, это мой первый вопрос здесь, поэтому я надеюсь получить ответ. У меня есть приложение для Android, и с помощью FCM я могу получать уведомления на переднем плане, в фоновом режиме и при закрытии приложения.

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {

final String jobTag="copyDb";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);

    String notification_title = remoteMessage.getNotification().getTitle();
    String notification_message = remoteMessage.getNotification().getBody();

    String click_action = remoteMessage.getNotification().getClickAction();

    String from_user_id = remoteMessage.getData().get("from_user_id");

    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle(notification_title)
                    .setContentText(notification_message);


    Intent resultIntent = new Intent(click_action);
    resultIntent.putExtra("user_id", from_user_id);


    PendingIntent resultPendingIntent =
            getActivity(
                    this,
                    0,
                    resultIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT
            );

    mBuilder.setContentIntent(resultPendingIntent);




    int mNotificationId = (int) System.currentTimeMillis();

    NotificationManager mNotifyMgr =
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    mNotifyMgr.notify(mNotificationId, mBuilder.build());

}

Я хочу запустить фоновую работу, когда придет уведомление, я использовал firebase jobDispatcher:

        SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("fromUser", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("fromUser",from_user_id);
    editor.commit();

    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(getApplicationContext()));
    Job myJob = dispatcher.newJobBuilder()
            .setService(jobDispatcher.class) // the JobService that will be called
            .setTag(jobTag)
            .build();

    dispatcher.mustSchedule(myJob);

Но это не работает, пока приложение находится в фоновом режиме или убито, но я получаю уведомление.

я попытался переместить фоновую задачу в FCM onMessageReceived и также получил ту же проблему.

есть ли способ запустить фоновую задачу при получении уведомления??

необычная благодарность за хороший ответ :))


person sleeman nabwani    schedule 09.01.2018    source источник
comment
Чтобы было ясно, вы хотите, чтобы при поступлении уведомления запустить AsyncTask и выполнить загрузку или обработку некоторых данных?   -  person Yupi    schedule 09.01.2018
comment
точно, кстати, уведомления приходят, когда приложение находится в фоновом режиме или убито. @Юпи   -  person sleeman nabwani    schedule 10.01.2018
comment
Тогда я думаю, вам нужно использовать службы и запустить AsyncTask внутри.   -  person Yupi    schedule 10.01.2018
comment
действительно, но как заставить службу прослушивать уведомления FCM? @Юпи   -  person sleeman nabwani    schedule 10.01.2018
comment
Когда сообщения получены, запустите службы и в postExecute из AsyncTask остановите службы. Я думаю, это может сработать   -  person Yupi    schedule 10.01.2018
comment
я не думаю, что вы меня понимаете, когда я нахожусь на переднем плане, FCM успешно вызывается, а внутри него я вызываю фоновую службу, которая загружает данные с сервера. если приложение находится в ФОНЕ, Google выполняет свою работу и доставляет мне уведомление, НО оно не вызывает FCM (код). поэтому проблема в том, как узнать, когда сообщение получено (в фоновом режиме) @Yupi   -  person sleeman nabwani    schedule 10.01.2018
comment
AsyncTask не равно Services. Например, Services можно вызывать или запускать, даже если приложение убито ОС. Посмотрите: developer.android.com/guide/components/services.html   -  person Yupi    schedule 10.01.2018
comment
Я ценю ваши ответы, чувак, есть ли способ запустить службу, когда я получу уведомление, даже если я не нажимал ее? @Юпи   -  person sleeman nabwani    schedule 10.01.2018
comment
@sleemannabwani, вы нашли какие-нибудь обновления по этому поводу? Мне также нужны эти функции для запуска определенной задачи, когда клиент получил сигнал от сервера [например, FCM]   -  person Aravindh Kumar    schedule 06.02.2020


Ответы (1)


Я не уверен, что это сработает, но вы можете попробовать. Создайте класс и расширьте Service, а внутри создайте create AsyncTask, например, что-то вроде этого:

public class TestServices extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    MyAsyncTask asyncTask = new MyAsyncTask();
    asyncTask.execute();
    return START_NOT_STICKY;
}
private class MyAsyncTask extends AsyncTask<Void, Void, Void>{
    @Override
    protected Void doInBackground(Void... voids) {
        // preform your task here, downloading saving etc.
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Intent intent = new Intent(TestServices.this, TestServices.class);
        stopService(intent);
       }
    }
 }

Не забудьте зарегистрировать свой класс Service внутри манифеста.

Затем внутри метода onMessageReceived внесите некоторые изменения. Попробуй это:

Intent notificationIntent = new Intent(mContext, TestServices.class);
PendingIntent pendingIntent = PendingIntent.getService(mContext, 0,    notificationIntent, 0);

Надеюсь, это может помочь вам.

person Yupi    schedule 11.01.2018