Broadcast Receiver 등록하고 시스템 이벤트 받아서 처리하기

Lee HyeongJong·2023년 3월 16일
0

안드로이드

목록 보기
36/43

1. BroadcastReceiver 메서드

about : 파일번역 다운로드
메서드로 만들었으나 class로 만드는것이 대체적이다
broadcast는 10초이상 지연되지 않는 간단한 코드로 작성한다
그 이상 넘어갈 시 앱이 죽는 증상 발생

AndroidManifest로 작업할수도 있으나 unregister()를 사용할 수 없는 문제로 사용하지 않았다.(참조링크)

액션리스트

https://chromium.googlesource.com/android_tools/+/febed84a3a3cb7c2cb80d580d79c31e22e9643a5/sdk/platforms/android-23/data/broadcast_actions.txt

Code

private BroadcastReceiver tFileDownloadReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            if(intent.hasExtra(DownloadManager.EXTRA_DOWNLOAD_ID) && intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) != -1 && downloadQueueID != null){ //투표결과와 예외처리
                long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);

                if (downloadQueueID == reference) {
                    DownloadManager.Query query = new DownloadManager.Query();  // 다운로드 항목 조회에 필요한 정보 포함
                    query.setFilterById(reference);
                    Cursor cursor = downloadManager.query(query);

                    if (!cursor.moveToFirst()) {
                        return;
                    }

                    int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
                    int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);

                    int status = cursor.getInt(columnIndex);
                    int reason = cursor.getInt(columnReason);

                    cursor.close();

                    switch (status) {
                        case DownloadManager.STATUS_SUCCESSFUL:
                            if (chatMstVO.getChatDataList() != null) {
                                int count = rootNode.getChildren().size();
                                for (int i = count; i > 0; i--) {
                                    TreeNode node = rootNode.getChild(i - 1);
                                    treeView.removeNode(node);
                                }
                                for (int i = 0; i < chatMstVO.getChatDataList().size(); i++) {
                                    ChatVO chatVO1 = chatMstVO.getChatDataList().get(i);
                                    TreeNode chatNode = new TreeNode(chatVO1).setViewHolder(new ChatViewHolder(ChatViewActivity.this));
                                    rootNode.addChildren(chatNode);
                                }
                                if (scrollView.isScrollEnded) {
                                    scrollView.post(new Runnable() {
                                        @Override
                                        public void run() {
                                            scrollView.fullScroll(View.FOCUS_DOWN);
                                        }
                                    });
                                }
                            }
                            treeView.expandAll();
                            break;

                        case DownloadManager.STATUS_RUNNING:
                            Toast.makeText(ChatViewActivity.this, getString(R.string.sen077), Toast.LENGTH_SHORT).show();
                            break;

                        case DownloadManager.STATUS_PAUSED:
                            Log.e(TAG, "onReceive: STATUS_PAUSED = " + reason);
                            break;

                        case DownloadManager.STATUS_FAILED:
                            Log.e(TAG, "onReceive: STATUS_FAILED = " + reason);
                            Toast.makeText(ChatViewActivity.this, getString(R.string.sen104), Toast.LENGTH_SHORT).show();
                            break;
                    }
                }
            }
        }
    };

2. 리시버 등록

위치

  1. onCreate / onDestroy(unregister)
  2. onResume / onPause(unregister)
    리시버를 onCreate에 등록하면 unregister는 onDestroy
    onResume에 등록하면 unregister는 onDestroy에 등록한다

Code

IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
registerReceiver(tFileDownloadReceiver, intentFilter);

3. LifeCycle에 맞춘 unregister()

위치

  1. onCreate / onDestroy(unregister)
  2. onResume / onPause(unregister)
    if (tFileDownloadReceiver != null) {
        try {
            unregisterReceiver(tFileDownloadReceiver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

참조

https://developer88.tistory.com/m/entry/Broadcast-Receiver-%EB%93%B1%EB%A1%9D%ED%95%98%EA%B3%A0-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B0%9B%EC%95%84%EC%84%9C-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0

profile
코딩을 시작해보자

0개의 댓글