티스토리 뷰

  • 액티비티는 안드로이드 시스템에서 관리한다. 안드로이드의 구성요소 중 하나이다.(하나의 화면으로 구성)
  • 안드로이드 애플리케이션을 구성하는 네가지 구성요소는?
1
2
3
4
5
6
7
8
9
1. 액티비티
2. 서비스
3. 브로드캐스트 수신자 (문자메시지)
4. 내용 제공자 (사진을 쓰고 싶으면 내용제공자라는 놈을 만들어 주겠다 라는게 앨범속에서 사용이 되고 있다)
 
이 네가지 것들은 -> 시스템에서 관리 한다.
 
이 확인하는 과정에서는 시스템은 manifest.xml 파일을 확인하는 과정을 거치게 된다.
하나의 화면에서 다른 화면을 전환할 때 자바 소스코드를 사용하게 되는데, 새로운 activity를 추가하고 전환하는 기능을 만들어 볼것이다.
1
예) 로그인 화면 -> 메뉴화면으로 넘어가는것을 만들어 볼것이다.
cs
cs



  • Example_Intent 프로젝트 생성을 해서 실습 할것이다.
1
2
3
4
5
6
1. xml과 java 파일은 한쌍으로 같이 다닌다라고 생각을한다.
2. java 소스에서 setContent에서 R.layout.activity_main을 인플레이션 했다고 할 수 있다.
3. app -> R 마우스클릭 -> new -> activity -> empty Activity 추가하면 ( java,xml 파일 생성)
4. Menu.Activity로 바꾸어준다. ( 새로운 Activity 가 생성 된것을 확인할 수 있음)
 
5. 이때 menifests 를 확인 해보자 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.example_intent">
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MenuActivity"></activity>
    </application>
 
</manifest>
cs
1
자동으로 menuActivity가 추가 된것을 알 수 있다. 
(새로운 액티비티를 생성하면 무조건 메니페스트에다가 등록을 꼭 해주어야한다)
cs
  • activity_main.xml 파일
1
2
3
4
5
6
7
1. constraintLayout - button(메뉴화면 띄우기 이름) 추가 
2.button을 클릭했을 때 동작 시키려고 하면 ->방법은 2가지
(1) onClick 속성으로 메소드 이름을 넣어주고 MainActivity.java에서 동작을 하게 해준다
(2) 자바 소스코드에서 ID 라는것을 기억해야 한다. ComponentTree에서도 볼 수 있다.
이 ID 값을 기억하고 나서 , onCreate안에서 Button을 찾아주고 리스너 등록을 시켜주면 된다.
 
우리는 2번째 방법으로 실습을 할것이다.
cs

  • 인텐트(Intent)란?
1
2
3
4
5
6
예를 들어 Menu Activity를 띄워 줄 것인데, 이 때 인텐트를 사용해서 띄운다고 하자.
Intent는 MenuActivity를 시스템에서 관리하는데, 시스템에서 관리하므로 띄우고 없애는 것도 시스템에서 관리를 해야한다.
이것을 시스템에 요청을 해야할때 알아먹을수 있는 포멧의 형태가 필요한데, 이것을 인텐트 라고 한다.
 
여기서, 시스템쪽으로 인텐트를 보내고 다시 이전화면으로 돌아올때, 응답을 받고 싶을 때에는 어떻게 하냐? 그때는 바로 startActivityForResult(intent,101); 메소드를 사용한다.
101이라는것은 어떤 화면에서 응답을 받았는지 이 코드가 구분자 역할을 한다고 보면된다.
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button button = (Button) findViewById(R.id.button);     // 버튼객체를 참조 할 수 있다.
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 여기서 Menu Activity를 띄워 줄것인데, 이때 인텐트를 사용해서 띄워 줄것이다.
                // Intent는 MenuActivty를 시스템에서 관리하는데, 시스템에서 관리하니까 띄우고,없애는것도 시스템이 관리
                // 이것을 시스템에 요청을 해야하는데, 이것을 알아먹을수 있는 포맷이 필요한데, 이것을 인텐트라고 한다.
                Intent intent = new Intent(getApplicationContext(),MenuActivity.class);
                startActivityForResult(intent,101);      // 시스템쪽으로 인텐트를 보낸다. 인텐트 전달하면서, 화면을 띄워줄것을 요청한다.
                // 메뉴 화면에서 다시 이전화면으로 돌아올때 응답을 받아 올때는 startActivityForResult를 사용한다.
                // 이때, startActivityForResult(intent,101); 어떤화면에서 응답을 받았는지 이 코드가 구분자 역할을 한다.
 
            }
        });
    }
}
cs
  • activity_menu.xml로 이동해서 Button 과 textView 추가
  • MenuActivty.java 로 이동
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.example.example_intent;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
 
public class MenuActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
 
        Button button2 = (Button)findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //main화면쪽으로 데이터 전달 하고 싶을때에는 시스템을 통과하기 때문에 인텐트를 사용한다
                Intent intent = new Intent();
 
                intent.putExtra("name","mike");// 주연이 아니라 조연 역할이다 putExtra() 조연을 받았더라도 해석하지 않는다. 인텐트 통과시킴
                // 다른액티비티로 전달할 수 있는 방법이다. putExtra("key",value); 형태이다.
 
                setResult(Activity.RESULT_OK,intent);          // setResult 인텐트객체를 파라미터로 전달하면 시스템쪽으로 전달이 된다. Main화면쪽으로 전달
                //첫번째 응답에 대한 상수, 두번째 파라미터는 응답에 대한 파라미터이다.
 
                finish();           // menu화면을 없애준다. 첫번쨰 화면을 띄우고 두번째 화면을 띄우면 첫번째 화면은 뒤에 깔려있음.
                // 따라서 main화면이 나타난다 (스택 으로 생각하면 : main - menu )
            }
        });
 
        
    }
}
cs


  • 인텐트 값을 Main에서 어떻게 사용할까?
