안드로이드
DAY014. Android(4)
피톤치즈
2017. 1. 26. 22:37
반응형
Android
App component
- 앱 구성 요소
- activity (보이는 화면)
- broadcast receiver (공지사항?)
- service (백그라운드에서 실행되는 컴포넌트, 안보이는 놈, 스레드 구현.)
- content provider
- intent : 앱 구성요소 중 activity, broadcast receiver, service 간에 데이터를 주고 받을 수 있는 전달자 역할
- content resolver : content provider를 활성화 시킴.
- 참조(한글) : https://developer.android.com/guide/components/fundamentals.html?hl=ko
- 앱 구성 요소
App architecture
- 이건 DAY005에 했던 내용과 중복..
intent
- 명시적 동작 : class_name.class 이런식으로 정의할때 지정해주는것.
- 암묵적 동작 : 정의되어 있는 Action을 호출하는것 (intent filter)
Activity
- life cycle 에서 pause 와 stop 의 차이는 화면이 완전히 보이지 않으면 stop, 보이거나 일부만 가려지면 pause.
- pause는 시스템이 죽일수 없음. stop은 상황에 따라…
- 도식화한 그림 외워야함. 완전 중요!!!!
<예제 1,2,3, 배치.>
- 예제1. lifecycle확인
//Activity life cycle 예제 set // main activity외에 2개의 empty acivity (commonActivity, transActivity) 생성. // main에 버튼 3개 생성 (Common, Trans, Trans2) // onClick함수에 생성한 버튼에 Activity연결 public void onClick(View v) { Intent intent = null; String values = ""; switch (v.getId()) { case R.id.btCommon: intent = new Intent(this, CommonActivity.class); startActivity(intent); break; case R.id.btTrans: intent = new Intent(this, TransActivity.class); startActivity(intent); break; case R.id.btTrans2: intent = new Intent(this, TransActivity.class); startActivity(intent); break; } } //life사이클 관련 함수 6개 override @Override protected void onStart() { super.onStart(); client.connect(); System.out.println("Start"); //콘솔창에 출력 AppIndex.AppIndexApi.start(client, getIndexApiAction()); } @Override protected void onResume() { super.onResume(); System.out.println("Resume"); //콘솔창에 출력 } @Override protected void onPause() { super.onPause(); System.out.println("Pause"); //콘솔창에 출력 } @Override protected void onStop() { super.onStop(); AppIndex.AppIndexApi.end(client, getIndexApiAction()); client.disconnect(); System.out.println("Stop"); //콘솔창에 출력 } @Override protected void onRestart() { super.onRestart(); System.out.println("Restart"); //콘솔창에 출력 } @Override protected void onDestroy() { super.onDestroy(); System.out.println("Destroy"); //콘솔창에 출력 } // 버튼을 눌러보면서 콘솔창의 메시지를 보면서 life cycle을 확인.
- 예제 2. 명시적 intent 와 data 주고 받기 예제
// 위에서 생성한 버튼 3개로 사용, editText 1개 생성, textView 2개 생성 // 위에서 생성한 버튼 3개로 사용 // 명시적 intent 예제 set // main에 버튼 3개 (Dial, Browser, SMS) editText 3개 (Dial, Browser, SMS) 생성 // common과 trans에 textView 1개 만들기 값 들어오면 setting할 수 있도록 설정. // trans에는 button, editText 각 1개씩 추가. // 첫번째에서 생성한 버튼에 Activity연결 public static final int ONE = 1; public static final int TWO = 2; @Override public void onClick(View v) { Intent intent = null; String values = ""; switch (v.getId()) { case R.id.btCommon: intent = new Intent(this, CommonActivity.class); //명시적 intent 예 //액티비티로 값 넘기기 intent.putExtra("var", etInput.getText().toString()); startActivity(intent); //값을 주기만 할때. break; case R.id.btTrans: intent = new Intent(this, TransActivity.class); //액티비티로 값 넘기기 intent.putExtra("var", etInput.getText().toString()); startActivityForResult(intent, ONE);//값을 돌려 받을때는 이와같이 필요. break; case R.id.btTrans2: intent = new Intent(this, TransActivity.class); //액티비티로 값 넘기기 intent.putExtra("var", etInput.getText().toString()); startActivityForResult(intent, TWO); break; } } // intent가 보내준 값 받기만... common activity가 호출되면 바로 받기... protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_common); tvText = (TextView) findViewById(R.id.tvText); //intent 꺼내기 Intent cInt = getIntent(); //intent에서 bundle(extra 묶음) 꺼내기 Bundle bundle = cInt.getExtras(); //bundle에서 변수타입에 맞게 직접 꺼내기. String str = bundle.getString("var"); tvText.setText(str); } // intent가 보내준 값 받기만... trans activity가 호출되면 바로 받기... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_trans); btTrans = (Button)findViewById(R.id.btTrans); etTrans = (EditText)findViewById(R.id.etTrans); tvReceive = (TextView)findViewById(R.id.tvReceive); btTrans.setOnClickListener(this); //intent 꺼내기 Intent cInt = getIntent(); //intent에서 bundle(extra 묶음) 꺼내기 Bundle bundle = cInt.getExtras(); //bundle에서 변수타입에 맞게 직접 꺼내기. String str = bundle.getString("var"); tvReceive.setText(str); etTrans.setText(str); } // trans activity에서 onClick method 생성하여 다시 넘겨줄 intent 생성 @Override public void onClick(View view) { //인텐트 생성 Intent intent = new Intent(); //되돌려줄 값 설정 String result = etTrans.getText().toString(); //처리상태 설정 int statusCode = 1; //처리상태가 문제 있으면 처리상태 변경 if (result == null || result.equals("")) { statusCode = 0; } //돌려줄값 intent에 설정 intent.putExtra("result", result); //setResult method로 결과값 전송 setResult(statusCode, intent); //activity 종료 finish(); } // main activity에 onActivityResult 함수 생성 /**startActivityForResult() method로 호출된 액티비티가 종료되면서 호출 * @param requstCode * @param resultCode * @param data */ @Override protected void onActivityResult(int requstCode, int resultCode, Intent data) { super.onActivityResult(requstCode, resultCode, data); if ( resultCode == 1) { //호출이 성공하면.. //돌려받은 intent 꺼냄 Bundle bd = data.getExtras(); String res = bd.getString("result"); //어떤 버튼으로 부터 호출되었던 activity인가? switch (requstCode) { case ONE: tvRTExt.setText(res); break; case TWO: tvRes.setText(res); break; } } else { //실패 } }
- 예제 3. 암묵적 intent 예제
// 암묵적 intent 예제 set // main에 버튼 3개 (Dial, Browser, SMS) editText 3개 (Dial, Browser, SMS) 생성 public void onClick(View v) { //여기 함수 내에... switch (v.getId()) { //........ case R.id.btDial : //dial 실행. values = etDial.getText().toString(); intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + values)); //암묵적 intent startActivity(intent); break; case R.id.btBrowser : //dial 실행. values = etBrowser.getText().toString(); intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://" + values)); startActivity(intent); break; case R.id.btSMS : //dial 실행. values = etSMS.getText().toString(); intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + values)); startActivity(intent); break; } }
<예제 4 배치>
- 예제 4. webView 사용 예제
// 프로젝트 생성하여 browser activity 추가. // main에서는 버튼 1개생성, browser 호출하는 기능으로 추가. 코드 생략. // browser activity 는 button 2개(주소입력, 뒤로가기키), editText 1개(주소입력), webView 1개 추가. @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_browser); btBack = (Button)findViewById(R.id.btBack); btGo = (Button)findViewById(R.id.btGo); etUrl = (EditText)findViewById(R.id.etUrl); wvView = (WebView)findViewById(R.id.wvView); btBack.setOnClickListener(this); btGo.setOnClickListener(this); //script 사용설정 (필수) wvView.getSettings().setJavaScriptEnabled(true); //줌설정 wvView.getSettings().setSupportZoom(true); wvView.setWebViewClient(new WebViewClient()); wvView.loadUrl("https://google.com"); } // click함수에 동작하는 것을 코딩. @Override public void onClick(View v) { Intent intent = new Intent(this, WebView.class); switch (v.getId()) { case R.id.btBack : if (wvView.canGoBack()) { wvView.goBack(); } break; case R.id.btGo : String url = etUrl.getText().toString(); wvView.loadUrl(url); break; } } // 사용권한 설정 manifest.xml에 넣기. // 이거 안하면 동작 안함. <!-- 퍼미션 선언 --> <uses-permission android:name="android.permission.INTERNET" />
반응형