2023.02.23 - 안드로이드 앱개발자 과정

CHA·2023년 2월 24일
0

Android



화면 전환하기

핸드폰은 작아서 많은 화면을 보여주기는 어렵다. 그래서 정한 규칙! 한 앱에서 화면을 보여줄 때 하나의 액티비티만 보여주자! 근데, 프래그먼트로는 어느정도 한계가 있기 때문에 Activity 를 전환시키는 방법을 알아보자.


Activity 전환

안드로이드 앱의 4대 구성요소

Activity 는 안드로이드 앱의 4대 구성요소 입니다. 4개의 구성요소는 다음과 같습니다.

4대구성요소

  1. Activity - 화면담당 클래스
  2. BroadcastReceiver - 디바이스의 특정 상태를 OS 에서 알려주면 이를 수신할 때 사용
  3. Service - 백그라운드 작업을 위한 구성요소
  4. Contents Provider - 다른 앱에게 나의 DB 정보를 제공할 때 사용

자세한 이야기는 각각 따로 해보고, 일단 오늘은 Activity 에 대해 알아봅시다.

MainActivity 화면 구성

액티비티를 만드는 방식도 프래그먼트를 만드는 방식과 유사합니다. 별도의 자바파일과 별도의 xml 파일이 필요합니다. 이제 버튼을 누르면 우리가 만든 SecondActivity 로 넘어가는 예제를 해봅시다.



------------- activity_main.xml
<RelativeLayout ... 중략 >

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Go SecondActivity"
        android:textAllCaps="false"/>
</RelativeLayout>


------------- MainActivity.java
public class MainActivity extends AppCompatActivity {

    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.btn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                
            }
        });
    }
}

버튼도 만들었고 리스너도 만들었으니 이제 두번째 액티비티를 만들고 화면구성까지 해봅시다. 별다를건 없습니다. 액티비티는 별도의 자바파일과 별도의 xml 파일로 구성되므로 각각 만들어봅시다.

SecondActivity 화면 구성



----------- activity_second.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Second Activity"
        android:textColor="@color/black"
        android:layout_centerInParent="true"/>
</RelativeLayout>


----------- SecondActivity.java
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

    }
}

SecondActivity 의 화면을 구성하는것은 MainActivity의 화면 구성방식과 동일 합니다. SecondActivity 클래스에 androidx 패키지의 AppCompatActivity 클래스를 상속시켜주고, onCreate() 콜백 메서드를 이용하여 setContentView() 를 호출합시다. 파라미터로 우리가 만든 activity_second.xml 을 넘겨주면 화면구성은 완료입니다.

AndroidManifest.xml 에 Activity 등록

Activity 를 만들면 반드시 AndroidManifest.xml 에 등록해주어야 합니다.

<activity android:name=".SecondActivity" android:exported="false">
</activity>

name 속성은 액티비티 클래스의 이름이며, exported 속성은 외부에서 직접 접근이 가능한지의 여부를 결정하는 속성입니다.

Intent 클래스

SecondActivity 를 실행시키기 위해서는 어떠 택배기사와 같은 객체가 필요합니다. 우리 대신 직접 SecondActivity 를 실행시키기 위한 대리인이죠. 그 객체가 바로 Intent 객체 입니다. 굳이 비유를 택배기사라고 한것은 우리가 인텐트 객체를 만들고 그 인텐트 객체를 SecondActivity 로 보낼때, 여러가지 정보를 인텐트 손에 들려 보내야 하기 때문입니다. 자 그러면 인텐트 객체를 생성해봅시다.

public class MainActivity extends AppCompatActivity {

    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.btn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);

                startActivity(intent);
                finish();
            }
        });
    }
}

Intent intent = new Intent(MainActivity.this, SecondActivity.class); 를 이용하여 인텐트 객체를 생성해주었습니다. 생성자의 첫번째 파라미터로는 인텐트가 생성된곳의 Context 객체를, 두번째 파라미터로는 생성할 액티비티의 클래스 정보를 전달해주어야 합니다.

그리고 startActivity() 메서드를 호출하고 파라미터로 인텐트 객체를 전달해줍니다. 그러면 SecondActivity 가 실행됩니다. 그러면 새로운 액티비티를 생성했으니(이 부분은 별개의 스레드로 진행됩니다.) 현재의 메인액티비티는 종료해야겠죠? finish() 를 이용하여 메인 액티비티를 종료 합시다.

