2017-11-28 17 views
0

그래서 화면이 켜져 있는지 또는 꺼져 있는지 (here) 확인하는 서비스가 있습니다.앱이 종료되면 서비스가 실행되지 않습니다.

public class MainActivity extends Activity { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     onCreate(); 
    } 
    public void onCreate() { 

     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     BroadcastReceiver mReceiver = new ScreenReceiver(); 
     registerReceiver(mReceiver, filter); 
    } 

    @Override 
    protected void onPause() { 
     if (ScreenReceiver.screenOff) { 

      System.out.println("SCREEN TURNED OFF"); 
     } else { 

      System.out.println("this is when onPause() is called when the screen state has not changed "); 

     } 
     super.onPause(); 
    } 
    @Override 
    protected void onResume() { 
     // only when screen turns on 
     if (!ScreenReceiver.screenOff) { 
      System.out.println("SCREEN TURNED ON"); 
     } else { 

      System.out.println(" this is when onResume() is called when the screen state has not changed "); 
     } 
     super.onResume(); 
    } 
} 

서비스 클래스 :

public class UpdateService extends Service { 

    public void onCreate() { 
     super.onCreate(); 
     // register receiver that handles screen on and screen off logic 

     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     BroadcastReceiver mReceiver = new ScreenReceiver(); 
     registerReceiver(mReceiver, filter); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     boolean screenOn = intent.getBooleanExtra("screen_state", false); 
     if (!screenOn) { 
      System.out.println("Screen is off"); 
     } else { 
      System.out.println("Screen is on"); 
     } 
    } 

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

수신기 :

public class ScreenReceiver extends BroadcastReceiver { 

    public static boolean screenOff; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     System.out.println("onReceive "); 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      screenOff = true; 
      System.out.println("SCREEN TURNED OFF on BroadcastReceiver"); 
      Log.d("Check", "SCREEN TURNED OFF"); 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      screenOff = false; 
      System.out.println("SCREEN TURNED ON on BroadcastReceiver"); 
      Log.d("Check", "SCREEN TURNED ON"); 

     } 
     Intent i = new Intent(context, UpdateService.class); 
     i.putExtra("screen_state", screenOff); 
     context.startService(i); 
    } 
} 

위의 서비스는 응용 프로그램이 백그라운드로 전송 완벽 때 실행 이 주 활동이다. 그러나 응용 프로그램이 작업 관리자를 사용하여 종료되면 서비스가 더 이상 작동하지 않습니다. 앱이 죽어도 서비스가 작동해야합니다.

사용하려면 어떻게해야합니까? 어떤 아이디어?

답변

2

서비스가 응용 프로그램과 동일한 프로세스에서 실행되고 있기 때문입니다. 매니페스트 파일에 android:process=":yourServiceName"을 설정하면 서비스가 새로운 프로세스를 시작하고 서비스를 볼 수 있습니다. 서비스가 실제로 당신이 서비스의 당신의 onTaskRemoved 방법 내부에 알람 관리기를 사용할 수있는 서비스를 다시 시작하려면이 방법

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())) { 
      return true; 
     } 
    } 
    return false; 
} 

을 사용하여 실행중인 경우

또한, 확인합니까.

@Override 
    public void onTaskRemoved(Intent rootIntent) { 

     Intent restartService = new Intent(getApplicationContext(), this.getClass()); 
     PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartService, PendingIntent.FLAG_ONE_SHOT); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.set(AlarmManager.ELAPSED_REALTIME, 5000, pendingIntent); 


    } 
+0

하지만 앱을 죽일 때마다 서비스는 계속 실행되지 않습니다. 앱을 종료하면 기기가 연결 해제됩니다. 어떻게 테스트합니까? – Thomas

+0

답변을 수정했습니다. 앱이 종료되면 onTaskRemoved 메소드를 사용하여 서비스를 다시 시작하십시오. –

+0

내 응용 프로그램을 recents에서 제거하는 즉시 서비스가 여전히 죽습니다. 내 앱을 죽일 때 – Thomas

1

동일한 프로세스에서 실행되는 경우 분명히 서비스가 데스크톱 응용 프로그램과 함께 종료됩니다.

서비스를 Windows 서비스/Linux 데몬으로 실행하면 사용자가 만든 프로세스와 수명주기가 다릅니다. 예를 들어, 로그 아웃하면 응용 프로그램이 자동 종료됩니다.

+0

위의 코드에서 어떻게 구현할 수 있습니까? – Thomas

+0

어떤 플랫폼을 사용하고 있습니까? 코드의 모든 가져 오기가 사라진 것처럼 보입니다. 내 생각에 당신은 안드로이드를 사용하고 있습니다. –

+0

android studio를 사용하고 있습니다. – Thomas