MainActivity

...더보기
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.example.boostcoursepractice;
 
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
 
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.Toast;
 
import java.util.List;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
       /* ActionBar abar = getSupportActionBar();
        abar.hide();*/
 
 
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
 
        getMenuInflater().inflate(R.menu.menu_main, menu);
 
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int curId = item.getItemId();
 
        switch (curId) {
            case R.id.menu_12:
                Toast.makeText(this"12클릭됨", Toast.LENGTH_SHORT).show();
                break;
 
            case R.id.menu_15:
                Toast.makeText(this"15클릭됨", Toast.LENGTH_SHORT).show();
                break;
 
            case R.id.menu_19:
                Toast.makeText(this"19클릭됨", Toast.LENGTH_SHORT).show();
                break;
 
            default:
                break;
        }
 
        return super.onOptionsItemSelected(item);
    }
}
 
 
cs

 

layout/search_layout.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="검색"
        android:textColor="#ffad8745"
        android:textSize="16dp"></TextView>
 
    <EditText
        android:id="@+id/edit_text"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="4dp"></EditText>
 
</LinearLayout>
cs

 

menu/menu_main.xml

...더보기
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"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
 
    <item android:title="12세"
        android:id="@+id/menu_12"
        android:icon="@drawable/ic_12"
        app:showAsAction="always"/>
 
    <item android:title="15세"
        android:id="@+id/menu_15"
        android:icon="@drawable/ic_15"
        app:showAsAction="always|withText"
        app:actionLayout="@layout/search_layout"/>
 
    <item android:title="19세"
        android:id="@+id/menu_19"
        android:icon="@drawable/ic_19"
        app:showAsAction="always"/>
 
</menu>
cs

 

일단 맨처음에 액션바에 메뉴를 만들려면 res폴더에 menu라는 폴더를 만들어 주고 그 안에 xml파일을 만들어 준다.(여기서는 menu_main.xml 을 만들어 줌) 이 xml 파일에는 item이라는 테그로 메뉴화면 보일 아이템들을 설정해주었다.

다 설정하고 나면 메인 액티비티로 돌아가 

 

@Override

    public boolean onCreateOptionsMenu(Menu menu) {

 

        getMenuInflater().inflate(R.menu.menu_main, menu);

 

        return true;

    }

 

이렇게 onCreateOptionsMenu(Menu menu) 콜백 함수에서 메뉴 xml파일을 인플레이트 해주는 함수로 오버라이드 해주면 액션바에 메뉴가 생기게 되어 진다. 또한 아이템이 클릭 되었을 때는

 

 public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        

위의 콜백함수를 오버라이드 하여 아이템의 아이디 값을 얻어 그것 구별하며 동작을 설정해주면된다.

 

 

 

 

 

메뉴 아이템을 사용자가 만든 레이아웃으로 설정해주고 싶을 때는 따로 layout폴더에 xml 파일을 만들어 준다.(여기서는 search_layout.xml 만들어줌) 이렇게 xml 파일을 만들고 나면 아까만들어준 메뉴 xml파일에 item 항목에서 

 

app:actionLayout="@layout/search_layout"

 

위의 속성을 만들어준 레이아웃 xml파일로 지정해주면 그 레이아웃이 메뉴 아이템으로 보이게 된다.

 

 

 

 

 

위의 마지막으로 액티비티의 액션바를 없애주고 싶을 때는

 

ActionBar abar = getSupportActionBar();

        abar.hide();

 

이렇게 하면 된다.

 

 

 

 

 

결과화면

 

MainActivity

...더보기
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
package com.example.boostcoursepractice;
 
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
 
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.Toast;
 
import java.util.List;
 
public class MainActivity extends AppCompatActivity {
 
    ListFragment fragment1 ;
    ViewerFragment fragment2 ;
 
    FragmentManager manager ;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        manager = getSupportFragmentManager();
 
        fragment1 = (ListFragment) manager.findFragmentById(R.id.list_fragment) ;
        fragment2 = (ViewerFragment) manager.findFragmentById(R.id.viewer_fragment);
 
    }
 
    public void onImageChange(int index)
    {
        fragment2.setImage(index);
 
    }
 
}
 
 
cs

 

ListFragment

...더보기
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
51
52
53
54
55
56
57
package com.example.boostcoursepractice;
 
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
 
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
 
public class ListFragment extends Fragment {
 
