마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

서비스를 유지하는 방법이 없을까요?

0 추천
선배님들, 안녕하세요!

만들고있는 앱이 push 기능이 있는 앱인데

앱에 서비스로 push client 서비스가 돌고 있을 때만

서버에서 push 메세지를 보내면 수신이 되서,

이 서비스를 항상 돌게끔 하고 싶은데요.

앱 주요 기능이 push로 쓰이고, 앱 자체를 사용자가 자주 사용할 것 같진 않습니다.(카카오톡 처럼요..)

 

제 기기로 몇번 테스트를 해 봤는데

① 서비스가 onDestroy()를 탈때 알람을 등록시키고, onCreate()에서 알람을 해제.

② onStartCommand() 에서 return값을 START_STICKY 로 주기.

③ 브로드캐스트 리시버를 통해서 서비스만 재실행하는 로직 추가.

   1) 시스템 재부팅 되었을 때

   2) USB 충전 연결 또는 해제 되었을 때

 

를 구현 했으나, 실 사용시 하루정도 제가 만든 앱 신경 안쓰고 있다가

현재 실행중인 어플리케이션(서비스)에 보면 서비스가 올라와 있지 않더라구요.

신경 안쓰고 있는동안 (카카오톡 또는 게임, 웹서핑 등등) 에 제 생각에는 메모리가 부족해서

제가 만든 앱(서비스)가 죽었으나, 다시 살아나지 못한 것으로 생각되는데요.

이럴때 좋은 방법이 있을까요? 안펍 선배님들..
영양당근 (1,560 포인트) 님이 2016년 1월 28일 질문

1개의 답변

+1 추천

저 같은 경우에는 서비스에서 60초마다 방송을 보내고,

앱에서 방송을 수신하면 1초 후에 서비스를 중단하고 다시 시작하는 식으로 안꺼지게 했어요.

강제로 앱을 종료하면 정식으로 방송을 보냈던 것 때문에 60초 뒤에 다시 시작하고 그렇더라구요.

	public void registerRestartAlarm(boolean isOn) {
		Intent intent = new Intent(LockScreenService.this,
				RestartReceiver.class);
		intent.setAction(RestartReceiver.ACTION_RESTART_SERVICE);
		PendingIntent sender = PendingIntent.getBroadcast(
				getApplicationContext(), 0, intent, 0);
		AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
		if (isOn) {
			am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
					SystemClock.elapsedRealtime() + 60 * 1000, 60 * 1000, sender);
		} else {
			am.cancel(sender);
			sender = null;
			am = null;
		}
	}
public class RestartReceiver extends BroadcastReceiver {
	static public final String ACTION_RESTART_SERVICE = "RestartReceiver.restart";

	@Override
	public void onReceive(Context context, Intent intent) {
		if (intent.getAction().equals(ACTION_RESTART_SERVICE)) {
			Intent i = new Intent(context, LockScreenService.class);
			context.startService(i);
		}
	}
}

이런식으로.

마가 (590 포인트) 님이 2016년 1월 28일 답변
마가님 댓글 감사합니다.
저는 주기를 10초로 해놓고 있었는데
60초로 놓고 테스트 한번 더 해보겠습니다.
...