안녕하세요?


지난번 포스팅에서 브로드 캐스트 수신자를 사용하는 해서 받는 것 까지 해봤는데, 이제 이것을 화면에 띄우는 내용을 실습해서 포스팅 하고자 합니다.



우선 package explorer에 마우스 우클릭을 해서, 위 스크린샷처럼 액티비티를 만드는 메뉴를 불러 오도록 합니다. 이 액티비티의 이름은 SmsActivity로 지정을 하였습니다.



다음으로는 activity_Sms.xml로 가서 위 스크린샷처럼 입력상자 3개와 버튼 하나를 두었습니다. 제약 레이아웃의 규격이 처음에는 많이 낯설었지만, 그래도 계속 하니까 어느정도 익숙해져 가는 것을 느끼는 중입니다.



다음은 SmsActivity.java에 본격적인 코딩을 시작하는 단계입니다. 우선 editText로 먼저 입력상자의 ID랑 변수이름이랑 지정을 하도록 합니다. 그리고 나서 확인 버튼을 누르면 화면이 사라지도록 finish(); 를 입력하도록 하고, 다음으로는 브로드 캐스트로 온 인텐트(Intent)-여기서는 아마도 SMS메세지가 될 것이기 때문에, 이를 받기 위한 getIntent메서드를 사용합니다. 그리고 나서, processIntent()라는 임의의 메서드로 이어서 작업을 하도록 합니다.




먼저 onNewIntent()라는 메서드를 입력해서 새로 액티비티가 생성되는 때가 아닌, SmsActivity가 이미 켜져있는 상태에서도 SMS문자 메세지가 왔을 경우에 받을 수 있도록 합니다.




다음으로는 processIntent()메소드를 코딩하도록 합니다. 여기서 당연 if구문을 두어서 인텐트가 빈 상태가 아닐때 작동이 되도록 합니다. 


여기서는 이미 인텐트의 데이터명이 지정이 된 것으로 나와있지만, 나중에 나올 SmsReceive.java에서 SmsActivity로 인텐트를 보내는 코딩을 할때, 여기서 일일히 데이터명과 데이터 내용을 지정하게 됩니다. 지금은 이미 지정이 되어 있다고 가정하고 코딩을 하는 것입니다.


여기서는 주요 내용은 String으로 각각의 문자열 변수를 지정하고서, 인텐트에서 어떻게 어떤 데이터명의 값을 가져와라 라는 구문이고, 이어서 editText.로 시작하는 구문은 앞서 activity_Sms.xml에 배치한 입력상자의 내용을 어떻게 다음의 내용으로 바꾸어라 하는 구문입니다.



다음은 SmsReceive.java를 코딩하는 내용입니다. 여기서는 우선 책에 나오지 않아서 놓친 부분을 위에 올려진 스크린샷에 보이는 것처럼 코딩을 해 놓았습니다. 저로서는 자세한 내용은 모르겠습니다만, 일단 이것이 날짜 형식을 만드는 명령어라는 것은 알만합니다. 


public SimpleDateFormat 변수 = new SimpleDateFormat("내용");


이어서 SmsActivity로 인텐트를 보내는 코딩을 시작하도록 합니다.



이번에는 sendToActivity()라는 메서드를 만들어서 코딩합니다. 당연 브로드 캐스팅도 실제로 존재하는 화면이 없기 때문에 addFlags를 두어서 FLAG_ACTIVITY_NEW_TASK를 두어야 합니다. 그리고 이어지는 FLAG_ACTIVITY_SINGLE_TOP과 FLAG_ACTIVITY_CLEAR_TOP도 두도록 합니다.


이어지는 putExtra()메서드는 이전에 설명한 그대로이고, 여기서는 특이한 것이라면, startActivity()라고 바로 시작하는 것이 아니라 

context.startActivity(인텐트); 로 되어 있다는 것입니다.


여기서 context가 정확히 무엇인지 알기 어렵긴 합니다. 다만 제가 이해한 바로는 이 SmsReceive라는 브로드 캐스팅에서 인텐트를 보내기 위해서는 그냥 start가 아니라 이런 방법을 써야 한다는 것입니다. 그래서 인텐트를 보내기 위한 코딩도 다음과 같이 구성이 되어 있습니다.


Intent 인텐트명 = new Intent(context, 액티비티명.class);

context.startActivity(인텐트명);



여기까지 코딩을 하고서 에뮬레이터에서 실행을 해 보았습니다만, 원하는 대로 액티비티가 뜨지를 않았습니다. 어디가 문제인지 몰라서 일단 AndroidManifest.xml로 가 보았습니다.



코딩을 하는 단계에서 무언가를 잘못 오타를 내어서 위 스크린샷에서 붉은색 밑줄을 친 부분이 잘못되어 있었습니다. 그래서 하는 수 없이 이 부분을 고쳤습니다.



이렇게 고치고 나서 다시금 실행을 시켰지만, 역시 액티비티는 뜨지를 않았습니다. 그래서 이번에는 AndroidMoniter에서 logcat을 보고서 onReceive()메서드는 제대로 호출이 되는지 살펴 보았습니다.



일단 제대로 logcat에서는 onReceive()메서드가 호출이 되는 것을 알 수 있었습니다. 그래서 다시금 어디가 문제인지 SmsReceive.java를 천천히 살펴 보았습니다.



고작 단 한줄이었지만, 이 한줄이 없어서 큰 에러가 뜨는 것이였습니다. 어떤 임의의 메서드이든 그냥은 실행이 안되고, 어디서 실행하라는 명령이 있어야 하는데, 생각해 보면 이게 없는 것 자체가 이상한 일이었습니다. 아무튼 이번에야 말로 제대로 실행이 될 것을 기대를 하고 한번 에뮬레이터를 실행시켜 보았습니다.



의도한 대로 제대로 SmsActivity에서 발신자 번호와 수신시각, 그리고 문자의 내용이 나오고 있는 것을 볼 수 있습니다. 이것으로 일단 Do it 안드로이드 앱 프로그래밍 책을 거의 1/3은 했다는 생각이 듭니다. 앞으로 나오는 내용은 위젯에 관한 내용인데, 이 내용들은 비교적 쉽게 익힐 수 있기를 기원합니다.

+ Recent posts

티스토리 툴바