본문 바로가기

플밍 is 뭔들/안드로이드_인강

08-1. 인텐트

※ 인텐트란?
 - 액티비티 전환시 정보를 전달하기 위한 목적으로 만들어진 장치
 - 인텐트를 이용하여 액티비티에서 웹사이트를 연결하거나 다른 어플을 실행하거나(ex 전화 다이얼, 전화 걸기, 연락처) 할 수 있다. 
   이러한 것들의 사용법은 안드로이드 프레임 워크에 다 설정 되어 있으므로 레퍼런스 문서를 참조하면 된다.
 - 또한 엑티비티를 이용하여 데이터를 전달하기도 한다.

사진출처 : 서울위즈 앱 창업자를 위한 안드로이드 실무 동영상

※ 명시적 인텐트 & 암시적 인텐트
 - 명시적 인텐트 : 호출 대상이 정해져 있는 경우
 - 암시적 인텐트 : 호출 대상이 정해져 있지 않은 경우
 - 암시적 인텐트를 사용할 때에는 androidManifest.xml파일에 permission을 통해 권한을 줘야함.

※ 액티비티 통신
 - 액티비티 간에 통신 수단으로 사용되는 인텐트 안에 특정 정보를 전달 할 수 있다.
 - 액티비티 간의 통신은 일방적으로 보내고 끝나는 통신(startActivity)과 주고 받는 통신(startActivityForResult)이 있다.

사진출처 : 서울위즈 앱 창업자를 위한 안드로이드 실무 동영상

※ startAcivity를 이용한 액티비티 간의 통신
데이터를 세팅하고 전달하는 부분
public class MainActivity extends Activity {
      
      Button button;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);   
            
            button = (Button) findViewById(R.id.bt_move_activity);
            button.setOnClickListener(onclick);
      }
      
      OnClickListener onclick = new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                  switch(v.getId()){
                  case R.id.bt_move_activity:
                        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                        //데이터를 인텐트에 세팅 (key값, 전송할 값)
                        intent.putExtra("u_id", "id값");
                        intent.putExtra("u_pw", "pw값");
                        startActivity(intent);
                        break;
                        
                  default :
                        break;
                        
                  }
            }
      };
}

데이터를 전달받는 부분
public class SecondActivity extends Activity {
      
      Button btn ;
      TextView tv;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            setContentView(R.layout.activity_second);
           
                        //전달받은 데이터를 받아서 값을 레이아웃에 넣는 부분
            Intent intent = getIntent();
            String u_id = intent.getStringExtra("u_id");
            String u_pw = intent.getStringExtra("u_pw");
            
            tv = (TextView) findViewById(R.id.textView);
            tv.setText("전달받은 ID : " + u_id + "전달받은 PW : " + u_pw);
            
            btn = (Button) findViewById(R.id.move_main);
            btn.setOnClickListener(onclick);
      }
}



※startActivityForResult를 이용한 액티비티간의 통신
데이터를 세팅하고 전달하는 부분
public class MainActivity extends Activity {
      
      final static int USER_INFO = 0;
      Button button;
      TextView tv;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
            Log.i("MainActivity", "onCreate() 생명주기 test");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);   
            
            button = (Button) findViewById(R.id.bt_move_activity);
            button.setOnClickListener(onclick);
            
            tv = (TextView) findViewById(R.id.mainTV);
      }
      
      OnClickListener onclick = new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                  switch(v.getId()){
                  case R.id.bt_move_activity:
                        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                        intent.putExtra("u_id", "abc");
                        intent.putExtra("u_pw", "1234");
                        //인텐트와 구분자를 전송한다.
                        startActivityForResult(intent, MainActivity.USER_INFO);
                        break;
                        
                  default :
                        break;
                        
                  }
            }
      };
      
      //startActivityForResult를 이용했기 때문에 다시 값을 전달 받는다. 다시 값을 전달 받는 부분
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            //requestCode : 전송한 구분자 값
            //resultCode : 전송받은 구분자 값
            //data : 전송받은 데이터값 putExtra
            switch(requestCode){
            case MainActivity.USER_INFO :
                  if(resultCode == SecondActivity.LOG_SU){
                        tv.setText("login success : " + data.getStringExtra("user_info"));
                  }else if(resultCode == SecondActivity.LOG_FA){
                        tv.setText("login fail : " + data.getStringExtra("user_info"));
                  }
            }
      }
}

데이터를 전달받고 다시 전달한 곳으로 데이터를 보내는 부분
public class SecondActivity extends Activity {
      
      Button btn ;
      TextView tv;
      public final static int LOG_SU = 0;
      public final static int LOG_FA = 1;
      boolean logFlag;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            setContentView(R.layout.activity_second);
            
            Intent intent = getIntent();
            String u_id = intent.getStringExtra("u_id");
            String u_pw = intent.getStringExtra("u_pw");
            
            tv = (TextView) findViewById(R.id.textView);
            tv.setText("전달받은 ID : " + u_id + "전달받은 PW : " + u_pw);
            
            if(u_id.equals("abc")&& u_pw.equals("1234")){
                  logFlag =true;
            }else{
                  logFlag =false;
            }
            
            btn = (Button) findViewById(R.id.move_main);
            btn.setOnClickListener(onclick);
      }
      
      OnClickListener onclick = new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                  // TODO Auto-generated method stub
                  switch(v.getId()){
                  case R.id.move_main :
                        Intent intent = new Intent(SecondActivity.this, MainActivity.class);
                        //인텐트에 데이터 세팅
                        intent.putExtra("user_info", tv.getText().toString());
                        if(logFlag){
                              //구분자값을 인텐트에 세팅해 다시 전달
                              setResult(SecondActivity.LOG_SU, intent);
                        }else{
                              //구분자값을 인텐트에 세팅해 다시 전달
                              setResult(SecondActivity.LOG_FA, intent);
                        }
                        finish();
                        break;
                  default :
                        break;
                  }
                  
            }
      };
}