Попытка использовать службу переднего плана для запуска активности через сообщение mqtt, когда приложение закрыто - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь запустить свое приложение из службы переднего плана, но это случается иногда, и я не знаю почему. Я создал службу, которая продолжает работать, когда мое приложение закрыто. Если действие завершает действие, оно больше не открывается из службы. вот эта служба:

 public class MQTTService extends Service {
        private PowerManager.WakeLock wakeLock;



        public void     MQTTService() {
            clientPhone = new MqttAndroidClient(this, serverUri, clientId);
            clientPhone.setCallback(new MqttCallback() {
                public void connectComplete(boolean b, String s) {

                }
                @Override
                public void connectionLost(Throwable throwable) {

                }
                @Override
                public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
                    Log.w("Mqtt", mqttMessage.toString());
                    Log.e("message ", String.valueOf(mqttMessage));
                    Toast.makeText(MQTTService.this, "Crash Occurred", Toast.LENGTH_SHORT).show();
                    Intent dialogIntent = new Intent(MQTTService.this, alert.class);
                    dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(dialogIntent);
                }
                @Override
                public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

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

        @Override
        public void onCreate() {
            super.onCreate();
            final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "carcrashdetection:PARTIAL_WAKE_LOCK_TAG");
            createNotificationChannel(this);
            Notification notification = new NotificationCompat.Builder(this, "NOTIFICATION_CHANNEL").setSmallIcon
                    (R.drawable.add_car).setContentTitle("Title")
                    .setContentText("Content").build();

            startForeground(1001, notification);
            registerReceiver();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    MQTTService.this.MQTTService();
                }
            }).start();
        }
        @Override
        public void onDestroy() {
            super.onDestroy();
            if (wakeLock.isHeld()) {
                wakeLock.release();
            }
        }


        public void createNotificationChannel(MQTTService mqttService) {
            // Create the NotificationChannel, but only on API 26+ because
            // the NotificationChannel class is new and not in the support library
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

                CharSequence name = "Channel name";
                String description = "Description";
                int importance = NotificationManager.IMPORTANCE_DEFAULT;
                NotificationChannel channel = new NotificationChannel("NOTIFICATION_CHANNEL", name, importance);
                channel.setDescription(description);
                NotificationManager notificationManager = getApplicationContext().getSystemService(NotificationManager.class);
                notificationManager.createNotificationChannel(channel);
            }
        }

    }

Я вижу из журнала, что я все еще получаю сообщения (полученное сообщение - то, что запускает действие), но, кажется, не запускает действие каждый раз. вот действие, которое оно запускает.

И в основном задании, которое я нахожусь в процессе создания:

 Intent i = new Intent(MainActivity.this, MQTTService.class);
 ContextCompat.startForegroundService(MainActivity.this, i);
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.FOREGROUND_SERVICE},1);

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

Ps. Я избавился от большинства методов mqtt в сервисе, так как не думаю, что они необходимы для решения этой проблемы. дайте мне знать, если вы хотите, чтобы я добавил их.

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