    MainActivity activity ;
 
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
 
        activity = (MainActivity) getActivity();
    }
 
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_list, container, false);
 
        Button button = (Button) rootView.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                activity.onImageChange(0);
            }
        });
 
        Button button2 = (Button) rootView.findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                activity.onImageChange(1);
            }
        });
 
        Button button3 = (Button) rootView.findViewById(R.id.button3);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                activity.onImageChange(2);
            }
        });
 
        return rootView ;
    }
}
 
cs

 

ViewerFragment

...더보기
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
package com.example.boostcoursepractice;
 
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
 
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
 
public class ViewerFragment extends Fragment {
 
    ImageView imageView ;
 
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_viewer, container, false);
 
        imageView = (ImageView) rootView.findViewById(R.id.imageView);
 
        return rootView ;
    }
 
    public void setImage(int index)
    {
        if(index == 0)
        {
            imageView.setImageResource(R.drawable.ic_12);
        }
 
        else if(index == 1)
        {
            imageView.setImageResource(R.drawable.ic_15);
        }
 
        else if(index == 2)
        {
            imageView.setImageResource(R.drawable.ic_19);
        }
    }
}
 
cs

 

activity_main.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
 
    <fragment
        android:id="@+id/list_fragment"
        android:name="com.example.boostcoursepractice.ListFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></fragment>
 
    <fragment
        android:id="@+id/viewer_fragment"
        android:name="com.example.boostcoursepractice.ViewerFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></fragment>
 
 
</LinearLayout>
cs

 

fragment_list.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="이미지1" />
 
    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="이미지2" />
 
    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="이미지3" />
</LinearLayout>
cs

 

fragment_viewer.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srcCompat="@drawable/ic_12" />
</LinearLayout>
 
 

 

프래그먼트는 앞선 글에서와 같이 코드에서 생성하는 방법이 있고 여기에서 처럼 xml내에서 직접 태그로 추가할 수도 있다. 여기서 만약 태그로추가하고 그 프래그먼트를 자바코드에서 직접 참조 하고 싶다면 일반적으로 쓰는 방법과 약간 달리

 

FragmentManager manager ;

manager = getSupportFragmentManager();

fragment1 = (ListFragment) manager.findFragmentById(R.id.list_fragment) ;

 

이렇게 프래그먼트 매저를 통해서 찾아야한다. 

 

여기서 들은 예시는 리스트 프래그먼트와 이미지뷰어 프래그먼트를 둘로 나우어 메인 액티비티에서 띄우고 리스트 프래그먼트의 버튼을 누르면 이미지 프래그먼트의 이미지를 바꿔주는데 이것 역시 중간에 액티비티를 거쳐서 바꿔줘야한다는 점을 잊지말자.

 

 

 

 

 

결과화면

 

MainActivity

...더보기
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.example.boostcoursepractice;
 
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
 
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity {
 
    Button button ;
    Button button2 ;
    MainFragment mainFragment;
    SubFragment subFragment;
    //FrameLayout frameLayout ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mainFragment = new MainFragment();
        subFragment  = new SubFragment();
 
        button = (Button) findViewById(R.id.button);
        button2 = (Button) findViewById(R.id.button2);
        //        //frameLayout = (FrameLayout) findViewById(R.id.frame_layout);
 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //getSupportFragmentManager().beginTransaction().add(R.id.frame_layout, mainFragment).commit();
                getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, mainFragment).commit();
            }
        });
 
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, subFragment).commit();
            }
        });
    }
 
    public void chageFragement(int n)
    {
        if(n == 0)
        {
            getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, mainFragment).commit();
        }
        else if(n==1)
        {
            getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, subFragment).commit();
        }
    }
}
 
 
cs

 

MainFragment

...더보기
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
package com.example.boostcoursepractice;
 
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
 
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
 
public class MainFragment extends Fragment {
 
    MainActivity activity ;
 
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
 
        activity = (MainActivity) getActivity();
    }
 
    @Override
    public void onDetach() {
        super.onDetach();
 
        activity = null;
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
 
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_main, container, false) ;
        Button btn = (Button) rootView.findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                activity.chageFragement(1);
            }
        });
        return rootView;
    }
}
 
cs

 

SubFragment

...더보기
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
51
package com.example.boostcoursepractice;
 
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
 
import androidx.fragment.app.Fragment;
 
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
 
public class SubFragment extends Fragment {
 