ThirdActivity 화면 구성

앞서 SecondActivity 예제를 통해 화면을 전환하는 법을 알아보았습니다. 이번에도 같은 예제입니다. 연습하는 기분으로 따라갑시다.

  • ThirdActivity.java 파일 구성
public class ThirdActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
    }
}
  • activity_third.xml 파일 구성
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Third Activity"
        android:layout_centerInParent="true"
        android:textSize="20sp"/>
</RelativeLayout>
  • AndroidManifest.xml 파일에 코드 추가
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Ex42_Activity"
        tools:targetApi="31">

      ... 중략 
      
        <activity android:name=".ThirdActivity" android:exported="false">

        </activity>
    </application>

</manifest>
  • MainActivty 에서 클릭 이벤트
    메인액티비티에서 버튼을 하나 더 만들고, 그 버튼을 누르면 세번째 액티비티로 넘어가는 코드를 구현해봅시다.
public class MainActivity extends AppCompatActivity {

    Button btn,btn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ... 중략

        btn2 = findViewById(R.id.btn2);
        btn2.setOnClickListener( view -> {
       
            Intent intent = new Intent(this, ThirdActivity.class);
            startActivity(intent);
        });
    }
}

앞서 두번째 액티비티로 전환할 때 Intent 객체를 사용했던것과 똑같이 세번째 액티비티에서도 Intent 객체를 생성하고 startAcitivty() 를 호출해주면 끝입니다. 다만 위 코드에서 주의깊게 볼 부분은 -> 인 부분입니다.

우리는 리스너의 추상메소드를 구현하고자 할 때, new 연산자를 이용해서 리스너 객체를 만들고 그에 맞추어 추상메소드를 중괄호 안쪽에서 구현해주었습니다. 그런데 이게 너무 복잡해보이고 귀찮은겁니다. 심지어 메소드가 하나일 경우에도 똑같이 작성해야하니 비효율적이라는 생각이 들기 시작합니다. 그래서 익명클래스 내부에 추상메소드를 하나만 구현해야할 때 사용할 수 있는 축약표현을 사용하기 시작했습니다. 그게 람다식 입니다. 위 코드와 같이 사용할 수 있으며, 중괄호 내부에 실행문을 작성해주면 됩니다.

다만, 위 코드를 보면 람다식을 이용하게 되었을 때, 이 실행문을 감싸고 있는 클래스는 익명클래스가 아닌 MainActivity 임을 주의합시다.


Activity 전환 시 데이터 전달

액티비티간의 데이터를 전달해봅시다. Intent 객체를 택배기사로 비유한 이유중 하나는 Intent 객체가 Extra 라는 박스를 가지고 있기 때문입니다. 이 박스안에 정보들을 담아가지고 실행시킬 액티비티에게 이동한 뒤, 그 액티비티에게 정보를 전달해줍니다. 자 그러면 이제 예제를 해봅시다. 먼저, 첫번째 액티비티의 화면구성부터 만들어봅시다.

<LinearLayout ... 중략 >

    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="이름을 입력하세요"
        android:inputType="text"/>
    <EditText
        android:id="@+id/et_age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="나이을 입력하세요"
        android:inputType="number"/>
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="Go SecondActivity"/>


</LinearLayout>

정보를 입력할 에디트텍스트 2개와 버튼하나를 만들어줍시다. 버튼을 누르면 우리가 입력한 정보가 두번째 액티비티로 넘어가게끔 해보겠습니다.

public class MainActivity extends AppCompatActivity {

    EditText etName,etAge;
    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        etName = findViewById(R.id.et_name);
        etAge = findViewById(R.id.et_age);
        btn = findViewById(R.id.btn);

        btn.setOnClickListener(view -> {
            String name = etName.getText().toString();
            int age = Integer.parseInt(etAge.getText().toString());

            Intent intent = new Intent(this, SecondActivity.class);
            intent.putExtra("name",name);
            intent.putExtra("age",age);
            startActivity(intent);
        });
    }
}

String name = etName.getText().toString(); 을 이용하여 에디트 텍스트로 입력받은 이름을 String 변수에 넣어주었으며 마찬가지로 int age = Integer.parseInt(etAge.getText().toString());을 이용하여 age 변수에 넣어주었습니다.