메인에서 응답을 받을 메소드를 정의 해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.example.example_intent;
 
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
import static android.R.attr.name;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button button = (Button) findViewById(R.id.button);     // 버튼객체를 참조 할 수 있다.
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 여기서 Menu Activity를 띄워 줄것인데, 이때 인텐트를 사용해서 띄워 줄것이다.
                // Intent는 MenuActivty를 시스템에서 관리하는데, 시스템에서 관리하니까 띄우고,없애는것도 시스템이 관리
                // 이것을 시스템에 요청을 해야하는데, 이것을 알아먹을수 있는 포맷이 필요한데, 이것을 인텐트라고 한다.
                Intent intent = new Intent(getApplicationContext(),MenuActivity.class);
                startActivityForResult(intent,101);      // 시스템쪽으로 인텐트를 보낸다. 인텐트 전달하면서, 화면을 띄워줄것을 요청한다.
                // 메뉴 화면에서 다시 이전화면으로 돌아올때 응답을 받아 올때는 startActivityForResult를 사용한다.
                // 이때, startActivityForResult(intent,101); 어떤화면에서 응답을 받았는지 이 코드가 구분자 역할을 한다.
 
            }
        });
 
 
    }
 
    // Menu 화면에서 넘겨받는 값들을 받는 메소드(generate->  onActivityResult 추가)
    // 응답을 받아 주는 메소드(인텐트를 전달받음)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 데이터 어디서 전달받았는지 확인하려면?
        if(requestCode == 101){
            String name = data.getStringExtra("name");        // data 인텐트에 있는 값이 name인지를 확인한다.
            Toast.makeText(getApplicationContext(),"메뉴 화면으로 부터 응답 : " + name ,Toast.LENGTH_LONG).show();
        }
    }
 
 
}
cs
1
우클릭 ->  generate -> onActivityResult 생성
cs

  • 여기서, 메뉴화면 띄우기 위에 상단에 앱의 이름이 들어가는데 이것을 바꾸고 싶다면?
manifests 의 소스를 조정 해야한다

1
2
3
<activity android:name=".MenuActivity"
    android:label="메뉴"
    android:theme="@style/Theme.AppCompat.Light.Dialog"></activity>
cs
  • 결국, 이렇게 실행이 되는것을 지금까지 확인 해보았다. 이제 이것들을 이해해보자
<실행 순서 확인>
1
2
3
4
5
6
7
8
9
1. 새로운 액티비티 만들기
 
2. 새로운 액티비티의 xml 레이아웃 정의하기 
 
3. 메인엑티비티에서 새로운 엑티비티 띄우기
 
4. 새로운 액티비티에서 응답 보내기
 
5. 메인 액티비티에서 응답 처리하기
cs

<시스템 관리>

1
2
3
4
5
메인 액티비티             ->                메뉴 액티비티
(인텐트 사이에 있다 여기서 extra를 만나면 바로 건내 준다)
 
시스템
 
cs
  • 요청 코드와 응답코드
1
2
3
4
새로운 액티비티를 띄울때 -> 그 요청코드가 넘어 간다(구분자로 사용된다) 코드값으로 정의해서 사용해도 된다. 
액티비티를 띄울때 인텐트가 사용된다 라는것을 알고 있어야한다.
startActivityForResult(요청 코드) -> setResult(응답 #1 #2)
 
데이터를 전달하고싶을 경우는 인텐트 안에 ( extra 데이터를 넣어서) 전달 한다
cs
1
intent.putExtra("name","mike")
cs
인텐트는 시스템이 알아먹을수 있는 포맷


  • 구조 정리
메뉴 화면으로 가기 버튼을 누르면 MainActivity 에서는 MenuActivity를 요청 하기위해서 
1
2
Intent intent = new Intent(getApplicationContext(),MenuActivity.class);
startActivityForResult(intent,101);      // 시스템쪽으로 인텐트를 보낸다. 
1
인텐트 전달하면서, 화면을 띄워줄것을 요청한다.
cs
cs
이제 이전으로 가기 버튼을 누르면 MenuActivity에서는 setResult로 시스템에 전달 하고

1
2
3
4
5
6
7
setResult(Activity.RESULT_OK,intent);          // setResult 인텐트객체를
 파라미터로 전달하면 시스템쪽으로 전달이 된다. Main화면쪽으로 전달
//첫번째 응답에 대한 상수, 두번째 파라미터는 응답에 대한 파라미터이다.
 
finish();           // menu화면을 없애준다.
 첫번쨰 화면을 띄우고 두번째 화면을 띄우면 첫번째 화면은 뒤에 깔려있음.
// 따라서 main화면이 나타난다 (스택 으로 생각하면 : main - menu )
cs
이런식으로 동작한다. 결국 Main 과 서브 화면과의 관계를 잘파악해야지 인텐트의 동작과정을 잘 이해할 수 있다.

<결과>




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함