메뉴 건너뛰기

모바일앱


아시다시피 안드로이드의 서비스는 LMK나 Task killer로 인해 언제든 소리와 소문없이 종료될 수 있습니다.

이로인해 무정지 서비스를 위한 많은 꽁수들이 인터넷에 널려 있지만 안드로이드 플랫폼 버전이 업데이트 되면서 모두 무용지물이 되어버렸더군요.

이에, (갤럭시 노트2) KITKAT버전에서 확실하게 동작하는 두가지 방법을 공유합니다.


1. 노티바(Notification bar)에 자신의 앱 아이콘과 설명화면이 표시되는 형태


startForeground() 함수를 이용하시면 됩니다. 간단한 예는 아래와 같습니다. 이러면, 노티바에 아이콘이 나타나고 노티바를 주룩~ 내리면 앱의 설명이 표시되고 있습니다.

무정지로 돌리고픈 서비스의 onStartCommand() 함수등에 아래와 같이 코드를 작성합니다.

//Kitkat 혹은, 이전버전에서는 아이콘이 표시되지 않을수도 있습니다^^
startForeground(1, new Notification());



2. 노티바에 자신의 앱 아이콘이 표시되지 않고 노티바를 내렸을때 설명화면만 표시되는 형태


네, 이 팁의 하이라이트 입니다. 노티바에 아무런 표시를 하지 않고 서비스를 계속해서 살려놓는 방법입니다. 하지만, 노티바를 내렸을때는 어쩔수 없이 앱의 설명화면이나 자신이 제작한 위젯뷰를 들키게(?) 됩니다. 유명 앱들이 대부분 이와 같은 방법을 쓰고 있었습니다. 현재수준에서는 마지노선이 아닐까 싶습니다.ㅋ


MyNotiControl.java 파일입니다.

public class MyNotiControl {

private Context context;
private RemoteViews rView;
private NotificationCompat.Builder nBuilder;

public MyNotiControl (Context parent) 
{
    this.context= parent;
    nBuilder = new NotificationCompat.Builder(context)
    .setContentTitle("GUNMAN SERVICE")
    .setSmallIcon(R.drawable.ic_launcher)
    .setPriority(Notification.PRIORITY_MIN) //요 부분이 핵심입니다. MAX가 아닌 MIN을 줘야 합니다.
    .setOngoing(true);

    rView = new RemoteViews(parent.getPackageName(), R.layout.mycontrolview); //노티바를 내렸을때 보여지는 화면입니다.

    //set the listener
    setListener(rView);
    nBuilder.setContent(rView);    
}

public Notification getNoti()
{
    return nBuilder.build();
}

public void setListener(RemoteViews view){
    Intent i = new Intent(context, MyNotiControlView .class);
    i.putExtra("Foo", "bar");
    PendingIntent button = PendingIntent.getActivity(context, 0, i, 0);
    view.setOnClickPendingIntent(R.id.btn, button);
}


무정지로 돌리고픈 서비스의 onStartCommand() 함수내에 아래와 같이 코드를 작성합니다.

//서비스 클래스의 onStartCommand 함수 등에서-
MyNotiControl cl = new MyNotiControl(context);
startForeground(1, cl.getNoti());

MyNotiControlView.java 파일입니다. 노티바를 내렸을 때 나타나는 화면(위젯뷰)을 위한 클래스입니다. 해당 화면에서 발생하는 이벤트(인텐트)를 핸들링하게 될 Activity인거죠. (원하시는 대로 코드를 채워넣으면 됩니다)

public class MyNotiControlView extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    String foo = (String) getIntent().getExtras().get("Foo");
    if (foo.equals("bar")) {
      //
    }
 }


}


mycontrolview.xml 파일입니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">

<Button
    android:id="@+id/btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="GO" />

</LinearLayout>



profile
  • 제 서비스부분 onStartCommand 부분에
    1번 처럼 startForeground(1, new Notification());
    만 적어도 죽지않는 서비스가 실행은 된것인지요?
    굳이 2번아래쪽은 안해도되는것인지...
  • profile

    네, 1번 혹은, 2번 둘 중 하나만 적용하여도 서비스가 죽지 않습니다.

    다만, 안드로이드의 특성이 계속 바뀌기에 저 두가지 방법이 언제부턴가 먹히지 않을 수도 있다는 점 감안하셔야 할 겁니다^^

    수고하세요!

제목 날짜
[TIP] 죽지 않는 안드로이드 서비스 만들기 (Unstoppable service) 6 2015.06.26
[TIP] 안드로이드 앱 삭제 방지 기능 구현 2015.06.03
[TIP] Android - WebView 사용된 앱에 Proguard 적용시 주의 1 2011.08.06
[TIP] 안드로이드 스튜디오에서 Error:android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcessor' configuration instead 오류날때 2018.02.02
[TIP] 안드로이드 앱 빌드시 "Error:Execution failed for task ':app:compileDebugJavaWithJavac'" 오류가 발생할 경우 2017.09.13
[TIP] Error:java.lang.OutOfMemoryError: GC overhead limit exceeded 2016.11.03
[TIP] 안드로이드 앱이 처음 설치될때 Referrer 정보 받아 오기 2016.08.30
[TIP] 안드로이드에서 구글 스프레드시트에 데이터 쓰기 2016.05.04
[TIP] 키보드가 나타날때 레이아웃이 위로 움직인다면 2016.03.22
[TIP] 안드로이드 - 설치된 앱 목록 얻기 2016.03.22
[TIP] 안드로이드의 최상단에 띄워놓은 Floating Window가 키보드를 인지하는 방법 2016.01.07
[TIP] 안드로이드의 Floating Window가 Back키를 인지 하는 방법 2 2016.01.07
[TIP] 죽지 않는 안드로이드 서비스 만들기 (Unstoppable service) 6 2015.06.26
[TIP] 내 안드로이드 앱에 위젯을 띄우는 방법 2015.06.03
[TIP] 안드로이드 앱 삭제 방지 기능 구현 2015.06.03
[TIP] Jquery Mobile로 iOS앱 개발시 Status바 처리 2014.08.27
[TIP] iOS 앱 개발시 HTTP POST로 데이터 전송 방법 2014.06.07
[TIP] 안드로이드에서 대용량 이미지 읽기 2013.04.15
[TIP] 안드로이드 카메라 영상에 그림 그린후 저장하기 2013.01.02
[펌] 안드로이드 에뮬레이터 속도 개선방법 2012.07.19
Android 기반의 재미있는 개발제품을 파는 사이트 2012.04.26
WM6.5 프로세스 숨기기 여쭐께요. 1 2012.04.18
[TIP] Android - WebView 사용된 앱에 Proguard 적용시 주의 1 2011.08.06
태그 목록
위로