그리고 Intent 객체 하나를 생성하여 putExtra() 메소드를 활용해 데이터와 데이터의 식별자를 인텐트 객체에 넣어주었습니다. 그리고 startActivity(intent); 으로 두번째 액티비티를 실행시킵니다.

두번째 액티비티의 화면 구성입니다. 간단하게 중앙에 텍스트뷰 하나를 배치했으며, 여기에는 첫번째 액티비티에서 전달받은 age 변수의 값을 넣어줄 예정이며, 액션바의 타이틀로 name 변수의 값을 전달하겠습니다.

<RelativeLayout 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=".SecondActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:layout_centerInParent="true"
        android:textColor="@color/black"
        android:text="new text"/>

</RelativeLayout>
public class SecondActivity extends AppCompatActivity {

    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Intent intent = getIntent();

        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age",0);

        tv = findViewById(R.id.tv);
        getSupportActionBar().setTitle(name);
        tv.setText(age+"");
    }
}

두번째 액티비티는 인텐트 객체를 전달받는것이지 새로 생성하는것이 아닙니다. 그래서 Intent intent = getIntent(); 를 이용하여 두번째 액티비티로 넘어온 인텐트 객체를 get 합니다.

String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age",0);

그리고 넘어온 인텐트 객체의 정보를 각각 name 과 age 변수에 담아줍시다.

tv = findViewById(R.id.tv);
getSupportActionBar().setTitle(name);
tv.setText(age+"");

그리고 그 값들을 텍스트뷰와 액션바의 타이틀에 넣어주어 화면에 띄웁니다.

인텐트 객체를 통해 다른 Activity 에서 정보를 받아오는것은 그리 어렵지 않습니다. 그런데 생각해보면 이런 경우도 있지 않을까요? 인텐트 객체에게 다녀오라고 할 수도 있을것같습니다. 위 예제의 경우는 인텐트객체에게 정보를 주고 다른 액티비티로 가라고 했지만, 인텐트 객체를 다른 액티비티로 보내고 거기서 정보를 받은 다음, 다시 우리쪽 액티비티로 돌아오게 할 수는 없을까요? 다음 예제에서 알아봅시다.


다른 Activity 에서 데이터 받아 돌아오기 - 명시적 인텐트

예제를 진행하기 위해 일단 화면부터 만들어 봅시다.



--------------- activity_main.xml
<LinearLayout ... 중략 >

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="결과를 받아오기"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="result"
        android:textColor="@color/black"
        android:padding="8dp"
        android:textSize="30sp"/>

</LinearLayout>


--------------- activity_second.xml
<LinearLayout ... 중략 >

    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="이름 "
        android:inputType="text"/>
    <EditText
        android:id="@+id/et_age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="나이 "
        android:inputType="number"/>
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="완  료"/>
</LinearLayout>

activity_main.xml 에는 버튼 하나와 결과를 받아와서 화면에 띄워줄 텍스트뷰 하나를, activity_second.xml 에는 정보를 입력할 에디트텍스트 2개와 정보를 전달하는 버튼 하나를 만들었습니다.

ActivityResultLauncher

그리고 다른 액티비티의 정보를 전달받을 수 있게 해주는 중요한 클래스가 있습니다. 바로 ActivityResultLauncher 입니다. 인텐트의 작업을 대신 처리해 줄 수 있는 객체입니다. 일단 이 객체를 생성해봅시다.

ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
    @Override
    public void onActivityResult(ActivityResult result) {

    }
});

여기서 registerForActivityResult() 는 ActivityResultContract 와 ActivityResultCallback 을 파라미터로 전달받고, 다른 Activity 를 실행하는데 사용할 ActivityResultLauncher 객체를 반환합니다.

그리고 ActivityResultContract 는 우리가 결과를 생성하는데 필요한 입력의 형태와 결과를 출력하는 방식을 정의하며 우리가 intent 를 사용하는 작업의 기본적인 계약을 제공하는 객체라고 생각하면 좋습니다. 또한 ActivityResultContract 는 다양한 계약 객체들이 존재하는데, 우리는 startActivityForResult 객체를 사용합니다.

