투케이2K

129. (AndroidStudio/android/java) android.intent.action.BOOT_COMPLETED 사용해 브로드캐스트 부팅 이벤트 받기 본문

Android

129. (AndroidStudio/android/java) android.intent.action.BOOT_COMPLETED 사용해 브로드캐스트 부팅 이벤트 받기

투케이2K 2021. 5. 3. 15:10
반응형

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : AndroidStudio

개발 언어 : java

/* =========================== */

/* =========================== */

[소스 코드]

[AndroidManifest.xml 파일]

<퍼미션 등록 부분>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.BOOT_COMPLETED" />



<액티비티 등록 부분>
<activity
            android:name=".A_Boot"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan"/>



<브로드캐스트 등록 부분>
<receiver
	android:name=".A_BootReceiver"
	android:enabled="true"
	android:exported="true"
	android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
	<!-- [부팅 이벤트를 받기 위함] -->
	<intent-filter android:priority="1000">
		<category android:name="android.intent.category.DEFAULT"/>
		<action android:name="android.intent.action.BOOT_COMPLETED"/>
		<action android:name="android.intent.action.QUICKBOOT_POWERON" />
		<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
		<action android:name="android.intent.action.USER_PRESENT"/>
		<action android:name="android.intent.action.REBOOT"/>
		<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
	</intent-filter>
</receiver>

[JAVA 파일 : A_Boot]

package kr.co.two2k.manager;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;

import android.os.Bundle;

import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;

import android.view.inputmethod.InputMethodManager;

import android.widget.EditText;

public class A_Boot extends AppCompatActivity {

    //TODO [클래스 전역 변수 선언]
    String boot_Data = "";

    //TODO [클래스 컴포넌트 선언]
    EditText display_edit;

    //TODO [액티비티 시작 메소드]
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a_boot_receiver);
        Log.d("---","---");
        Log.d("//===========//","================================================");
        Log.d("","\n"+"[A_Boot > onCreate() 메소드 : 액티비티 시작 실시]");
        Log.d("//===========//","================================================");
        Log.d("---","---");

        //TODO [컴포넌트 매칭 실시]
        display_edit = (EditText)findViewById(R.id.display_edit);

        //TODO [최근 부팅된 날짜 확인]
        try {
            boot_Data = String.valueOf(S_Preference.getString(getApplication(), "Boot_Date"));
            if(boot_Data != null && boot_Data.length() > 0 &&
                !boot_Data.equals("") && !boot_Data.contains("null")){ //TODO 널값이 아닐 경우
                display_edit.setText(boot_Data);
            }
            else{
                display_edit.setText("NULL");
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

    }//TODO 메인 종료

    //TODO [백버튼 터치시 뒤로 가기]
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // 디바이스의 키 이벤트가 발생했는데, 뒤로가기 이벤트일때
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Log.d("---","---");
            Log.d("//===========//","================================================");
            Log.d("","\n"+"[A_Boot > onKeyDown() 메소드 : 백버튼 터치시 뒤로 가기 이벤트 실시]");
            Log.d("//===========//","================================================");
            Log.d("---","---");
            try {
                //TODO [액티비티 종료 실시]
                finish();
                overridePendingTransition(0,0);
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
        return true;
    }

    //TODO [바깥 레이아웃 클릭 시 키보드 내림]
    @Override
    public boolean dispatchTouchEvent(MotionEvent event){
        int action = event.getAction();
        switch(action){
            case(MotionEvent.ACTION_DOWN):
                try {
                    //TODO [창 내리는 용도]
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(display_edit.getWindowToken(), 0);
                }
                catch (Exception e){
                    e.printStackTrace();
                }
                break;
            case(MotionEvent.ACTION_MOVE):
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }

    //TODO [액티비티 종료 메소드]
    @Override
    public void onDestroy(){
        super.onDestroy();
        Log.d("---","---");
        Log.d("//===========//","================================================");
        Log.d("","\n"+"[A_Boot > onDestroy() 메소드 : 액티비티 종료 확인]");
        Log.d("//===========//","================================================");
        Log.d("---","---");
        try {
            //TODO [변수 초기화 실시]
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

    //TODO [액티비티 실행 준비 메소드]
    @Override
    public void onResume(){
        super.onResume();
        Log.d("---","---");
        Log.d("//===========//","================================================");
        Log.d("","\n"+"[A_Boot > onResume() 메소드 : 액티비티 실행 준비]");
        Log.d("//===========//","================================================");
        Log.d("---","---");
        try {
            //TODO [외부 브라우저 복귀 시 화면 전환 애니메이션 없애기 위함]
            overridePendingTransition(0,0);
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

}//TODO 클래스 종료

[JAVA 파일 : A_BootReceiver]

package kr.co.two2k.manager;

import android.content.BroadcastReceiver;
import android.content.Context;

import android.content.Intent;
import android.util.Log;

import java.text.SimpleDateFormat;
import java.util.Date;

public class A_BootReceiver extends BroadcastReceiver {

    /**
     * 1. 퍼미션 : 부팅 이벤트를 받기 위함
     * <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     * <uses-permission android:name="android.permission.BOOT_COMPLETED" />
     *
     * 2. 참고사항 :
     * 애플리케이션을 작업 목록에서 완전히 지워버릴 경우 (kill) 브로드 캐스트 리시버 알림을 받지 못합니다
     * */

    //TODO [클래스 전역 변수 선언 부분]
    public static final String BOOT_EVENT = "android.intent.action.BOOT_COMPLETED";
    String actionName = "";
    String actionContent = "";
    Context mContext;

    //TODO [onReceive 메소드를 재정의 (채널 알림 메시지 확인 부분)]
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            mContext = context;
            actionName = String.valueOf(intent.getAction());
            actionContent = String.valueOf(intent.getStringExtra("broadCastData"));
            Log.d("---","---");
            Log.w("//===========//","================================================");
            Log.d("","\n"+"[A_BootReceiver > onReceive() 메소드 : 수신받은 채널 알림 내용 확인]");
            Log.d("","\n"+"[채널 : "+String.valueOf(actionName)+"]");
            Log.d("","\n"+"[내용 : "+String.valueOf(actionContent)+"]");
            Log.w("//===========//","================================================");
            Log.d("---","---");

            //TODO [프리퍼런스에 부팅된 시간 저장 실시]
            if(BOOT_EVENT.equals(actionName)){ //TODO 부팅 이벤트를 받은 경우
                S_Preference.setString(mContext, "Boot_Date", String.valueOf(getNowTime24()));
            }
            else {
                S_Preference.setString(mContext, "Boot_Date", String.valueOf(actionName));
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

    //TODO [현재 날짜 및 시간 확인 메소드]
    public static String getNowTime24() {
        long time = System.currentTimeMillis();
        //SimpleDateFormat dayTime = new SimpleDateFormat("hh:mm:ss");
        SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
        String str = dayTime.format(new Date(time));
        return str;
    }

}//TODO 클래스 종료

/* =========================== */

/* =========================== */

[결과 출력]

/* =========================== */

 

반응형
Comments