메뉴 건너뛰기

모바일앱


아시다시피 안드로이드의 서비스는 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 6322
공지 [TIP] 안드로이드 앱 빌드시 "Error:Execution failed for task ':app:compileDebugJavaWithJavac'" 오류가 발생할 경우 파이팅건맨 2017.09.13 5144
공지 [TIP] 안드로이드 앱 삭제 방지 기능 구현 파이팅건맨 2015.06.03 2918
37 [TIP] 타이젠 스튜디오에서 웨어러블 디바이스로 디버깅을 위한 바이너리 전송이 안 될때 new 파이팅건맨 2019.03.26 2
36 [TIP] http://tizen.org/system/tizenid 으로 타이젠 고유 id를 확보할 때 유의할 점 파이팅건맨 2019.03.14 14
35 [TIP] "cordova run android" 명령을 실행했는데 "A problem occurred evaluating project ':CordovaLib'"오류가 뜰때 파이팅건맨 2019.01.22 60
34 [TIP] Mac에서 Cordova run android 를 실행했는데 "Command failed with exit code EACCES" 오류가 뜰때 파이팅건맨 2019.01.22 42
33 [TIP] 안드로이드에서 심박수 측정하는 코드 파이팅건맨 2019.01.02 91
32 [TIP] Google Cloud API 사용시 안드로이드의 Assets 폴더에 있는 Crendential 파일 사용하기 파이팅건맨 2018.05.29 156
31 [TIP] 안드로이드 스튜디오에서 Error:android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcessor' configuration instead 오류날때 파이팅건맨 2018.02.02 1472
30 [TIP] 안드로이드 앱 빌드시 "Error:Execution failed for task ':app:compileDebugJavaWithJavac'" 오류가 발생할 경우 파이팅건맨 2017.09.13 5144
29 [TIP] Error:java.lang.OutOfMemoryError: GC overhead limit exceeded 파이팅건맨 2016.11.03 821
28 [TIP] 안드로이드 앱이 처음 설치될때 Referrer 정보 받아 오기 파이팅건맨 2016.08.30 2904
27 [TIP] 안드로이드에서 구글 스프레드시트에 데이터 쓰기 파이팅건맨 2016.05.04 2342
26 [TIP] 키보드가 나타날때 레이아웃이 위로 움직인다면 파이팅건맨 2016.03.22 765
25 [TIP] 안드로이드 - 설치된 앱 목록 얻기 파이팅건맨 2016.03.22 2793
24 [TIP] 안드로이드의 최상단에 띄워놓은 Floating Window가 키보드를 인지하는 방법 파이팅건맨 2016.01.07 1577
23 [TIP] 안드로이드의 Floating Window가 Back키를 인지 하는 방법 [2] 파이팅건맨 2016.01.07 1773
» [TIP] 죽지 않는 안드로이드 서비스 만들기 (Unstoppable service) [6] 파이팅건맨 2015.06.26 6322
21 [TIP] 내 안드로이드 앱에 위젯을 띄우는 방법 파이팅건맨 2015.06.03 445
20 [TIP] 안드로이드 앱 삭제 방지 기능 구현 파이팅건맨 2015.06.03 2918
19 [TIP] Jquery Mobile로 iOS앱 개발시 Status바 처리 파이팅건맨 2014.08.27 552
18 [TIP] iOS 앱 개발시 HTTP POST로 데이터 전송 방법 파이팅건맨 2014.06.07 531
위로