또한 ActivityResultCallback 객체를 생성하기 위해서는 onActivityResult() 메소드의 구현이 필요하며, 익명클래스를 이용하여 구현할 수 있습니다. 이 메서드는 다른 액티비티에서 결과값을 전달받는 메서드 입니다. 다른 액티비티에서 작업이 끝났다면, 이 메서드가 호출되는 구조이므로 데이터를 전달받은 이후의 작업처리는 이 메서드 내부에서 정의할 수 있습니다.

즉, 위 코드는 다른 액티비티에서 정보를 다시 가져오기 위한 ActivityResultLauncher 객체를 하나 만들고, 정보를 다시 가져와서 작업을 처리하기 위한 onActivityResult() 메소드를 정의해놓은 코드라고 볼 수 있습니다. 그럼 이제 launcher 객체를 이용하여 인텐트를 다른 액티비티로 보내고, 다시 정보를 받아오는 작업을 해봅시다.



----------- MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btn = findViewById(R.id.btn);
    tv = findViewById(R.id.tv);

    btn.setOnClickListener(view -> {
        Intent intent = new Intent(this, SecondActivity.class);
        launcher.launch(intent); 
    });
}

버튼을 누르면, SecondActivity 로 보낼 인텐트 객체가 하나 생성되며, 앞서 만들었던 ActivityResultLauncher 객체를 이용하여 인텐트를 보내줍니다. startActivity() 로 하게되면 인텐트를 보낼 수는 있으나 다시 돌려받을 수는 없기 때문에 주의해야 합니다.




----------- SecondActivity.java
public class SecondActivity extends AppCompatActivity {

    EditText etName,etAge;
    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        etName = findViewById(R.id.et_name);
        etAge = findViewById(R.id.et_age);
        btn = findViewById(R.id.btn);

        btn.setOnClickListener( view -> {
            String name = etName.getText().toString();
            int age = Integer.parseInt(etAge.getText().toString());

            Intent intent = getIntent();
            intent.putExtra("name",name);
            intent.putExtra("age",age);

            setResult(RESULT_OK, intent); 
            finish();
        });
    }
}

버튼을 누르면 Intent intent = getIntent(); 을 통해 MainActivity 에서 보낸 인텐트 객체를 받아올 수 있습니다. 그리고 받아온 인텐트에 적절한 정보와 정보의 식별자를 넣어주고, setResult() 메서드에 식별코드와 인텐트를 넣어줍니다. 식별번호는 어떤 번호든 상관없지만 final 변수를 이용할것을 권장합니다. 그리고 setResult() 메소드가 끝나면 인텐트는 다시 MainActivity 로 돌아가며, onActivityResult() 메소드를 호출합니다. SecondActivity 에서 모든 작업은 끝났으므로, finish() 를 이용하여 액티비티를 종료해줍시다.

사실 코드 자체가 좀 복잡해보이고 길어서 어렵게 생각될 수 있으나, 원리만 생각해보면 그리 어려운 내용은 아닙니다. 정보를 담을 인텐트 객체를 받아올 액티비티에 주고, 그 액티비티에서 인텐트에 정보를 넣어 다시 돌려주면 끝입니다.

이제 인텐트가 다시 MainActivity 로 돌아갔으므로, onActivityResult() 메서드의 내부를 정의해봅시다.

@Override
public void onActivityResult(ActivityResult result) {

    if(result.getResultCode() == RESULT_OK){
        
        Intent intent = result.getData(); 
        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age",0);
        tv.setText(name + " " + age);

    }else if(result.getResultCode() == RESULT_CANCELED){
        Toast.makeText(MainActivity.this, "취소되었습니다", Toast.LENGTH_SHORT).show();
    }
}

우리는 SecondActivity 에서 인텐트를 보내줄 때, setResult() 메서드를 이용했습니다. 그때 인텐트와 함께 RESULT_OK 라는 인텐트를 식별할 수 있는 식별코드도 함께 동봉해서 보냈었습니다. 그 식별코드를 이용하여 제대로 전달이 되었는지 확인을 해주어야 합니다. 그래서 받은 결과값인 result 파라미터 참조변수의 getResultCode() 가 RESULT_OK 인지 판단하여 맞다면 if 문 내에서 텍스트뷰에 정보를 넣어줍니다. 만일 아니라면 토스트 메시지를 하나 띄웠습니다.


다른 Activity 에서 데이터 받아 돌아오기 - 묵시적 인텐트

묵시적 인텐트 vs 명시적 인텐트