    MainActivity activity ;
 
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Toast.makeText(context, "attach 실행됨", Toast.LENGTH_LONG).show();
 
        activity = (MainActivity) getActivity();
    }
 
    @Override
    public void onDetach() {
        super.onDetach();
        Toast.makeText(getActivity(), "onDetach 실행됨", Toast.LENGTH_LONG).show();
 
        activity = null;
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        Toast.makeText(getActivity(), "onCreateView 실행됨", Toast.LENGTH_LONG).show();
 
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_sub, container, false) ;
        Button btn = (Button) rootView.findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                activity.chageFragement(0);
            }
        });
        return rootView;
    }
}
 
cs

 

activity_main.xml

...더보기
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
 
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="시작" />
 
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_toRightOf="@id/button"
        android:text="메뉴" />
 
    <FrameLayout
        android:id="@+id/frame_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/button">
        <!--
        <fragment
            android:id="@+id/fragment"
            android:name="com.example.boostcoursepractice.MainFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        -->
    </FrameLayout>
 
 
 
 
</RelativeLayout>
cs

 

fragment_main.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_orange_light"
    android:orientation="vertical">
 
    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="프래그먼트 1"
        android:textSize="40dp"
        />
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="서브화면으로" />
 
 
</LinearLayout>
cs

 

fragment_sub.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/design_default_color_primary"
    android:orientation="vertical">
 
    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="프래그먼트 2"
        android:textSize="40dp" />
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="메인화면으로" />
 
 
</LinearLayout>
cs

 

우선 프래그먼트를 이해하기 위해서는 아래의 그림을 이해해야 한다.

이처럼 액티비티를 전환하는 것은 시스템의 액티비티 매니저가 하지만 프래그먼트의 전환은 액티비티 안에 프래그먼트 매니저가 관리한다. 따라서 액티비티가 중심이 된다는 것을 잊지 말아야한다.

 

프래그먼트의 객체화는 

 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 

 

이 함수에서 이루어 진다.

 

 

 

 

메인액티비티에 나와 있는 것처럼 우선

 

mainFragment = new MainFragment();

subFragment  = new SubFragment();

 

이렇게 프래그먼트를 만들어주고 

 

getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout, mainFragment).commit();

 

이런 함수를 통하여 액티비티 매니저를 이용하여 액티비티에 프래그먼트를 만들어 붙여 줘야 한다. 이 함수가 실행 될 때부터 프래그먼트의 수명주기가 시작이 된다.

 

또한 프래그먼트에서 다른 프래그먼트를 띄워 줄 때 프래그먼트 안에서 바로 띄워 줄 수 없고 해당 프래그먼트를 만들어준 액티비티를 통해 다른 프래그먼트를 띄워야 한다. (앞서 그림에서 설명한 이론 액티비티 중심) 따라서

 

activity = (MainActivity) getActivity();

 

이렇게 프래그먼트를 만들어준 액티비티를 얻고 

 

activity.chageFragement(1);

 

그 액티비티의 함수(액티비티 매니저를 통해 다른 프래그먼트를 띄울수 있게 정의함)를 실행하여 액티비티의 액티비티매니저를 통해 다른 프래그먼트를 띄울 수 있도록 해야 한다.

 

 

 

 

*****************************************************************************************8

마지막 참고로 프래그먼트를 그냥 xml 파일에서

 

 <fragment

            android:id="@+id/fragment"

            android:name="com.example.boostcoursepractice.MainFragment"

            android:layout_width="match_parent"

            android:layout_height="match_parent" />

 

이런식으로 코드가 아닌 태그로 추가할 수도 있다.

 

 

**중요1 : 프래그먼트에서 액티비티를 띄울 때 프래그먼트를 생성한 액티비티를 통해서 띄워야 된다. 따라서 프래그먼트에서 getActivity().startActivityResult()를 해야만 한다. 

 

**중요2 : 프래그먼트를 껐다가 다시 키긴보다는 transaction().hide() / transaction().show() 를 많이 이용하자 뭔가 다시 키면 리스트뷰나 뷰페이저가 다시 뜨지를 않는다.

 

 

 

 

결과화면 1

 

결과화면2

 

MainActivity

