-
[ Android ] 인텐트Android 2020. 3. 3. 17:35
CatServant
화면을 실행하는 일은 안드로이드 시스템에서 담당한다.
Intent : 시스템으로 전달되는 일종의 명령을 담고 있는 객체
( = 시스템이 이해할 수 있는 객체 )
Application 구성 요소 간에 데이터를 전달하는 방법을 제공하므로
1. 화면과 화면
2. 화면과 서비스
3. 브로드캐스트 수신자와 화면
등등 Application 구성 요소 간에 부가 데이터로 넣어 데이터를 전달할 수 있음1. 명시적 인텐트 ( Explicit Intent )
º 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우
º 새로운 Activity를 시작하거나 서비스를 시작하는 등 특정 구성 요소를 시작하기 위해 사용하는 인텐트2. 암시적 인텐트 ( Implicit Intent )
: 특정한 데이터를 넣어주면 그 데이터를 찾아서 / 데이터에 맞는 앱을 찾아서 알아서 띄워준다.
º setAction() 을 통해 작업을 지정하여 기기에서 해당 작업을 수행할 수 있는 모든 앱을 호출하는 것
º 액션과 데이터를 지정하긴 했지만 호출할 대상이 달라질 수 있는 경우º 범주(category), 타입(Type), 컴포넌트(Component), 부가데이터(extras)
-
범주 ( Category ) : 액션이 실행되는데 필요한 추가적인 정보를 제공
-
타입 ( Type ) : 인텐트에 들어가는 데이터의 MIME 타입을 명시적으로 지정
-
컴포넌트 ( Component ) : 인텐트에 사용될 컴포넌트 클래스 이름을 명시적으로 지정
-
부가 데이터 ( Extra )
-
인텐트는 추가적인 정보를 넣을 수 있도록 번들 ( Bundle ) 객체를 담고 있음
-
이 객체를 통해 인테트 안에 더 많은 정보를 넣어 다른 애플리케이션 구성요소에 전달할 수 있음
-
public class MainActivity extends AppCompatActivity { EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String receiver = editText.getText().toString(); Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + receiver)); startActivity(intent); // 전화 걸기 앱을 띄워준다. /** * [ 장점 ] * MenuActivity.class 라고 해서 객체를 지정하는 것이 아니라 * 문자열로 컴포넌트를 ( 즉. Activity )를 지정할 수 있는 방법 * Activity가 만들어지지 않은 상태나 남들이 만들어 놓은 Activity를 지정해서 띄워줄 수 있다. **/ Intent intent2 = new Intent(); ComponentName name = new ComponentName("com.example.movie", "com.example.movie.MenuActivity"); intent2.setComponent(name); startActivity(intent2); } }); } }
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
마시멜로 버전 이후에 위험 권한으로 분류됨
매니페스트에 등록하고 앱이 실행되었을 때도 권한을 줄 수 있는 대화상자를 띄워줘야 한다.
ComponentName 객체를 만들어 설정하는 방법
Intent intent = new Intent(); ComponentName name = new ComponentName("com.example.movie", "com.example.movie.MenuActivity"); intent.setComponent(name); startActivityForResult(intent, 101);
Activity를 문자열로만 지정할 수 있어서 동적으로 Activity를 지정해주고 싶을 때 사용할 수 있습니다.
Activity를 위한 FLAG
- FLAG_ACTIVITY_SINGLE_TOP
- FLAG_ACTIVITY_NO_HISTOY
- FLAG_ACTIVITY_CLEAR_TOP
- Activity finish를 해도 동일한 모양의 화면이 다시 보이는 문제?
Main Activity에서 Memu Activity를 실행하는 경우 Activity에서 시스템을 통해 다른 Activity를 실행하는 형태가 됩니다. 그런데 화면이 없는 서비스라는 것에서 Activity를 실행하는 경우도 있습니다. 이 때는 Activity를 새로 만들어 실행할 수도 있지만 이미 사용자가 보고 있는 Activity 위에 Activity를 실행하게 되는 경우가 생길 수도 있습니다.
결국 동일한 Activity인데 두 개가 만들어지게 되고 가장 위에 있는 것만 보이는 상황이 발생합니다.
이 때 맨 위에 있는 Activity를 finish 메소드로 없애더라도 사용자에게는 동일한 모양의 화면이 다시 보이게 되는 문제가 발생합니다.
이런 경우에 Flag를 사용하면 동일한 액티비티인 경우 이미 화면에 보이는 Activity를 그대로 사용할 수 있도록 해 줍니다.
새로 실행하려는 Activity와 화면에 보이는 Activity가 동일한 Activity인 경우 메모리에 새로 만들지 않고 화면에 보이는 Activity를 그대로 보여줍니다. 그런데 이미 만들어져서 화면에 보이고 있는 Activity를 그대로 사요하므로 onCreate 메소드가 호출되지 않습니다. 대신 onNewIntent 메소드 ( = 별도의 callback 메소드 ) 가 호출됩니다. ( Intent를 전달받기 위해서 별도 호출 )
[ onCreate가 호출되는 경우 ]
getIntent 메소드를 이용해 전달받은 Intent 객체를 확인할 수 있다.
[ onCreate가 호출되지 않는 경우 ]
onNewIntent 메소드 안에서 Intent 객체를 확인할 수 있다.
출처
1. https://www.edwith.org/boostcourse-android/lecture/17065/
2. page. 269 - 281
https://book.naver.com/bookdb/book_detail.nhn?bid=13272675
'Android' 카테고리의 다른 글
[ Android ] 스플래시 화면 ( 로딩 화면 ) (0) 2020.04.02 [ Android ] ListView (0) 2020.03.31 [ Android ] 페이지 슬라이딩 (0) 2020.03.31 [ Android ] 트윈 애니메이션 (0) 2020.03.30 [ Android ] 스레드 애니메이션 (0) 2020.03.27 -