일부 서비스는 안드로이드가 부팅될 때 자동으로 실행될 필요가 있다.
안드로이드 폰은 부팅이 끝나면 액션이 'android.intent.action.BOOT_COMPLETED'인 인텐트를 브로드캐스트한다. 그러므로 이 인텐트 브로트캐스트를 받을 수 있는 BroadcastReceiver가 필요하다.
여기서 가장 핵심은 onReceive() 메소드이다. 원하는 인텐트가 브로드캐스트되면 onReceive() 메소드가 호출된다.
그리고 리시버는 manifest 파일에 선언되어있어야 한다.
또한 이 클래스는 보안 설정에 선언할필요가 있는 특정 이벤트 브로드캐스트를 들어야 하기 때문에 manifest 파일에RECEIVE_BOOT_COMPLETED퍼미션이 있어야 한다.
위와 같이 추가해주면 부팅이 끝나고서비스가 자동으로 실행되게 된다.
-------
* 리플을 보고 좀더 이해하기 쉽게 전체적인 코드의 프레임웍을 첨부한다.
package app.arsviator;
...
public class BootSvc extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("BOOTSVC", "Service started at the BOOT_COMPLETED.");
}
}
package app.arsviator;
...
public class BRcvr extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
Log.i("BOOTSVC", "Intent received");
ComponentName cn = new ComponentName(context.getPackageName(), BootSvc.class.getName());
ComponentName svcName = context.startService(new Intent().setComponent(cn));
if (svcName == null)
Log.e("BOOTSVC", "Could not start service " + cn.toString());
}
}
}
http://schemas.android.com/apk/res/android"
package="app.nautes"
android:versionCode="1"
android:versionName="1.0">
android:enabled="true"
android:exported="false"
android:label="Broadcast Receiver" >
이 프로그램을 에뮬레이터에 설치한 다음 에뮬레이터를종료했다가 AVD Manager에서 다시 시작시키고 부팅이 끝난 다음 logcat을 보면다음과같다.
로그를 보면 부팅이 끝난 다음 서비스가 시작된걸확인할 수 있다.
안드로이드 폰은 부팅이 끝나면 액션이 'android.intent.action.BOOT_COMPLETED'인 인텐트를 브로드캐스트한다. 그러므로 이 인텐트 브로트캐스트를 받을 수 있는 BroadcastReceiver가 필요하다.
public class GPSLoggerServiceManagerextends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
ComponentName cName = new ComponentName(ctx.getPackageName(), GPSLogger);
ComponentName svcName = ctx.startService(new Intent().setComponent(cName);
if (svc == null) {
Log.e(TAG, "Could not start service " + cName.toString());
}
} else {
Log.e(TAG, "Received unexpected intent " + intent.toString());
}
}
}
@Override
public void onReceive(Context ctx, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
ComponentName cName = new ComponentName(ctx.getPackageName(), GPSLogger);
ComponentName svcName = ctx.startService(new Intent().setComponent(cName);
if (svc == null) {
Log.e(TAG, "Could not start service " + cName.toString());
}
} else {
Log.e(TAG, "Received unexpected intent " + intent.toString());
}
}
}
여기서 가장 핵심은 onReceive() 메소드이다. 원하는 인텐트가 브로드캐스트되면 onReceive() 메소드가 호출된다.
그리고 리시버는 manifest 파일에 선언되어있어야 한다.
LocationLoggerServiceManager"
android:enabled="true"
android:exported="false"
android:label="LocationLoggerServiceManager" >
android:enabled="true"
android:exported="false"
android:label="LocationLoggerServiceManager" >
또한 이 클래스는 보안 설정에 선언할필요가 있는 특정 이벤트 브로드캐스트를 들어야 하기 때문에 manifest 파일에RECEIVE_BOOT_COMPLETED퍼미션이 있어야 한다.
위와 같이 추가해주면 부팅이 끝나고서비스가 자동으로 실행되게 된다.
-------
* 리플을 보고 좀더 이해하기 쉽게 전체적인 코드의 프레임웍을 첨부한다.
/src/.../BootSvc.java
package app.arsviator;
...
public class BootSvc extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("BOOTSVC", "Service started at the BOOT_COMPLETED.");
}
}
/src/.../BRcvr.java
package app.arsviator;
...
public class BRcvr extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
Log.i("BOOTSVC", "Intent received");
ComponentName cn = new ComponentName(context.getPackageName(), BootSvc.class.getName());
ComponentName svcName = context.startService(new Intent().setComponent(cn));
if (svcName == null)
Log.e("BOOTSVC", "Could not start service " + cn.toString());
}
}
}
AndroidManifest.xml
http://schemas.android.com/apk/res/android"
package="app.nautes"
android:versionCode="1"
android:versionName="1.0">
android:enabled="true"
android:exported="false"
android:label="Broadcast Receiver" >
이 프로그램을 에뮬레이터에 설치한 다음 에뮬레이터를종료했다가 AVD Manager에서 다시 시작시키고 부팅이 끝난 다음 logcat을 보면다음과같다.
09-07 09:31:30.631: INFO/SurfaceFlinger(52): Boot is finished (22889 ms)
09-07 09:31:30.661: INFO/ARMAssembler(52): generated scanline__00000177:03515104_00000A01_00000000 [ 55 ipp] (79 ins) at [0x481508:0x481644] in 5894000 ns
09-07 09:31:30.750: INFO/ActivityManager(52): Start proc com.android.email for broadcast com.android.email/com.android.exchange.BootReceiver: pid=165 uid=10008 gids={3003, 1015}
09-07 09:31:30.860: DEBUG/HomeLoaders(105): ----> items cloned, ready to refresh UI
09-07 09:31:31.230: DEBUG/ddm-heap(165): Got feature list request
09-07 09:31:32.790: DEBUG/dalvikvm(52): GC freed 14273 objects / 744904 bytes in 444ms
09-07 09:31:33.130: INFO/ActivityThread(165): Publishing provider com.android.email.provider: com.android.email.provider.EmailProvider
09-07 09:31:33.191: INFO/ActivityThread(165): Publishing provider com.android.email.attachmentprovider: com.android.email.provider.AttachmentProvider
09-07 09:31:33.300: DEBUG/Exchange(165): BootReceiver onReceive
09-07 09:31:33.360: DEBUG/EAS SyncManager(165): !!! EAS SyncManager, onCreate
09-07 09:31:33.430: INFO/ActivityManager(52): Start proc com.android.mms for broadcast com.android.mms/.transaction.MmsSystemEventReceiver: pid=176 uid=10013 gids={3003, 1015}
09-07 09:31:33.730: DEBUG/ddm-heap(176): Got feature list request
09-07 09:31:33.810: DEBUG/EAS SyncManager(165): !!! EAS SyncManager, onStartCommand
09-07 09:31:33.870: DEBUG/EAS SyncManager(165): !!! EAS SyncManager, stopping self
09-07 09:31:33.930: DEBUG/Eas Debug(165): Logging:
09-07 09:31:34.031: DEBUG/EAS SyncManager(165): !!! EAS SyncManager, onDestroy
09-07 09:31:34.410: DEBUG/MediaScannerService(149): start scanning volume internal
09-07 09:31:35.750: INFO/ActivityManager(52): Start proc app.nautes for broadcast app.nautes/.BRcvr: pid=195 uid=10078 gids={1015}
09-07 09:31:36.280: DEBUG/ddm-heap(195): Got feature list request
09-07 09:31:36.290: DEBUG/dalvikvm(29): GC freed 280 objects / 10704 bytes in 526ms
09-07 09:31:36.590: DEBUG/dalvikvm(29): GC freed 50 objects / 2224 bytes in 224ms
09-07 09:31:36.650: INFO/BOOTSVC(195): Intent received
09-07 09:31:36.740: INFO/BOOTSVC(195): Service started at the BOOT_COMPLETED.
09-07 09:31:36.770: DEBUG/dalvikvm(29): GC freed 2 objects / 48 bytes in 174ms
09-07 09:31:37.931: DEBUG/dalvikvm(105): GC freed 4158 objects / 281904 bytes in 199ms
09-07 09:31:38.360: DEBUG/MediaScanner(149): opendir /system/media/ failed, errno: 2
09-07 09:31:38.360: DEBUG/MediaScanner(149): prescan time: 1474ms
09-07 09:31:38.360: DEBUG/MediaScanner(149): scan time: 55ms
09-07 09:31:38.360: DEBUG/MediaScanner(149): postscan time: 1ms
09-07 09:31:38.360: DEBUG/MediaScanner(149): total time: 1530ms
09-07 09:31:38.390: DEBUG/MediaScannerService(149): done scanning volume internal
09-07 09:31:39.180: DEBUG/dalvikvm(105): GC freed 3308 objects / 168792 bytes in 169ms
09-07 09:31:30.661: INFO/ARMAssembler(52): generated scanline__00000177:03515104_00000A01_00000000 [ 55 ipp] (79 ins) at [0x481508:0x481644] in 5894000 ns
09-07 09:31:30.750: INFO/ActivityManager(52): Start proc com.android.email for broadcast com.android.email/com.android.exchange.BootReceiver: pid=165 uid=10008 gids={3003, 1015}
09-07 09:31:30.860: DEBUG/HomeLoaders(105): ----> items cloned, ready to refresh UI
09-07 09:31:31.230: DEBUG/ddm-heap(165): Got feature list request
09-07 09:31:32.790: DEBUG/dalvikvm(52): GC freed 14273 objects / 744904 bytes in 444ms
09-07 09:31:33.130: INFO/ActivityThread(165): Publishing provider com.android.email.provider: com.android.email.provider.EmailProvider
09-07 09:31:33.191: INFO/ActivityThread(165): Publishing provider com.android.email.attachmentprovider: com.android.email.provider.AttachmentProvider
09-07 09:31:33.300: DEBUG/Exchange(165): BootReceiver onReceive
09-07 09:31:33.360: DEBUG/EAS SyncManager(165): !!! EAS SyncManager, onCreate
09-07 09:31:33.430: INFO/ActivityManager(52): Start proc com.android.mms for broadcast com.android.mms/.transaction.MmsSystemEventReceiver: pid=176 uid=10013 gids={3003, 1015}
09-07 09:31:33.730: DEBUG/ddm-heap(176): Got feature list request
09-07 09:31:33.810: DEBUG/EAS SyncManager(165): !!! EAS SyncManager, onStartCommand
09-07 09:31:33.870: DEBUG/EAS SyncManager(165): !!! EAS SyncManager, stopping self
09-07 09:31:33.930: DEBUG/Eas Debug(165): Logging:
09-07 09:31:34.031: DEBUG/EAS SyncManager(165): !!! EAS SyncManager, onDestroy
09-07 09:31:34.410: DEBUG/MediaScannerService(149): start scanning volume internal
09-07 09:31:35.750: INFO/ActivityManager(52): Start proc app.nautes for broadcast app.nautes/.BRcvr: pid=195 uid=10078 gids={1015}
09-07 09:31:36.280: DEBUG/ddm-heap(195): Got feature list request
09-07 09:31:36.290: DEBUG/dalvikvm(29): GC freed 280 objects / 10704 bytes in 526ms
09-07 09:31:36.590: DEBUG/dalvikvm(29): GC freed 50 objects / 2224 bytes in 224ms
09-07 09:31:36.650: INFO/BOOTSVC(195): Intent received
09-07 09:31:36.740: INFO/BOOTSVC(195): Service started at the BOOT_COMPLETED.
09-07 09:31:36.770: DEBUG/dalvikvm(29): GC freed 2 objects / 48 bytes in 174ms
09-07 09:31:37.931: DEBUG/dalvikvm(105): GC freed 4158 objects / 281904 bytes in 199ms
09-07 09:31:38.360: DEBUG/MediaScanner(149): opendir /system/media/ failed, errno: 2
09-07 09:31:38.360: DEBUG/MediaScanner(149): prescan time: 1474ms
09-07 09:31:38.360: DEBUG/MediaScanner(149): scan time: 55ms
09-07 09:31:38.360: DEBUG/MediaScanner(149): postscan time: 1ms
09-07 09:31:38.360: DEBUG/MediaScanner(149): total time: 1530ms
09-07 09:31:38.390: DEBUG/MediaScannerService(149): done scanning volume internal
09-07 09:31:39.180: DEBUG/dalvikvm(105): GC freed 3308 objects / 168792 bytes in 169ms
로그를 보면 부팅이 끝난 다음 서비스가 시작된걸확인할 수 있다.
주요 소스
AndroidManifest.xml
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
BootReceiver.java
부팅시에 시작되는 BroadcastReceiver에서 시작시키고 싶은 Activity를 인텐트로 지정해서 시작시키면 됩니다.
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
BootReceiver.java
public class BootReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
부팅시에 시작되는 BroadcastReceiver에서 시작시키고 싶은 Activity를 인텐트로 지정해서 시작시키면 됩니다.
주의 : 반드시 filter를 AndroidManifest.xml에서 추가 시켜야 한다.
'안드로이드' 카테고리의 다른 글
Notification Manager (0) | 2011.01.27 |
---|---|
Android: gdb를 이용한 Dalvik VM 디버깅 (0) | 2011.01.27 |
Fingerprint 추적 방법 (0) | 2011.01.27 |
디바이스의 고유 정보값 얻어오기 (0) | 2011.01.27 |
타이틀 바 꾸미기 (0) | 2011.01.27 |