...더보기
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
51
52
53
54
package com.example.boostcoursepractice;
 
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
 
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS);
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this"SMS 수신 권한 있음.", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this"SMS 수신 권한 없음.", Toast.LENGTH_LONG).show();
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS)) {
                Toast.makeText(this"SMS 권한 설명 필요함.", Toast.LENGTH_LONG).show();
            } else {
                ActivityCompat.requestPermissions(thisnew String[]{Manifest.permission.RECEIVE_SMS}, 1);
            }
        }
    }
 
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    if (grantResults[0== PackageManager.PERMISSION_GRANTED) {
                        Toast.makeText(this"SMS 수신 권한을 사용자가 승인함", Toast.LENGTH_LONG).show();
                    } else if (grantResults[0== PackageManager.PERMISSION_DENIED) {
                        Toast.makeText(this"SMS 수신 권한을 사용자가 거부함", Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(this"SMS 수신 권한을 부여받지 못함", Toast.LENGTH_LONG).show();
                    }
                }
        }
    }
}
 
cs

 

SmsActivity

...더보기
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
51
52
53
54
55
56
57
58
59
package com.example.boostcoursepractice;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
 
public class SmsActivity extends AppCompatActivity {
 
    EditText editText1;
    EditText editText2;
    EditText editText3;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);
 
        editText1 = (EditText) findViewById(R.id.editText1);
        editText2 = (EditText) findViewById(R.id.editText2);
        editText3 = (EditText) findViewById(R.id.editText3);
 
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
 
        Intent passedIntent = getIntent() ;
        processCommand(passedIntent);
    }
 
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
 
        processCommand(intent);
    }
 
    private void processCommand(Intent intent)
    {
        if(intent != null)
        {
            String sender = intent.getStringExtra("sender");
            String contents = intent.getStringExtra("contents");
            String receivedDate = intent.getStringExtra("receivedDate");
 
            editText1.setText(sender);
            editText2.setText(contents);
            editText3.setText(receivedDate);
        }
    }
}
 
cs
 

 

SmsReceiver

...더보기
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.example.boostcoursepractice;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class SmsReceiver extends BroadcastReceiver {
 
    private static final String TAG = "SmsReceiver";
    private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm") ;
 
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Log.d(TAG, "onReceive() 호출 됨");
        Bundle bundle = intent.getExtras();
        SmsMessage[] messages = parseSmsMessage(bundle);
 
        if (messages.length > 0) {
            String sender = messages[0].getOriginatingAddress();
            Log.d(TAG, "sender : " + sender);
 
            String contents = messages[0].getMessageBody().toString();
            Log.d(TAG, "contents : " + contents);
 
            Date receivedDate = new Date(messages[0].getTimestampMillis());
            Log.d(TAG, "received date : " + receivedDate);
 
            sendToActivity(context, sender, contents, receivedDate);
        }
    }
 
    private void sendToActivity(Context context, String sender, String contents, Date receiveDate) {
        Intent intent = new Intent(context, SmsActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP) ;
        intent.putExtra("sender", sender);
        intent.putExtra("contents", contents);
        intent.putExtra("receivedDate"format.format(receiveDate));
 
        context.startActivity(intent);
 
    }
 
    private SmsMessage[] parseSmsMessage(Bundle bundle) {
        Object[] objs = (Object[]) bundle.get("pdus");
 
        SmsMessage[] messages = new SmsMessage[objs.length];
 
        for (int i = 0; i < objs.length; i++) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                String format = bundle.getString("format");
                messages[i] = SmsMessage.createFromPdu((byte[]) objs[i], format);
            } else {
                messages[i] = SmsMessage.createFromPdu((byte[]) objs[i]);
            }
        }
 
        return messages;
    }
}
cs

 

manifests

...더보기
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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.boostcoursepractice">
 
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SmsActivity"></activity>
 
        <receiver
            android:name=".SmsReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
 
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
cs

 

우선 메세지리시버를 만들면 다음과 같이 manifests에  

 

 <uses-permission android:name="android.permission.RECEIVE_SMS" />

 

권한을 부여해야 한다. 또한 receiver태그 안에 

 

<intent-filter>

                <action android:name="android.provider.Telephony.SMS_RECEIVED" />

            </intent-filter>

 

을 넣어줌으로써 SMS관련된 것만 받겠다고 인텐트 필터설정을 해줘야 한다. 

 

리시버가 실행되면 onReceive라는 함수가 실행된다. 여기서는 리시버가 메세지를 받아 onReceive라는 함수가 호출되면 

