Запуск API каждую секунду в фоновом режиме после того, как приложение Android будет убито в версии Oreo - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь создать приложение для Android, которое будет запускаться каждую секунду, а когда приложение закрыто или убито, оно также должно непрерывно работать в фоновом режиме.Когда условие ответа API выполнено, должно отображаться Локальное уведомление ..

Я использовал класс обслуживания для фоновой задачи.Он работал нормально во всех версиях, за исключением версии Oreo (8.1v)

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

Итак, я попытался использовать startForeground (), тогда он также не работает, после многих попыток, наконец, я задаю этот вопрос здесь.

ИтакПожалуйста, помогите мне запустить API в фоновом режиме, когда приложение закрыто.

MainActivty.class

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            ContextCompat.startForegroundService(this, new Intent(this,MyService.class));
        } else {
            startService(new Intent(this,MyService.class));
        }
}

MyService.class

public class MyService extends Service {

    public static final int notify = 3000;  //interval between two services(Here Service run every 5 Minute)
    private Handler mHandler = new Handler();   //run on another Thread to avoid crash
    private Timer mTimer = null;    //timer handling

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        if (mTimer != null) // Cancel if already existed
            mTimer.cancel();
        else
            mTimer = new Timer();   //recreate new
        mTimer.scheduleAtFixedRate(new TimeDisplay(), 0, notify);   //Schedule task

    }

    //class TimeDisplay for handling task
    class TimeDisplay extends TimerTask {
        @Override
        public void run() {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    new ApiCallAsyncTask().execute(URL);
                }
            });
        }
    }
}

Метод уведомления, который вызывается в классе ApiCallAsyncTask

Notification notif;
@TargetApi(Build.VERSION_CODES.O)
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void notification(String Name, String time,String mId,int id){
    Intent intent = new Intent(MyService.this, MainActivity.class);
    String CHANNEL_ID = String.valueOf(id);

    PendingIntent pendingIntent = PendingIntent.getActivity(MyService.this, 100, intent, PendingIntent.FLAG_ONE_SHOT);
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

        NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, Name, NotificationManager.IMPORTANCE_DEFAULT);
        notif = new Notification.Builder(MyService.this)
                .setContentIntent(pendingIntent)
                .setContentTitle("Reminder")
                .setContentText("hello")
                .setSmallIcon(R.drawable.logo)
                .setOnlyAlertOnce(true)
                .setColor(ContextCompat.getColor(MyService.this, R.color.colorPrimaryDark))
                .setChannelId(CHANNEL_ID)
                .build();
        notificationManager.createNotificationChannel(mChannel);
    }else {
        notif = new Notification.Builder(MyService.this)
                .setContentIntent(pendingIntent)
                .setContentTitle("Reminder")
                .setContentText("hello")
                .setSmallIcon(R.drawable.logo)
                .setOnlyAlertOnce(true)
                .setColor(ContextCompat.getColor(MyService.this, R.color.colorPrimaryDark))
                .build();

    }
    notif.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(id, notif);
    startForeground(1, notif);
}

Спасибо ..

1 Ответ

0 голосов
/ 29 ноября 2018

Можно использовать сочетание JobIntentService + AlarmManager (для планирования) или JobScheduler API .

Но я настоятельно рекомендую заменить ваш подход на Firebase Cloud Messaging .Таким образом, вы разместите бизнес-логику на стороне сервера и уведомите клиентов в особых случаях.

...