반응형
Intent(인텐트)
여러 화면간 전환을 위해 사용 ( 두 가지 방법 존재)
실행흐름
: Activity "A" -> Intent -> 안드로이드OS -> Intent -> Activity "B"
20-04-08 수
** Intent(인텐트)
안드로이드에서 사용하는 주요 컴포턴트 4개는 안드로이드 OS에서 실행되게 해주어야 한다. 이를 이해 Activity간의 화면전환을 위해 데이터 Intent가 전달하며 공유하는 방식.
[기본 실행흐름]
- 인텐트 객체를 생성하고 실행할 액티비티의 정보와 데이터를 셋팅
- 값 셋팅 : putExtra 메소드를 이용
- 객체 셋팅 : Parcelable을 implement하여 이용
- writeToParcel 메소드 자동호출
- 안드로이드OS에 인텐트 객체 넘기며 의뢰
- startActivity : 액티비티 실행
- 인텐트에 설정되어 있는 액티비티 호출
- 호출된 액티비티에서는 안드로이드OS가 넘겨준 인텐트를 가져오기
- 인텐트에 셋팅된 데이터를 꺼내서 활용
public class ReturnDataFirstActivity extends AppCompatActivity
implements OnClickListener{
public static final int SECOND_BUTTON = 10;
/** Called when the activity is first created. */
Button bt1;
Button bt2;
Button bt3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first2);
bt1 = (Button)findViewById(R.id.call1);
bt2 = (Button)findViewById(R.id.call2);
bt3 = (Button)findViewById(R.id.btnExit);
bt1.setOnClickListener(this);
bt2.setOnClickListener(this);
bt3.setOnClickListener(this);
Log.d("kim","onCreate()");
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.btnExit){
finish();
}else if(v.getId()==R.id.call1){
Intent intent = new Intent();
intent.putExtra("info","첫 번째 액티비티가 넘기는 메시지");
startActivity(intent);
}else if(v.getId()==R.id.call2){
//새로운 액티비티를 실행해서 작업을 완료한 후 되돌아오는 작업을 수행
Intent intent = new Intent(this, ReturnDataSecondActivity.class);
intent.putExtra("code","call2");
intent.putExtra("data","첫 번째 액티비티가 넘기는 메시지");
//되돌아올 때 사용되는 메소드가 startActivityForResult
//인텐트객체와 함께 request_code를 넘긴다.(사용자 정의)
startActivityForResult(intent, SECOND_BUTTON);
}
}
//인텐트를 통해서 액티비티를 호출하고 되돌아오는 경우 자동으로 onActivityResult를 호출한다
// => 되돌아와서 마무리해야 하므로!
// => onActivityResult를 오버라이딩해서 처리할 작업을 구현해주자
// * reuqestCode : 요청을 했던 뷰를 구분하기 위한 코드
// * resultCode : 결과 코드
// * data : Intent객체
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if(requestCode==SECOND_BUTTON && resultCode==RESULT_OK){
String returndata = intent.getStringExtra("second");
Toast.makeText(this, returndata, Toast.LENGTH_LONG).show();
}
}
}
public class ReturnDataSecondActivity extends AppCompatActivity {
String code;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second2);
Button bt1 = (Button)findViewById(R.id.btnClose1);
final TextView txt = findViewById(R.id.secondTxt);
final Intent intent = getIntent();
code = intent.getStringExtra("code");
bt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
switch(code){
case "call2":
String data = intent.getStringExtra("data");
txt.setText(data);
intent.putExtra("second","두 번째 액티비티에서 실행 완료");
//실행 후에 호출한 액티비티로 되돌아가기
//되돌아갈 때 값을 공유하기 위해 intent객체를 넘긴다.
setResult(RESULT_OK, intent);
finish();
}
}
});
}
}
< intent-filter >
<activity android:name=".exam.SelectView_ExamActivity">
<intent-filter>
<action android:name="com.exam.selectview"/> // 우리끼리만의 앱을 이용하고 싶을때 임의로 naming
<category android:name="android.intent.category.DEFAULT"/> //안드로이드가 실행할 범주
</intent-filter>
</activity>
BasicRunApp
지도앱 실행
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_basic_app_run); }
웹 브라우저 실행
public void runGoogleMap(View v){ Uri uri = Uri.parse("geo:37.501579 , 127.039585"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); }
전화걸기 화면 실행
public void runWeb(View v){ Uri uri = Uri.parse("https://www.daum.net"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); }
전화걸기 실행
//AndroidManifest.xml <uses-permission android:name="android.permission.CALL_PHONE"/> //activity String[] permission_list = { Manifest.permission.CALL_PHONE }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_basic_app_run); //권한체크 메소드를 호출 runPermission(); } //권한을 체크 - 승인처리 public void runPermission(){ //하위버전이면 실행되지 않도록 처리 if(Build.VERSION.SDK_INT<Build.VERSION_CODES.M){ return; //종료 } //모든 권한을 셀프체크 for(String permission:permission_list){ int chk = checkCallingOrSelfPermission(permission); if(chk== PackageManager.PERMISSION_DENIED){ requestPermissions(permission_list, 0); break; } } } //실제 전화 걸기 위한메소드 public void runCallPhone(View v){ Intent intent = null; int chk = PermissionChecker.checkSelfPermission(this, Manifest.permission.CALL_PHONE); if(chk==PackageManager.PERMISSION_GRANTED){ Log.d("tel","성공"); intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:01072971287")); }else{ Log.d("tel","실패"); return; } startActivity(intent); }
반응형
'안드로이드 프로그래밍 > [ Android Framework ]' 카테고리의 다른 글
[ Android ] 05. 안드로이드의 FileSystem (0) | 2020.08.12 |
---|---|
[ Android ] 04. Permission 설정하기 (0) | 2020.08.12 |
[ Android ] 02. 사용자정의 adapter와 layout inflation (2) | 2020.08.11 |
[ Android ] 01. 각종 위젯과 이벤트처리방법 & AdapaterView (0) | 2020.08.11 |
[ Android ] 00. 안드로이드의 개요와 각종 Layout 알아보기 (0) | 2020.08.11 |