티스토리 뷰

개발을 진행하다보면 부팅시에 자동으로 앱 실행을 해야 하는 경우가 있습니다. 여기서 앱실행은 대부분 서비스(service)실행을 의미 합니다. 카카오톡과 매시저앱등에서 주로 사용 하며 지속적으로 백그라운드로 돌면서 정해진 역활을 수행 해야 하는데, 부팅이후이도 해당 서비스를 돌려야 하기 때문입니다.


안드로이드에서는 이렇게 부팅과 동시에 실행하는 경우에 사용 할 수 있는 방법을 제공 해주고 있습니다. 바로 "BOOT_COMPLETED"라는 Broadcast를 이용한 방법입니다.


안드로이드 OS에서는 부팅이 완료되면 "BOOT_COMPLETED" Broadcast를 전송 해줍니다. 앱에서는 BroadcastReceiver로 해당 Broadcast를 등록한 후 해당 Broadcast가 들어오면 이후 정해진 동작을 수행하도록 코딩을 해주면 됩니다.


BroadcastReceiver 파일


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BootReceiver extends BroadcastReceiver {
 // BroadcastReceiver를 상속하여 처리 해줍니다.
 @Override
 public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  // 전달 받은 Broadcast의 값을 가져오기
  // androidmanifest.xml에 정의한 인텐트 필터를 받아 올 수 있습니다.
  String action = intent.getAction();
  // 전달된 값이 '부팅완료' 인 경우에만 동작 하도록 조건문을 설정 해줍니다.
  if (action.equals("android.intent.action.BOOT_COMPLETED")) {
   // TODO
   // 부팅 이후 처리해야 코드 작성
   // Ex.서비스 호출, 특정 액티비티 호출등등
  }
 }
}
cs


AndroidManifest.xml 
(11, 27~36 라인처럼 추가 해주시면 됩니다.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kanzler.bootapp"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="16" />
    
    <!-- 부팅을 확인 할수 있는 퍼미션 등록 -->    
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <receiver
            android:name=".BootReceiver"
            android:enabled="true"
            android:exported="false"
            android:label="BOOTReceiver">
            
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>                
            </intent-filter>            
        </receiver>
        
    </application>
</manifest
cs


댓글
  • 프로필사진 초보자 혹시 부팅이 아니라 디바이스의 잠금을 풀었을 때에
    앱을 자동 실행시킬수있는 방법이 있을까요..?
    2017.03.17 16:03 신고
  • 프로필사진 kanzler Kanzler "android.intent.action.SCREEN_ON"으로 검색하신 후 접근 하시면 될것 같습니다. 해당 BR을 받아 이후 비지니스 로직 처리 하시면 됩니다. 2017.03.20 14:29 신고
  • 프로필사진 학생 안녕하세요!

    저도 이와 꼭 같은 기능을 만드는 학생입니다.
    소스코드를 그대로 해봤는데 안되어서 logcat을 자세히 들여다 보니 아래의 exception이 발생합니다.
    E/BootReceiver: Can't remove old update packages
    java.lang.IllegalArgumentException: Unknown URL content://downloads/my_downloads
    at android.content.ContentResolver.delete(ContentResolver.java:1329)
    at android.provider.Downloads.removeAllDownloadsByPackage(Downloads.java:1089)
    at com.android.server.BootReceiver.removeOldUpdatePackages(BootReceiver.java:93)
    at com.android.server.BootReceiver.access$100(BootReceiver.java:42)
    at com.android.server.BootReceiver$1.run(BootReceiver.java:82)

    근데 내가 만든 앱을 uninstall 해도 위의 exception은 계속 발생합니다.
    기기문제인듯 한데 무엇인지 가르침 부탁드립니다.
    2017.09.12 10:46 신고
댓글쓰기 폼