그러냐

안드로이드 boot 실행 본문

android

안드로이드 boot 실행

관절분리 2016. 1. 28. 10:55
반응형

안드로이드 폰은 부팅이 끝나면 액션이 'android.intent.action.BOOT_COMPLETED'인 인텐트를 브로드캐스트 한다. 그러므로 이 인텐트 브로트캐스트를 받을 수 있는 BroadcastReceiver가 필요하다.

public class GPSLoggerServiceManager extends 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());
   }
  }
}


여기서 가장 핵심은 onReceive() 메소드이다. 원하는 인텐트가 브로드캐스트 되면 onReceive() 메소드가 호출된다.

그리고 리시버는 manifest 파일에 선언되어 있어야 한다.

<receiver android:name=".LocationLoggerServiceManager"
   android:enabled="true"
   android:exported="false"
   android:label="LocationLoggerServiceManager" >
  < intent-filter>
   <action android:name="android.intent.action.BOOT_COMPLETED" />
  < /intent-filter>
</receiver>


또한 이 클래스는 보안 설정에 선언할 필요가 있는 특정 이벤트 브로드캐스트를 들어야 하기 때문에 manifest 파일에 RECEIVE_BOOT_COMPLETED 퍼미션이 있어야 한다.

<uses-permission android:name="android.permission.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());
    }
  }
}

 

 

public class BRcvr extends BroadcastReceiver {

 @Override

 public void onReceive(Context context, Intent intent) {    

 if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))

 {

 Intent i = new Intent(context, CaptureActivity.class);

              i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

              context.startActivity(i);

              

  //context.startService(new Intent(context,SpalshActivity.class));

 }

 }

}



AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="app.nautes"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
      <service android:name="BootSvc"></service>
      <receiver android:name=".BRcvr"
         android:enabled="true"
         android:exported="false"
         android:label="Broadcast Receiver" >
        < intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED" />
        < /intent-filter>
      < /receiver>
    < /application>
</manifest>

 

 <receiver android:name=".BRcvr">

   <intent-filter>

      <action 

        android:name="android.intent.action.BOOT_COMPLETED" />

   </intent-filter>                      

</receiver>

 

 

<service android:name=".MyService" />

 

 

< MyService.java >

 

public class MyService extends Service {

    @Override

    public void onCreate() {

        Toast.makeText(getBaseContext(), "Start MyService", 

                           Toast.LENGTH_SHORT).show();

        

    }

 

    @Override

    public void onStart(Intent intent, int startId) {

        super.onStart(intent, startId);

    }

    

    @Override

    public void onDestroy() {

        super.onDestroy();

    }

    

    @Override

    public IBinder onBind(Intent intent) {

        return null;

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

검색 능력이 떨어진 것인지, 서비스 자동 실행과 관련된 예제를 못찾다가 개발 서적의 샘플 소스에서 찾았다. 같은 정보를 찾고 있는 분들께 조금이나마 도움이 되기를 바라며 정리해둔다.

먼저 메니페스트 파일을 열고 다음과 같이 액티비티 다음에 리시버와 서비스를 추가해준다.

<activity android:name=".MyApp"
     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=".MyServiceReceiver">
   <intent-filter>
      <action 
        android:name="android.intent.action.BOOT_COMPLETED" />

   </intent-filter>                      
</receiver>

<service android:name=".MyService" />

당연히 BOOT_COMPLETED 액션을 받을 수 있도록 퍼미션도 지정해준다.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

MyServiceReceiver.java 파일을 만들고 다음 내용을 추가해준다. BOOT_COMPLETED 액션이 전달되면 서비스를 시작하도록 코딩한다.

public class MyServiceReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
  {

   context.startService(new Intent(context,MyService.class));
  }
 }
}

마지막으로 MyService.java 파일을 만들고 백그라운드로 동작되는 서비스의 기능을 구현해주면 된다. 액티비티와 바인딩은 안한다면 onBind에서는 null을 리턴해주면 된다. (바인딩에 대해서는 따로 포스팅하겠다.)

public class MyService extends Service {
    @Override
    public void onCreate() {
        Toast.makeText(getBaseContext(), "Start MyService", 
                           Toast.LENGTH_SHORT).show();

        
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

이렇게 만들어 놓으면, 안드로이드폰 전원을 켤 때마다 해당 서비스가 자동으로 스타트 되는 것을 확인할 수 있다.

 

반응형