메뉴 건너뛰기

모바일앱


아시다시피 안드로이드의 서비스는 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>






번호 제목 글쓴이 날짜 조회 수
» [TIP] 죽지 않는 안드로이드 서비스 만들기 (Unstoppable service) [6] 파이팅건맨 2015.06.26 6568
공지 [TIP] 안드로이드 앱 빌드시 "Error:Execution failed for task ':app:compileDebugJavaWithJavac'" 오류가 발생할 경우 파이팅건맨 2017.09.13 6555
공지 [TIP] 안드로이드 앱이 처음 설치될때 Referrer 정보 받아 오기 파이팅건맨 2016.08.30 3497
23 [TIP] 안드로이드의 Floating Window가 Back키를 인지 하는 방법 [2] 파이팅건맨 2016.01.07 1892
» [TIP] 죽지 않는 안드로이드 서비스 만들기 (Unstoppable service) [6] 파이팅건맨 2015.06.26 6568
21 [TIP] 내 안드로이드 앱에 위젯을 띄우는 방법 파이팅건맨 2015.06.03 466
20 [TIP] 안드로이드 앱 삭제 방지 기능 구현 파이팅건맨 2015.06.03 3140
19 [TIP] Jquery Mobile로 iOS앱 개발시 Status바 처리 파이팅건맨 2014.08.27 563
18 [TIP] iOS 앱 개발시 HTTP POST로 데이터 전송 방법 파이팅건맨 2014.06.07 568
17 [TIP] 안드로이드에서 대용량 이미지 읽기 파이팅건맨 2013.04.15 599
16 [TIP] 안드로이드 카메라 영상에 그림 그린후 저장하기 파이팅건맨 2013.01.02 611
15 [펌] 안드로이드 에뮬레이터 속도 개선방법 파이팅건맨 2012.07.19 817
14 Android 기반의 재미있는 개발제품을 파는 사이트 파이팅건맨 2012.04.26 1156
13 WM6.5 프로세스 숨기기 여쭐께요. [1] 이원철 2012.04.18 1135
12 [TIP] Android - WebView 사용된 앱에 Proguard 적용시 주의 [1] 파이팅건맨 2011.08.06 2277
11 회원가입 [1] 권경민 2011.01.11 892
10 [TIP] 실행파일의 리소스 자원 활용하기 파이팅건맨 2010.02.23 1032
9 [TIP] C# Windows Mobile 용 HttpUtility 코드 파이팅건맨 2010.02.23 1736
8 [TIP] GPRS Connection 관련 파이팅건맨 2010.02.22 894
7 [LINK] cab 파일 설치시 투데이 메뉴에 단축 아이콘 생성하기 파이팅건맨 2010.02.22 1210
6 [LINK] 동공, 맥박등 이용 거짓말 탐지기 파이팅건맨 2010.02.05 1029
5 [LINK] Windows Mobile Robot 파이팅건맨 2010.02.05 846
4 [LINK] WM - Android Dual Boot 파이팅건맨 2010.02.04 907
위로