인텐트는 묵시적 인텐트와 명시적 인텐트로 분류할 수 있습니다. 명시적 인텐트는 지금까지 우리가 사용해왔던 인텐트로, 실제 존재하는 클래스의 정보를 인텐트에 직접 넣어주어 사용했던 인텐트입니다. 직접적인 클래스의 정보가 들어가 있기 때문에 우리가 보기에는 조금 더 직관적일 수 있습니다.

반면에 명시적 인텐트에는 클래스의 정보는 필요없습니다. 대신, 액티비티가 가지고 있는 식별자를 사용합니다. 조금 애매하니 예를 하나 들어볼까요? 우리가 카카오톡의 개발자라고 해봅시다. 이제 채팅방에서 사진을 올리는 기능을 개발하려 합니다. 그러려면 우리는 채팅방에서 사진앱으로 이동하는 코드가 필요합니다. 즉 사진앱의 정보가 필요한 셈이죠. 만일, 사진앱을 우리가 만들었다면 사진앱의 클래스 이름을 아니까 명시적 인텐트를 활용할 수 있을것 같습니다. 그런데, 사진앱은 우리가 만든게 아니죠. 그러니 클래스 이름도 알 수 없습니다.

이럴때 사용하는 인텐트가 묵시적 인텐트 입니다. 사진앱의 액티비티에는 식별코드가 들어있으며, 이러한 식별코드를 이용하여 묵시적 인텐트를 사용할 수 있습니다. 자 그럼 이제 코드를 통해 알아봅시다.

아래 예제는 버튼을 누르면 다른 액티비티로 넘어가는 간단한 예제입니다. MainActivity 의 코드를 짜기 이전에, SecondActivity 의 코드 먼저 짜놓겠습니다.



---------- SecondActivity.java
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        getSupportActionBar().setTitle("Second Activity!!!");
    }
}
<activity
    android:name=".SecondActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="aaaa"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>

</activity>

이 액티비티가 SecondActivity 임을 확인할 수 있도록 액션바의 타이틀만 변경해주었습니다. 그리고 SecondActivity 의 식별코드를 하나 설정해주었습니다. 이 식별코드 설정은 메니페스트 파일에서 해주어야 합니다. 먼저, <intent-filter> 를 설정하고, <action><category> 를 설정합시다. 이 <action> 의 속성으로 식별코드를 설정할 수 있습니다. 카테고리는 이 액티비티가 어떤 화면인지를 나타내는 코드로, 필수로 지정해주어야 합니다.

public class MainActivity extends AppCompatActivity {

    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.btn);
        btn.setOnClickListener(view -> {
            Intent intent = new Intent();
            //intent.setAction("aaaa");
            intent.setAction("aaaa"); 
            startActivity(intent);
        });
    }
}

앞서 지정한 SecondActivity 의 식별코드 aaaasetAction() 의 파라미터로 지정해주었습니다. 앞서 클래스 정보를 파라미터로 전달했던것과 비슷합니다. 이렇게 지정해준 뒤, startActivity() 메서드를 실행시키면 식별코드가 동일한 액티비티를 실행함과 동시에 그 액티비티로 인텐트를 보내줄 수 있습니다.


다른 Activity 에서 데이터 받아 돌아오기 - System 인텐트

앞서 배웠던 묵시적 인텐트를 이용하면 이미 만들어진 여러 앱들로 액티비티의 전환이 가능합니다. 이번 예제들에서는 여러가지 앱들로 액티비티를 전환시켜 봅시다.

1. 다이얼 화면

findViewById(R.id.btn1).setOnClickListener(view -> {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:01012345678"));
    startActivity(intent);
});

2. 문자 화면

findViewById(R.id.btn2).setOnClickListener(view -> {
    Intent intent = new Intent(Intent.ACTION_SENDTO); 
    intent.setData(Uri.parse("smsto:01012345678 , smsto:01022224444"));
    intent.putExtra("sms_body","안녕하세요");
    startActivity(intent);
});

3. 웹페이지 화면

findViewById(R.id.btn3).setOnClickListener(view -> {
    Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("https://www.naver.com"));
    startActivity(intent);
});

4. 카메라 화면

findViewById(R.id.btn4).setOnClickListener(view -> {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivity(intent);
});
profile
Developer

0개의 댓글