제목 : 굳이 제목을 붙이자면...
1. 알람매니저로 나의앱을 항시 실행상태로 놓기
2. 나의앱이 백그라운드에서 안드로이드에의해 강제 kill당했는지 확인후 자동실행하기
3. 최대한, 강제 kill 당하지 않게 오래 버티기
필요성 :
1. 나의앱은 = 메신저앱이라 사용자가 수동으로 종료하기 전까지는 살아있어야 함
1. 나의앱 = com.shindalsoo.first.SdsOjtFirstActivity
소스코드 :
public class AlarmReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) { //10초마다 이리로 들어옵니다.
String myAppState="dead";
Intent i = new Intent(context, com.shindalsoo.first.SdsOjtFirstActivity.class);
PendingIntent pi = PendingIntent.getActivity(context, 0, i, PendingIntent.FLAG_ONE_SHOT);
ActivityManager AtvMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> allProcInfo = AtvMgr.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo proc:allProcInfo) {
if (proc.processName.equals("com.shindalsoo.first")) {
switch (proc.importance) {
case RunningAppProcessInfo.IMPORTANCE_FOREGROUND:
myAppState="IMPORTANCE_FOREGROUND";break;
case RunningAppProcessInfo.IMPORTANCE_BACKGROUND:
myAppState="IMPORTANCE_BACKGROUND";break;
case RunningAppProcessInfo.IMPORTANCE_EMPTY:
myAppState="IMPORTANCE_EMPTY";break;
case RunningAppProcessInfo.IMPORTANCE_SERVICE:
myAppState="IMPORTANCE_SERVICE";break;
case RunningAppProcessInfo.IMPORTANCE_VISIBLE:
myAppState="IMPORTANCE_VISIBLE";break;
}
break;
}
}
if (myAppState=="dead") {
try {
pi.send(); //kill된것을 다시 살게합니다.
} catch (CanceledException e) {
e.printStackTrace();
}
} else {
try { //안드로이드에서 자동kill을 최대한 버티게합니다.
context.startService(i);
i.putExtra("action", "process");
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
}
}
만들게된 배경 :
작업관리자로 강제 종료시키면, 알람매니저도 kill되므로
더이상 실행되지 않습니다.
저의 앱은 악성코드 처럼 고객에게 실망을 주는 앱은 아니고,
메신저앱인데... 사용자가 얼마든지 스스로, 앱을 종료할 수 있게 되어져 있습니다.
이 기능을 굳이 넣게된 이유는...
메시저에서 정보를 확인하고, 잠시 다른 앱들을 실행해 보게되면,
언제 죽었는지? 나의 메신저앱이 kill되는 현상때문에 만들게 되었습니다.
^.~
일반적으로 백그라운드에서도 동작하게 하기 위해서는 서비스로 올리셔야하구요.
혹시 시스템에 의한(메모리 부족등에 의한) 강제종료 때문에 위와 같이 하시는 거면, 개발자 문서에 나와있는 foreground 서비스로 등록하는 방법을 사용하시면 됩니다. foreground 서비스 설정 시 노티피케이션 정보를 설정 할 수 있는데요. 거기에 아이콘을 설정해주시면 인디케이터 영역에 "실행중 아이콘"이 표시됩니다.
네. 이렇게 고생해서 얻으신 방법을 모두에게 공개해주시고 정말 감사합니다.^^
저도 달퐁이님 처럼 제가 가진 것을 공유하고 그래야되는데 그놈의 귀찮니즘이...
여튼 foreground service는 구글링 하시면 쉽게 검색이 되구요. 제가 주로 참고한 자료는 아래 링크와 같습니다.
http://huewu.blog.me/110085391353?Redirect=Log&from=postView
http://huewu.blog.me/110081427397?Redirect=Log&from=postView
휴우님 블로그고요. 정말 좋은 자료 많으니 다른 글들도 읽어보세요.^^
흠 ... 정확하겐모르겠는대 ..
그냥 온 리줌때 알람실행시켜서 10초후에 서비스 실행시키면 계속살아날탠대 똑같은방법으로 ..
저렇게 많은게 들어가려나요 ㄷㄷ 그런대 좋은팁 ㄳ 뭔가 다르겠죠 ? ㅎㅎ