안드로이드

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

  • 출처 : https://developer.android.com/images/training/basics/basic-lifecycle.png?hl=ko

    • 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" />
    



    반응형