메세지의 정보를 인자로 넘겨 인텐트에 넣어 SmsActivity를 실행하게끔 구현해 놓았다.

 

 

 

위험권한은 MainAcitivity에 구현되어 있는데 그냥 위에꺼를 이해하고 필요할 때 갖다가 쓰면 된다.

MainActivity

...더보기
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.example.boostcoursepractice;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
 
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
 
public class MainActivity extends AppCompatActivity {
 
    EditText editText;
    Button serviceStartBtn ;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        serviceStartBtn = (Button) findViewById(R.id.btn_start_service);
        editText = (EditText) findViewById(R.id.editText);
 
        serviceStartBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String name = editText.getText().toString();
 
                Intent intent = new Intent(getApplicationContext(), MyService.class);
                intent.putExtra("command""show");
                intent.putExtra("name", name) ;
                startService(intent);
 
            }
        });
 
        Intent intent = getIntent() ;
        processCommand(intent) ;
    }
 
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
 
        processCommand(intent) ;
    }
 
    private void processCommand(Intent intent)
    {
        if(intent != null)
        {
            String command = intent.getStringExtra("command") ;
            String name = intent.getStringExtra("name");
            Toast.makeText(getApplicationContext(), "서비스로부터 전달 받은 데이터 : " + command + ", " + name, Toast.LENGTH_LONG).show();
 
        }
    }
}
 
cs

 

MyService

...더보기
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.example.boostcoursepractice;
 
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
 
public class MyService extends Service {
 
    private static final String TAG = "MyService";
 
    public MyService() {
 
    }
 
    @Override
    public void onCreate() {
        super.onCreate();
 
        Toast.makeText(getApplicationContext(), "onCreate() 호출됨.", Toast.LENGTH_LONG).show();
       // Log.d(TAG, "onCreate() 호출됨.");
    }
 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //log.d(TAG, "onStartCommand() 호출됨.");
        Toast.makeText(getApplicationContext(), "onStartCommand() 호출됨.", Toast.LENGTH_LONG).show();
 
        //if(intent == null) return Service.START_STICKY ;
        //else processCommand(intent);
        processCommand(intent);
 
        return super.onStartCommand(intent, flags, startId);
    }
 
    private void processCommand(Intent intent)
    {
        String command = "" ;
        String name = "";
        if(intent != null)
        {
            command = intent.getStringExtra("command");
            name = intent.getStringExtra("name");
            //Log.d(TAG, "전달 받은 데이터 : " + command + ", "  +name);
 
        }
 
        Toast.makeText(getApplicationContext(), "전달 받은 데이터 : " + command + ", "  +name, Toast.LENGTH_LONG).show();
 
        try{
            Thread.sleep(5000);
        }
        catch (Exception e){}
 
        Intent showIntent = new Intent(getApplicationContext(), MainActivity.class);
        showIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP) ;
        showIntent.putExtra("command","show");
        showIntent.putExtra("name", name + "from service");
        startActivity(showIntent);
    };
 
    @Override
    public void onDestroy() {
        super.onDestroy();
        //Log.d(TAG, "onDestroy() 호출됨.");
        Toast.makeText(getApplicationContext(), "onDestroy() 호출됨.", Toast.LENGTH_LONG).show();
    }
 
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
 
 
 
}
 
cs

 

서비스는 처음 생성되면 onCreate() processCommand() 순으로 호출 된다. 서비스는 한번 실행이 되면 없어 지지 않고 그 상태에서 다시 실행되도 onCreate()는 실행되지 않고 processCommand()만실행 된다. 또한 어플리케이션을 완전히 종료 되도 자동으로 시스템이 서비스를 다시 실행 시켜준다 이때는 다시 onCreate() processCommand() 순으로 실행된다. 

 

추가적으로 메인 액티비티에

 

protected void onNewIntent(Intent intent)

 

이런 콜백함수가 있는데 이것은 기존에 존재하는 액티비티가 있는데 인텐트의 플레그설정에 따라 다시 그 액티비티가 재사용되면  onNewIntent(Intent intent)가 실행된다. 

MainActivity

...더보기
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package com.example.boostcoursepractice;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
 
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
 
import com.google.android.material.snackbar.Snackbar;
 
import org.w3c.dom.Text;
 
import java.lang.reflect.Array;
import java.util.ArrayList;
 
 
public class MainActivity extends AppCompatActivity {
 
