[android] 사용자가 강제로 서비스를 종료하더라도 자동으로 서비스를 다시 시작하는 방법은 무엇입니까?



Answers

재정의 한 onTaskRemoved 메서드를 사용하여 sticky service 를 만들어야합니다.이 메서드는 알람 서비스를 설정하여 코드를 다시 트리거 할 수 있습니다.

public class BackgroundService extends Service {

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

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

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        //create an intent that you want to start again.
        Intent intent = new Intent(getApplicationContext(), BackgroundService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent);
        super.onTaskRemoved(rootIntent);
    }
}

또한 Xiaomi, Huwaei와 같은 일부 기기에서는 앱이 최근 앱에서 삭제되면 강제 종료됩니다. 이것은 제조업체가 램 / 배터리 성능을 향상시키는 작업 관리자 기능을 가지고 있기 때문입니다.

자세한 내용은 다음 링크를 확인하십시오. https://stackoverflow.com/a/41360159/2798289

Question

내 응용 프로그램에서 항상 서비스를 실행하고 싶습니다. 그래서 사용자가 강제로 닫은 경우에도 다시 시작하려고합니다. 페이 스북 (Facebook)과 같은 앱이 그것을하고 있기 때문에 분명히 할 수있는 방법이 있습니다. (푸시 알림을 사용하지 않고 페이스 북은 인터넷이 꺼져 있어도 서비스를 다시 시작합니다).

어떤 도움을 주시면 감사하겠습니다. 감사!




서비스를 유지하는 유일한 솔루션은 제공된 Notification을 사용하여 Service.startForeground(...) 를 호출하는 것입니다. 이것은 유일한 해결책 일 것이고, 다른 하나는 Google이 시스템의 동작을 어떻게 바꿀지에 따라 달라질 것입니다. API를 업데이트 할 때마다 Google은 다른 모든 해킹을 막을 수 있습니다.

또한 앱이 백그라운드 작업을 수행하고있어 앱을 계속 유지할 수 있음을 사용자에게 알려주고 사용자는이를 중지해야합니다. 사용자에게 중지 기능을 제공하면 응용 프로그램의 일부가됩니다.

문서 :

void startForeground (int id, Notification notification)

이 서비스가 포 그라운드에서 실행되도록하여이 상태에있는 동안 사용자에게 표시되도록 진행중인 알림을 제공합니다. 기본적으로 서비스는 배경입니다. 즉, 웹 브라우저에 큰 페이지를 표시하는 등 시스템이 더 많은 메모리를 회수하기 위해 시스템을 종료해야하는 경우, 너무 많은 피해없이 살해 당할 수 있습니다. 서비스가 백그라운드 음악 재생을 수행하는 경우와 같이 서비스 중단으로 인해 사용자에게 방해가 될 경우이 플래그를 설정하여 사용자가 음악 재생을 중지했음을 알 수 있습니다.




서비스의 startCommand 메소드에서 START_STICKY를 리턴합니다. 일반적으로 그것은 OS가 죽을 때 서비스를 시작하도록 알려줍니다.




내가 올바르게 이해한다면 실제로는 불가능합니다. 가까운 곳에 강제 적용되는 Android 기능은 사용자가 원치 않는 응용 프로그램을 제거 할 수 있도록 설계되었으므로 사용자가 다시 해당 활동을 시작할 때까지 모든 활동을 허용하지 않습니다.

앱이 강제 중지 된 경우에도 서비스를 다시 시작하고 앱을 종료 한 후에도 서비스를 백그라운드에서 계속 실행하는 방법은 무엇입니까?




서비스 중단을 강요하더라도 서비스가 계속 실행되도록하는 매우 해킹 된 솔루션이 있습니다. 나는 그것이 사용자의 의지에 어긋나 기 때문에 권장하지 않습니다. 서비스 X의 onStartCommand 핸들러로 인 텐트를 수신하도록 브로드 캐스트 리시버를 정의 할 수 있습니다 (서비스가 아직 시작되지 않은 경우). X를 수신하면 방송 수신기에서 먼저 서비스를 시작한 다음 몇 분 동안 잠자기하고 마지막으로 X를 다시 브로드 캐스트합니다.




Links