안녕하세요. 초보개발자 입니다.
개발중 막히는 부분이 있어서 질문드립니다.
게시판 목록화면이 있다고 가정하고 시작하겠습니다.
엑티비티는 3개입니다.
A: 메인 엑티비티, B: 웹뷰 엑티비티, C: 비디오플레이어 엑티비티 (이하 A,B,C)
게시판 목록에서 글을 클릭하면
A가 실행되고 특정한 Key값과 Flag를 가지고 들어가는데요.
여기서는 어떠한 화면을 보여주지는 않고 컨트롤러 역할만 합니다.
Flag값으로 구분하여 Flag가 1이면 B를, 2이면 C를 실행시킵니다.
ex)
if (Flag == 1){
//B
Intent intent = new Intent(mActivity.getApplicationContext(), WebView.class);
mActivity.startActivityForResult(intent, 1);
}else if(Flag == 2){
//C
Intent intent = new Intent(mActivity.getApplicationContext(), Video.class);
intent.setData(Uri.parse("/xxxxsample.mp4"));
mActivity.startActivityForResult(intent, 2);
}
그런데 문제는 B 실행중에 '다음' 버튼을 누르면 다음에 해당하는 Key값과 Flag값을 다시 A에게 전달하고
A가 Flag값으로 또 구분하여 B나 C를 실행시켜야 합니다.
실행중인 엑티비티는 종료되거나 변경이 되어야 겠죠.
쉽게 생각하면 게시판에서 이전글, 다음글 정도로 생각하면 될 듯 합니다.
대신 Flag값에 따라서 다른 Activity를 열어줘야 한다는거죠.
그리고 백버튼이나 '목록'버튼을 누르면 다시 목록화면이 나와야 하구요.
제가 막히는 부분은 B 실행중에 C를 실행하려면 A를 무조건 거쳐가야 하는데
맞는 방법인지도 잘 모르겠고 B에서 A를 호출하는 방법을 잘 모르겠습니다. ㅠㅠ
처음 접해보는거라 개념이 많이 없습니다. 자세한 설명 부탁드립니다.
제가 더 생각할 부분이나 고려해야 할 부분이 있으면 조언도 좀 부탁드립니다. (_ _)
저도 초보이고 하수이라 답변을 달아보지만 확신은 없습니다.
간단하게 정리하니 참고만 하시기 바랍니다.
액티비티간에 호출방법이 여럿있는데 그중에 떠오르는 것은
1.BroadCast를 등록하는 것(A-B액티비티간 통신을 위해서)
2.onActivityResult를 이용하는 것(A,start - B.finish 간에 intent를 주고 받음)
하하님께서 설명하신 로직대로 따라 해결책을 강구하자면 2의 경우를 쓰는 것이 맞는 거 같구요.
1. <A 액티비티에서> onActivityResult(int request, int result, Intent data)를 정의합니다.
1-1. request값과 result값에 따른 조건문을 만드셔서 각 경우에 대한 처리문을 작성합니다.(if-else)
1-2. intent.putExtra에는 다양한 값을 넣을수 있으니, (Primitive부터 Customed Objest(Serializable or Parce....))
B에서 넘겨온 값을 intent.getExtra로 읽어냅니다.
B에서 넘겨받은 값을 통해 원하시는 값을 또다른 조건문을 통해 처리문을 작성합니다....
2. <B액티비티에서> '다음' 이벤트가 입력될때 key,Flag를 원하시는 타입 혹은 객체에 집어넣고 이를 putExtra함수로 intent에 때려넣습니다.
그리고 setResult(result) 하고 finish()하면 A로 돌아오겠죠
3. onResume이 호출되기 전에(아마?) A는 B.finish에 의해 onActivityResult를 호출하고 B에서 정의된 값에 따른 후속처리를 할 수 있게 됩니다.
이상, 하하님께서 적어주신대로 풀어봤는데, 아무래도 정규적인 코드 언어가 아닌 제 멋대로의 언어로 설명한터라 부족할 수 있습니다. 궁금하시면 또 같이 공유하도록 해요 :) 그리고 또 다른, 보다 정확한 답글이 달리길 기대하셔도 좋구요 ㅋ
사견으로는 A 액티비티가 현재 정확히 액티비티인지 무엇인지 제가 이해를 못한 것인지 그 정체성이 흐린 듯 보여요. A가 extends Activity만 하고 실제로는 Activity의 역할을 안한다면 리소스 낭비,파편화가 일어나는게 아닌지 궁금하거든요. 고수님들의 의견이 듣고 싶네요.
제 의도가 다소 불분명한 상태로(?) 자극적인 메시지를 남겨서 한 분의 성미를 건든 것 같은데, 뭐 아쉽진 않습니다. 이런 류의 메시지가 이슈화되는 것이 옳다고 생각하거든요 갑론을박으로 치고 받는 가운데 성질은 나더라도 분명 얻는게 있으니까요. 게시판 성격상 개발자 질문/답변이라는 게시판이기 때문에, 질문자는 질문하고 답변자는 답변하면 장땡일 수 있지요. 암요, 그런데 무얼 바랬느냐고요? 그것부터 말씀드리는게 도리일 듯 싶군요.
제가 원한 피드백은,
1. 과연 내가 알고 있는 지식과 정보가 맞는 것인가?
2. 내가 언급한 내용에는 아무런 하자가 없을까?
3. 보다 효율적인 방안은 뭐가 있을까?
4. 다른 사람들은 같은 논리에 대한 해석과 풀이를 어떻게 하는가?
5. 혹시 내가 찾지 못한 내용을 다른 사람이 언급하게 되면서 서로의 정보를 확인할 수 있지 않은가?
...이러한 피드백입니다. 새삼 다 아는 것을 왜 설명하냐고요? 새삼 다 아는게 이뤄지지 않을때가 있으니 아쉬워서 위에 메시지를 남겼고 새삼 다 아는 것을 왠지 zgundam님께는 말씀드려야 할 것 같아서요. 같은 이치입니다. 눈에는 눈 이에는 이.
자 그럼 zgundam님. "고맙다는 피드백"...진심으로 감정적인 피드백따위에 목숨걸고 저런 메시지를 남겼다고 생각하시나요? 오히려 되뭍고 싶습니다. 0과 1의 종사하고 계신 분으로 생각하는데 어떤 경험과 사고관이 그러한 판단과 생각. 아니 편견으로 몰아붙이게 되었는지요? 그럴수도 있지만 그걸 왜 언급하셔야 하나요? 한 개인의 생각과 말과 행동은 서로 영향을 주고 그 결과는 주변으로 확산되며 그 결과는 사회를 움직인다는 생각 안하시나요? 작은 사회라도 안드로이드 펍에는 수많은 개발자와 얼리어답터, 개발자를 꿈꾸는 학생들과 그 외의 영역으로 나아갈 학생들, 그리고 저 같은 백수들도 있습니다.
이 작은 사회에 너무 비좁은 식견과 무리한 추측으로 목숨을 거시는군요.
사실 한국에서 태어나 자라 획일적이고 구시대적인 교육 방식에 길들여진 사람들. 상명하복의 원칙대로 살아가는 사람들. 뭐 그리 나쁘진 않습니다. 그대로 가도 사회는 건재할 것이고 이미 적응되었다면 그닥 불편하진 않을테니까요. 헌데 저는 비록 한국에서 태어나 자라왔지만 별로 폐쇄적이고 수직적인 조직속에 길들여지고 싶은 생각은 원체 존재하질 않고 그렇게 살아오질 못했으며 그러한 사람들의 말에 고분고분따라주긴 싫네요. 선생님 혹은 교수님께서 칠판에 적는 죽은 지식들을 생각없이 공책에 빼곡히 적기만 하고 아무런 궁금증도 아무런 질문도 없이 그냥 그러려니 하며 1+1 = 2 이구나 라고 생각하는 형태를 ON-LINE WEB이라는 곳에서까지 답습되는 형태가 답답할 따름입니다.
여기까집니다. 괜히 욱해서 말이 길어졌습니다. 어쨋든 zgundam님이나 저나 우디님이나 모두가 커뮤니티가 잘. 되길 바라는 마음만은 똑같다고 생각합니다. 아무쪼록 건승하시길...
ps. 위 게시물의 제목을 보고 들어오신 분들은 참 어이가 없으실 듯...ㅋ : ) 다 웃자고 하는 소리로 여겨주시길
아..그런 의미의 피드백이었군요..애초에 피드백의 의미를 그런걸 밝혀주셨음 그런 오해는 없었을텐데요..하지만 누구나가 그런 의미로 피드백을 생각하진 않습니다..그건 님만 그렇게 생각하시는 거구요..전 질문에 대한 답변의 피드백을 인사정도로만 생각하거든요..물론 제가 답변을 달아드린거에 테스트 해보니 아니란 피드백도 달릴수 있겠지만 그런 피드백을 달아주심 당연 제가 달아주신 피드백에 고마워하겠죠..기대도 안했던 피드백이니까요..마지막으로 님이 알고 있는 것으로 의미를 일반화 시키지는 말아주셨음 하네요....암튼 의미가 달랐으니 오해를 한거에요..죄송하네요..
음냐냐 =ㅅ= 결코 하하님으로 인해 불만이 생겼다라거나 기분이 나빠다는 것은 전혀 없습니다. 이거 아무래도 정황이 어찌했는지 설명을 드리는게 낳겠군요.
전 여느날과 다름없이 코딩을 하다가, 안펍 게시판에 와서 질/답란으로 향했습니다. 질/답란을 이용하는 이유는 가끔 허접한 질문도 드리고 더더욱 허접하지만 답변(답변이라 할 수는 없구요. 특정 문제(질문)에 대해 관심과 공감을 표현. 즉 저도 배우고 싶어서 답글을 달곤해요..)도 달면서 꾸준히 실력을 키워가고자 함입니다. 윗글에서 이미 읽으셔서 아시겠지만 개발자(?)라고 불리울 수 있는 사람은 못됩니다.
어제도 몇몇글에 관심 답글을 달았고, 질/답란을 떠나서 게시판,정보란에 가서 새로운 글과 고수님들의 의견을 읽어보는데, "요즘 질/답란에 졸작에 관한 질문이 많이 올라오네요."라는 게시물과 그에 대한 여러가지 견해를 보게 되었고, 저도 느낀 바가 있어서 답변글을 싹 지우던 중 하하님의 게시물까지 오게 된 것이었습니다. 근데 하하님의 질문은, 여타 다른 졸작용, 과제용 질문과는 그 질문의 내용과 깊이와 태도(..많은 개발자분들이 질문자의 태도에 대해 꾸중을 하시더라구요..)가 비교할 수 없을 정도로 좋으신데, 이걸 지워야 할까 말아야 할까 고민이 되어 다른 분의 의견을 여쭙게 되었던 것이었습니다... 그러다 여기까지 왔네요 :)
어쨋든 하하님의 프로젝트 진행에 일보 전진이 일어나고 있다면 다행인거구, 아래 낭만폭풍님께서 또 좋은 말씀과 견해를 남겨주시니 좋을 따름이구,,,그리고 저도 고마운게 하하님덕분에 다시 한번 제 코드(불완전하고 불합리적인)를 다시 보게 되었습니다. ㅋ 대대적인 리팩토링에 나서게 될듯 ㅠㅠ 이거 고마워해야 하는건가 ㅠㅠ
그런 사정이 있으셨군요.^^;
개발자란 직업이 평생 공부해야 하는 직업인데도 불구하고 타인과의 지식공유에는 냉담한게 현실인듯 합니다.
(현업에서 어떤 분은 자기 밥줄이라 알려줄수 없다...뭐 이런 표현도 하시더라구요 -ㅅ - 뭐 상황에 따라 틀리겠지만...)
이러한 커뮤니티라도 많이 활성화 되서 서로 배우고 실력향상에 도움이 되면 좋을텐데 말이죠...
일단 이런게 가능하려면 나 자신의 온라인상에서의 자세나 태도부터 뭔가 개선이 되어야 할 것 같네요.
늦은시간까지 고생 많으십니다.
그럼 즐코딩하세요~^^
'A 액티비티가 현재 정확히 액티비티인지 무엇인지 제가 이해를 못한 것인지 그 정체성이 흐린 듯 보여요'
--> 그리고 말씀하신 부분에 대해서는 저도 의문사항이라 뭐라 답변드릴수가 없네요.
개발중인 코드가 특정한 프레임워크(?)를 쓰고있고, javascript에서 native단으로 연결해주는 고리 역할을 하고 있는 Class가 있는데 이것이 바로 A입니다. (정확히 표현하지 못하는 점에 대해서는 양해부탁드립니다 ㅠ_ㅠ)
A는 Activity클래스를 상속받지 않고 있구요, 그런데 Activity호출은 여기서 이루어 지구요...물론 콜백도 이루어 지구요...
상태는 이렇지만 질문사항에서의 포인트는 이것이 아니었기에 그냥 메인엑티비티라고 표현 했습니다.
지식이 모자르다는것... 굉장히 답답하다는 것을 뼈져리게 느끼고 있습니다. ㅠ
짧은 지식으로 하나 답변드리자면
안드로이드는 일반 자바 프로그램처럼 main(String args[]) 메서드를 써서
일반적인 클래스에서 시작하는게 아니라는건 알고 계실겁니다.
근데.. 앱 상에서 시작위치를 정하기 위해서는 반드시 manifest에서 main이라는 액션을 걸어줘야 합니다.
근데 그렇게 액션을 걸어 주기 위해서는 반드시 액티비티를 하나 지정해야 합니다.
(아 물론. 액티비티 없이 작동하는 앱도 있긴 합니다만, 그런건 아닌것 같으므로 논외로 하겠습니다.)
A가 액티비티를 상속받는다고 해도 상관없습니다. 그냥 클래스처럼 쓰면 됩니다. 방법은 많습니다
B에서 A를 호출한다고 하셨는데 birdea님께서 답변하신것 중에 2의 경우가
질문자님의 의도와 가장 적절해 보이는군요.
여기서 주의할게... A를 밑에 깔고 들어가야 한다는건데요
여기서 A가 혹시나 GC되지는 않는지 잘 확인하셔야 합니다.
(이론상으로는 그런데... 경험상 보통은 저 방법을 사용하면 밑의 액티비티가 GC되진 않더군요.)
* 정 액티비티를 쓰는게 찜찜하시면 백그라운드에서 돌아가는 뭔가 만드시거나
아니면 정적 클래스를 하나 만들어서 앱 전체에서 공유하는 데이터를 처리하시는 방법도 있습니다.
그럼 즐개발 하세요.
네 방법은 많을것 같으나 능력이 부족하여 이렇게 헤메고 있네요 ㅠ_ㅠ
birdea님께서 알려주신것 처럼 방향은 잡고 있습니다.
Manifest에는 엑티비티가 3개 등록되어있습니다. (메인, B, C)
자바스크립트에서 메인엑티비티를 호출하는것이 아니라 A라는 클래스를 호출하는데요.
이 클래스는
MainActivity mainActivity = MainActivity.instance;
mainActivity.startActivityForResult ......
이런식으로 메인엑티비티의 instance를 가져와서 B와 C를 실행시키고 있습니다.
말씀하신것 처럼 이 A클래스를 밑에 깔고 B나 C를 실행하는 것이죠. A클래스는 메인의 instance를 가지고 있구요...
글로 설명하려니 복잡하네요 ㅠㅠ
CG에 대한 생각은 차마 못했네요. 체크를 한번 해봐야 할 것 같습니다.
늦은시간인데 도움말씀 감사합니다.




인텐트를 잘 조절하믄 될거 같습니다.