    Button closeBtn ;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Toast.makeText(this"OnCreate() 호출됨", Toast.LENGTH_LONG).show();
 
        closeBtn = (Button) findViewById(R.id.btn_close);
        closeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }
 
    @Override
    protected void onPostCreate(@Nullable Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
    }
 
    @Override
    protected void onStart() {
        super.onStart();
        Toast.makeText(this" onStart() 호출됨", Toast.LENGTH_LONG).show();
    }
 
    @Override
    protected void onStop() {
        super.onStop();
        Toast.makeText(this"onStop() 호출됨", Toast.LENGTH_LONG).show();
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Toast.makeText(this"onDestroy() 호출됨", Toast.LENGTH_LONG).show();
    }
 
    @Override
    protected void onPause() {
        super.onPause();
        Toast.makeText(this"onPause() 호출됨", Toast.LENGTH_LONG).show();
 
        SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
        if(pref == null) Toast.makeText(this"pref가 없습니다.", Toast.LENGTH_LONG).show();
        SharedPreferences.Editor editor = pref.edit();
        editor.putString("name""소녀시대");
        editor.commit() ;
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        Toast.makeText(this"onResume() 호출됨", Toast.LENGTH_LONG).show();
 
        SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
        if(pref == null) Toast.makeText(this"pref가 없습니다.", Toast.LENGTH_LONG).show();
        if(pref != null)
        {
            String name = pref.getString("name""");
            Toast.makeText(this"복구된 데이터 : " + name, Toast.LENGTH_LONG).show();
        }
    }
 
    @Override
    protected void onRestart() {
        super.onRestart();
 
        Toast.makeText(this"onRestart() 호출됨", Toast.LENGTH_LONG).show();
    }
}
 
cs

 

액티비티 수명주기는 아래 그림과 같다.

 

추가적으로 간단한 데이터베이스인 

  SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);

가 있는데 key값과 value값을 이용하여 사용한다.(getSharedPreferences를 하는 순간부터 pref는 null값을 가지지 않는다)

MainActivity

...더보기
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.example.boostcoursepractice;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
 
import com.google.android.material.snackbar.Snackbar;
 
import org.w3c.dom.Text;
 
import java.util.ArrayList;
 
public class MainActivity extends AppCompatActivity {
 
    Button menuBtn ;
    String[] names = {"김준수""황수연""차두리"} ;
    static int k =3 ;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        menuBtn = (Button) findViewById(R.id.button);
        menuBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent =new Intent(getApplicationContext(), MenuActivity.class);
 
                ArrayList<String> names = new ArrayList<String>() ;
                names.add("김건모");
                names.add("조정치");
                intent.putExtra("names", names);
 
                SimpleData simpleData = new SimpleData(27,"김미미");
                intent.putExtra("simpleData", simpleData);
 
                startActivityForResult(intent, 101);
            }
        });
    }
 
 
}
 
cs

 

MenuActivity

...더보기
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.example.boostcoursepractice;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
import java.util.ArrayList;
 
public class MenuActivity extends AppCompatActivity {
 
    Button serialBtn;
    Button parcelBtn;
    Button backBtn;
    Intent intent;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
 
        serialBtn = (Button)findViewById(R.id.serial_btn);
        parcelBtn = (Button)findViewById(R.id.parcel_btn) ;
        backBtn = (Button)findViewById(R.id.button2);
        intent = getIntent() ;
 
        serialBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ArrayList<String> names = (ArrayList<String>) intent.getSerializableExtra("names");
 
                String temp = "";
                for(int i=0 ; i<names.size() ; i++)
                {
                    temp += names.get(i) + " " ;
                }
                Toast.makeText(getApplicationContext(), temp, Toast.LENGTH_LONG).show() ;
            }
        });
 
        parcelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               SimpleData simpleData = (SimpleData) intent.getParcelableExtra("simpleData");
                Toast.makeText(getApplicationContext(),  simpleData.number + " "+simpleData.message, Toast.LENGTH_LONG).show() ;
            }
        });
 
 
 
        backBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
 
 
    }
}
cs

 

SimpleData

...더보기
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
package com.example.boostcoursepractice;
 
import android.os.Parcel;
import android.os.Parcelable;
 
public class SimpleData implements Parcelable {
 
    int number ;
    String message ;
 
    public SimpleData(int number, String message) {
        this.number = number;
        this.message = message;
    }
 
