Получение Push-уведомлений, даже когда приложение убито - PullRequest
0 голосов
/ 22 мая 2018

Наше приложение использует сервер, который может отправлять push-уведомления на телефон.Но он может сделать это только тогда, когда приложение находится в фоновом режиме.Как только оно будет убито как фоновая задача (из диспетчера задач), уведомления больше не будут доставляться.Но как, например, WhatsApp делает это?Когда я закрываю WhatsApp из диспетчера задач, я все еще получаю уведомления о входящих сообщениях.

Что ж, хотя, может быть, мне поможет фоновая служба, вот что я сделал до сих пор:

private void StartServiceForPushs()
{
    Intent intent = new Intent(this, typeof(Activity_MainMenu));
    PendingIntent pendingIntent = PendingIntent.GetService(this, 0, intent, 0);
    AlarmManager alarm = (AlarmManager)GetSystemService(Context.AlarmService);
    alarm.SetRepeating(AlarmType.RtcWakeup, TimeUtils.CurrentTimeMillis(), 1 * 60000, pendingIntent);
}

Это должно настроить службу, которая проверяет push-уведомления каждые 1минута - но, к сожалению, это ничего не делает.Как только приложение будет полностью закрыто, сообщений больше не будет.Может ли кто-нибудь помочь мне здесь?

1 Ответ

0 голосов
/ 24 мая 2018

Хорошо, мне удалось решить эту проблему - это на самом деле довольно просто.Просто напишите службу, которая возвращает липкий результат команды запуска, например:

[Service]
    public class BackgroundService : Service
    {

        static readonly string TAG = "X:" + typeof(Activity_MainMenu).Name;

        static readonly int DELAY_BETWEEN_LOG_MESSAGES = 5000;
        static readonly int NOTIFICATION_ID = 10000;

        UtcTimestamper timestamper;
        Handler handler;
        Action runnable;

        public override void OnCreate()
        {
            base.OnCreate();


            timestamper = new UtcTimestamper();
            handler = new Handler();

            runnable = new Action(() =>
            {
                if (timestamper != null)
                {
                    handler.PostDelayed(runnable, DELAY_BETWEEN_LOG_MESSAGES);
                }
            });
        }

        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) // HIER DRIN MUSS GECALLED WERDEN!
        {
            DispatchNotificationThatServiceIsRunning();
            return StartCommandResult.Sticky;
        }

        public override IBinder OnBind(Intent intent)
        {
            return null;
        }

        public override void OnDestroy()
        {
            base.OnDestroy();
            OnCreate();
        }


        void DispatchNotificationThatServiceIsRunning()
        {
            Notification.Builder notificationBuilder = new Notification.Builder(this)
                .SetSmallIcon(Resource.Drawable.btn_bookoflifeMainMenu)
                .SetContentTitle(Resources.GetString(Resource.String.app_name))
                .SetContentText("TESTING");

            var notificationManager = (NotificationManager)GetSystemService(NotificationService);
            notificationManager.Notify(NOTIFICATION_ID, notificationBuilder.Build());
        }


    }

, а затем запустите службу из любого действия в вашем приложении (например, из главного меню).

Это будетприложение всегда будет работать в фоновом режиме - но после перезагрузки телефона, я думаю, приложение должно быть перезапущено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...