Сервис не работает после того, как приложение убито на Android 8 Oreo [дубликат]

На этот вопрос уже есть ответ:

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

Служба перезапуска работает нормально на Android 5, но не работает на Oreo.

я пробовал так много способов сделать это, как: boardCastReceivers и изменить настройки манифеста для службы, но не работает

мои коды: в манифесте


       
        

        
        




in MainActivity:




@Override
    protected void onDestroy() {
        stopService(mServiceIntent);
        Log.i("MAINACT", "onDestroy!");
        super.onDestroy();

    }



    private boolean isMyServiceRunning(Class serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                Log.i ("isMyServiceRunning?", true+"");
                return true;
            }
        }
        Log.i ("isMyServiceRunning?", false+"");
        return false;
    }


    ChatService chatService;
    Intent mServiceIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        chatService = new ChatService(MainActivity.this);
        mServiceIntent = new Intent(MainActivity.this, chatService.getClass());
        if (!isMyServiceRunning(chatService.getClass())) {
            startService(mServiceIntent);
        }



        setContentView(R.layout.activity_main);


        }



receiver class: 


public class ChatReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(ChatReceiver.class.getSimpleName(), "Service fucked up");
        context.startService(new Intent(context, ChatService.class));
    }
}




and service class:




public class ChatService extends Service{

    public static Socket socket;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("onCreate", "onCreate");
        try {
            socket = IO.socket("http://192.168.174.1:8000");
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
//        Toast.makeText(AppController.getInstance(),"Created",Toast.LENGTH_SHORT).show();
    }

    public ChatService(Context applicationContext) {
        super();
        Log.i("HERE", "here I am!");
    }

    public ChatService() {
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            onTaskRemoved(intent);
        }

        super.onStartCommand(intent, flags, startId);


        Timer t = new Timer();
        t.scheduleAtFixedRate(new TimerTask() {
                                  @Override
                                  public void run() {

                                      new Handler(Looper.getMainLooper()).post(new Runnable() {
                                          @Override
                                          public void run() {

                                              if (!socket.connected()) {
                                                  socket.connect();
                                              }

                                          }
                                      });


                                  }

                              },
                0,
                5000);




        return START_STICKY;
    }
    @Override
    public void onDestroy() {
        Log.i("EXIT", "ondestroy!");

        super.onDestroy();

    }


    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);


        Intent restartServiceIntent = new Intent(getApplicationContext(), ChatService.class);
        restartServiceIntent.setPackage(getPackageName());

        PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        alarmService.set(
                AlarmManager.ELAPSED_REALTIME,
                SystemClock.elapsedRealtime() + 4000,
                restartServicePendingIntent);


    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}











в любом случае это сделать?

0
задан Markus Kauppinen 27 June 2019 в 06:39
поделиться

1 ответ

Если вы используете vivo / honor / oppo и т. Д., Ваши службы будут убиты, как только ваше приложение будет закрыто.

0
ответ дан Akhil Sudha 27 June 2019 в 06:39
поделиться
  • 1
    Причиной Ваш пример является настолько неприятный взгляд isn' t, потому что RAII испорчен, скорее это - потому что Вам не удалось использовать его. Необработанные указатели не являются RAII. – Ben Voigt 27 April 2013 в 22:18
  • 2
    Причиной Ваш пример является настолько неприятный взгляд isn' t, потому что RAII испорчен, скорее это - потому что Вам не удалось использовать его. Необработанные указатели не являются RAII. – Ben Voigt 27 April 2013 в 22:18
  • 3
    Причиной Ваш пример является настолько неприятный взгляд isn' t, потому что RAII испорчен, скорее это - потому что Вам не удалось использовать его. Необработанные указатели не являются RAII. – Ben Voigt 27 April 2013 в 22:18
  • 4
    Причиной Ваш пример является настолько неприятный взгляд isn' t, потому что RAII испорчен, скорее это - потому что Вам не удалось использовать его. Необработанные указатели не являются RAII. – Ben Voigt 27 April 2013 в 22:18
  • 5
    Причиной Ваш пример является настолько неприятный взгляд isn' t, потому что RAII испорчен, скорее это - потому что Вам не удалось использовать его. Необработанные указатели не являются RAII. – Ben Voigt 27 April 2013 в 22:18
  • 6
    Причиной Ваш пример является настолько неприятный взгляд isn' t, потому что RAII испорчен, скорее это - потому что Вам не удалось использовать его. Необработанные указатели не являются RAII. – Ben Voigt 27 April 2013 в 22:18
  • 7
    Причиной Ваш пример является настолько неприятный взгляд isn' t, потому что RAII испорчен, скорее это - потому что Вам не удалось использовать его. Необработанные указатели не являются RAII. – Ben Voigt 27 April 2013 в 22:18
  • 8
    Причиной Ваш пример является настолько неприятный взгляд isn' t, потому что RAII испорчен, скорее это - потому что Вам не удалось использовать его. Необработанные указатели не являются RAII. – Ben Voigt 27 April 2013 в 22:18
  • 9
    Причиной Ваш пример является настолько неприятный взгляд isn' t, потому что RAII испорчен, скорее это - потому что Вам не удалось использовать его. Необработанные указатели не являются RAII. – Ben Voigt 27 April 2013 в 22:18
Другие вопросы по тегам:

Похожие вопросы: