AlarmManager не вызывается - PullRequest
0 голосов
/ 21 июня 2019

У меня установлен аварийный сигнал, при котором приемник запускает службу переднего плана, которая отправляет данные на базу данных каждые несколько секунд. Служба убивается при включении экрана (я зарегистрировал приемник экрана). Когда служба убита, я установил еще один будильник через 20 секунд. Я отправляю метку времени, когда служба запускается или уничтожается (в методах onCreate () и onDestroy ()). Когда я проверял пожарную базу, был интервал в 6 часов, в течение которого сигнал тревоги вообще не вызывался. Это из базы данных:

2019-06-20 21:25:08 начало

2019-06-20 21:25:08 окончен

2019-06-20 21:25:29 начало

2019-06-20 21:25:29 закончено

2019-06-20 21:25:49 начало

2019-06-20 21:35:26 окончен

2019-06-21 03:47:46 началось

2019-06-21 08:48:02 окончен

2019-06-21 08:48:47 начало

2019-06-21 08:55:55 окончено

2019-06-21 08:56:15 начало

2019-06-21 08:56:15 окончено

AlarmReceiver.java:

if (PendingIntent.getBroadcast(context, 0, intentService, PendingIntent.FLAG_NO_CREATE) == null) {


   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          context.startForegroundService(intentService);
    } else {
          context.startService(intentService);
            }

    }

MyService.java:

public void onCreate() {
        super.onCreate();
        Log.d("created","service");
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "MyApp::MyWakelockTag");
        wakeLock.acquire();
        mDatabase = FirebaseDatabase.getInstance().getReference();
        username = sharedPreferences.getString("Username","invalid");

        mDatabase.child(username).child("ServiceData").push().setValue("started");


    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if(intent != null)
        {
            if(mReceiver!=null){
                unregisterReceiver(mReceiver);
            }

            PendingIntent pendingIntent =
                    PendingIntent.getActivity(this, 0, intent, 0);
            Notification notification =
                new NotificationCompat.Builder(this, getString(R.string.channelId))
                        .setContentTitle("CureFit")
                        .setContentText("Foreground process running")
                        .setSmallIcon(R.drawable.curefit)
                        .setContentIntent(pendingIntent)
                        .setColor(getResources().getColor(R.color.colorPrimaryDark))
                        .build();
            startForeground(1, notification);
            PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
            if(powerManager.isScreenOn())
                stopSelf();

            initializeSensorManager();
            final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            mReceiver = new ScreenReceiver();
            registerReceiver(mReceiver, filter);
            Log.d("Started ", "foreground ");
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
            username = sharedPreferences.getString("Username","invalid");
        }
        return super.onStartCommand(intent, flags, startId);
    }
    private void initializeSensorManager() {
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor mAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_FASTEST);

    }


    @Override
    public void onSensorChanged(SensorEvent event) {
                //Log.d("Sensor","changed");
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                if (prevValues == null
                        ||  Calendar.getInstance().getTimeInMillis()-prevTime >8000){



                        prevValues[0] = event.values[0];
                        prevValues[1] = event.values[1];
                        prevValues[2] = event.values[2];
                        Log.d("", "LOG SENSOR CHANGE");
                        Double sensorValue = MathUtil.magnitude(prevValues);
                        Calendar calendar = Calendar.getInstance();
                        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
                        SharedPreferences.Editor editor = sharedPreferences.edit();
                        prevTime = calendar.getTimeInMillis();
                        editor.putLong("Last_sent", calendar.getTimeInMillis());
                        editor.putFloat("Last_data_sent", (float) MathUtil.magnitude(prevValues));
                        editor.apply();
                        Log.d("accelerometer value", String.valueOf(MathUtil.magnitude(prevValues)));

                        try {
                            //String id = mDatabase.child(username).push().getKey();
                            long timestamp = calendar.getTimeInMillis();
                            Record r = new Record(timestamp, sensorValue);
                            mDatabase.child(username).child("data").push().setValue(r);
//                            myOutWriter.append(String.valueOf(timestamp));
//                            myOutWriter.append("\n");

                        } catch (Exception e) {
                            e.printStackTrace();
                            NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "1st channel")
                                    .setSmallIcon(R.drawable.curefit)
                                    .setContentTitle("Sleep tracker")
                                    .setContentText(e.getMessage())
                                    .setPriority(NotificationCompat.PRIORITY_DEFAULT);
                            NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

                            notificationManager.notify(2, builder.build());
                        }
                    }



                }

    }
    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1){

    }
    @Override
    public void onDestroy(){
        Log.d("killed","Service");
        if (sensorManager != null) {
            sensorManager.unregisterListener(this);
            sensorManager = null;
        }


        unregisterReceiver(mReceiver);
        Calendar calendar = Calendar.getInstance();
        mDatabase.child(username).child("ServiceData").push().setValue("ended");
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        Intent i = new Intent(this, AlarmReceiver.class);

        PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);

//        am.setRepeating(AlarmManager.RTC_WAKEUP,
//                SystemClock.elapsedRealtime() + 5 * 1000,
//                5 * 1000, pi);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            //am.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime() + 20 * 1000 ,pi);
            am.setAlarmClock(new AlarmManager.AlarmClockInfo(Calendar.getInstance().getTimeInMillis()+20000,pi),pi);

        }
        else {
            am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime() + 20 * 1000 ,pi);
        }

        wakeLock.release();

    }

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

...