    public SimpleData(Parcel src)
    {
        number = src.readInt();
        message = src.readString();
    }
 
    public static final Parcelable.Creator CREATOR = new Parcelable.Creator()
    {
        @Override
        public SimpleData createFromParcel(Parcel src) {
            return new SimpleData(src);
    }
 
        @Override
        public SimpleData[] newArray(int i) {
            return new SimpleData[i];
        }
    };
 
    @Override
    public int describeContents() {
        return 0;
    }
 
    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(number);
        parcel.writeString(message);
    }
}
 
cs

 

 activity_main.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
    >
 
<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginStart="158dp"
    android:layout_marginLeft="158dp"
    android:layout_marginTop="329dp"
    android:text="메뉴 화면 띄우기" />
</RelativeLayout>
cs

 

acitivity_menu.xml

...더보기
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
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MenuActivity">
 
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="돌아가기"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.736" />
 
    <Button
        android:id="@+id/serial_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginBottom="52dp"
        android:text="시리얼라이즈로 받은 데이터"
        app:layout_constraintBottom_toTopOf="@+id/parcel_btn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
 
    <Button
        android:id="@+id/parcel_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="68dp"
        android:text="파슨으로 받은 데이터"
        app:layout_constraintBottom_toTopOf="@+id/button2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
cs

 

액티비티 간의 데이터를 전달할 때 일반전인 데이터가 아닌 객체를 전달할 때는 serialize 방법과 parcel방법 두가지가 있다.

 

ArrayList<String> names = (ArrayList<String>) intent.getSerializableExtra("names");

SimpleData simpleData = (SimpleData) intent.getParcelableExtra("simpleData");

 

이 두가지 메서드를 통해서 받을 수 있다. 일반적으로 시리얼 보단 파슨을 쓰는 것이 권장된다. 파슨을 쓸때는 SimpleData처럼 Parcelable 인터페이스를 implement해 구현하여 사용한다.

 

***Serializable방식을 사용할 때 ArrayList<Object>의 Object가 사용자가 정의한 클래스 일때 implements Serializable로

직렬화해야만 사용할 수 있다.

** 액티비티 간의 데이터를 전달 할 때 공유 되지는 않는다. 아예 새로 만들어져서 전달해주기 때문에 복사하는 형식이다. **

 

 

 

 

시리얼라이즈로 받은 화면

 

 

 

파슨으로 받은화면

 

MainActivity

...더보기
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.example.boostcoursepractice;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
 
import com.google.android.material.snackbar.Snackbar;
 
import org.w3c.dom.Text;
 
import java.util.ArrayList;
 
public class MainActivity extends AppCompatActivity {
 
    EditText editText;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button button = (Button) findViewById(R.id.button3);
        editText = (EditText) findViewById(R.id.editText);
 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String receiver = editText.getText().toString();
                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+receiver));
                startActivity(intent);
 
                Intent intent2 = new Intent();
                ComponentName componentName = new ComponentName("com.example.boostcoursepractice""com.example.boostcoursepractice.MenuActivity");
                intent2.setComponent(componentName);
                startActivity(intent2);
 
                
            }
        });
 
    }
}
 
cs

 

activity_main.xml

...더보기
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
 
    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="154dp"
        android:layout_marginLeft="154dp"
        android:layout_marginTop="322dp"
        android:text="전화걸기" />
 
    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="85dp"
        android:layout_marginLeft="85dp"
        android:layout_marginTop="237dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="010-1000-1000" />
</RelativeLayout>
cs

 

 String receiver = editText.getText().toString();

                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+receiver));

                startActivity(intent);

 

이런식으로 인텐트를 통해 전화기능을 가진 앱을 불러들여 전화번호를 넘겨줄수 있다.

 

 

 

만약 MenuActivity가 있다면 아래와 같이

 

Intent intent2 = new Intent();

                ComponentName componentName = new ComponentName("com.example.boostcoursepractice""com.example.boostcoursepractice.MenuActivity");

                intent2.setComponent(componentName);

                startActivity(intent2);

 

 

ComponentName을 이용하여 패키지와 패키지를 포함한 액티비티이름을 String으로 매개인자로 넘겨주어 인텐트에 set해주고 start해주면 해당 액티비티를 띄울 수 있다.(이러한 방식으로 하면 String으로 액티비티를 띄울 수 있다는 장점이 있다.)

 

 

결과화면

+ Recent posts