빡빡종
405
2018-12-20 13:55:22 작성 2018-12-20 13:56:50 수정됨
1
431

[안드로이드 스튜디오] 브로드캐스트 리시버 - ACTION_SUTDOWN




public class Myservice extends Service {

    ScreenOnReceiver screenOnReceiver = new ScreenOnReceiver();

 @Override
    public IBinder onBind(Intent intent) {
        // Service 객체와 (화면단 Activity 사이에서)
        // 통신(데이터를 주고받을) 때 사용하는 메서드
        // 데이터를 전달할 필요가 없으면 return null;
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        // 서비스에서 가장 먼저 호출됨(최초에 한번만)
}

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 서비스가 호출될 때마다 실행
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.SCREEN_ON");
        filter.addAction("android.intent.action.SCREEN_OFF");
        filter.addAction("android.intent.action.SHUTDOWN");
        filter.addAction("android.intent.action.BOOT_COMPLETED");


 registerReceiver(screenOnReceiver, filter);
        return super.onStartCommand(intent, flags, startId);
    }


 @Override
    public void onDestroy() {
      
        super.onDestroy();
        // 서비스가 종료될 때 실행

    }

class ScreenOnReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();


            Log.d("asdf", action + "");
            Toast.makeText(context, action + "", Toast.LENGTH_SHORT).show();

            if (action.equals(Intent.ACTION_SCREEN_ON)) {
               
            } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                

            } else if (action.equals(Intent.ACTION_SHUTDOWN)) {
               
            } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
               
            }
        }
    }



(필요한 부분 전부 잘 긁어왔나 헷갈립니다.)

위 코드 부분에서 SCREEN_ON과 SCREEN_OFF는 잘 작동합니다.


그래서 똑같은 방법으로 ACTION_SHUTDOWN, BOOT_COMPLETED도 써서 추가 해 줬는데


이쪽은 Toast나 Log를 찍어봐도 메시지가 나오지가 않습니다.


혹시 몰라서 메니페스트에

<service android:name="Myservice">
            <intent-filter>
                <action android:name="android.intent.action.ACTION_SUTDOWN"/>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </service>


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

이렇게 추가는 했는데 브로드캐스트 쪽을 잘 모르다보니까 너무 중구난방으로 구글링한거를

짜집기 한거같기도하고..



해결 방법이 뭐가 있을까요?  전원이 꺼질때 특정행동을 하게 꼭 하고 싶습니다 ㅠㅠ



0
0
  • 답변 1

  • Deer Hunter
    197
    2018-12-21 00:08:47
    아래 사항들을 참고하시기 바랍니다.

    1.ACTION_SHUTDOWN broadcast action 은 Android 9 부터 receiver를 명시적으로 등록해야만 해당 event를 수신할 수 있습니다.(AndroidManifest file 에 선언하는 것은 동작 안함)
    그러므로 AndroidManifest file에 선언한 부분은 삭제하는 것이 좋을 것 같습니다.

    2.잘못된 ACTION_SHUTDOWN broadcast action 이 filter 에 추가되었습니다.
    "android.intent.action.SHUTDOWN”가 아니라 “android.intent.action.ACTION_SHUTDOWN” 입니다.
    이러한 종류의 오류를 방지하고 또한 추후 Android platform 내부의 값 변화등을 대처하기 위해서는 이와 같이 해당 값을 직접 사용하는 것보다는 Intent.ACTION_SHUTDOWN 형태로 이용하는 것이 바람직한 방향입니다.

    3.해당 Service component의 life cycle을 모르는 관계로 다를 수도 있습니다만, service 내에서 broadcast 등록은 불필요한 중복 등록을 막기위해 onCreate method 에서 수행하는 것이 일반적 입니다.

    4.Broadcast 를 등록한 이후에는 memory 누수등을 막기위해 더 이상 사용되지 않을 시 등록 해제를 해주어야 합니다. Service의 경우 onDestory method 에서 해주시면 됩니다.
    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.