2016. 9. 18. 21:20

안녕하세요 


IT비전공자 프동프동 입니다.


지금까지 액티비티에 속한 뷰와 뷰 그룹에 대해 배워봤습니다.

이제는 실제로 뷰와 뷰 그룹이 속한 액티비티에 영혼을 불어넣는 과정을 배워보겠습니다.


액티비티를 실행하는 방법은 한가지가 아닌 몇가지 방법이 있습니다.


먼저 들어가기에 앞서 인텐트에 대해 간단히 정리하고 가겠습니다.

인텐트: 액티비티 뿐만 아니라 다양한 컴포넌트를 동작시키기 위한 매개체라고 합니다.

연결고리?


명시적 인텐트(Explicit Intent)와 암시적 인텐트(Implicit Intent)

명시적인텐트- 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우

  - 부 액티비티 사용시

  - 화면을 지정한 것 ex) MainActivitiy.class


암시적인텐트- 액션과 데이터를 지정하기는 했지만 호출할 대상이 달라질 수 있는 경우

-범주,타입,부가데이터

-외부 액티비티 사용시

ex)특정 화면을 지정하지 않은 것






오늘은 명시적 인텐트(Explicit Intent)를 사용해서 앱을 구성해 보겠습니다.





먼저 A화면에서 버튼을 눌렀을 시 B화면이 생성되고 B화면에서 버튼을 눌렀을시 B화면이 꺼지는 동작을 하는 앱을 만들어 보겠습니다.


연결을 시키려면 먼저 연결시킬 a라는 액티비티와 b라는 액티비티가 필요합니다.


먼저 a에 역할을 하기위해 A라는 화면과 B화면으로의 이동을 위한 버튼을 하나 만들어 주겠습니다.


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:tools="http://schemas.android.com/tools"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:orientation="vertical"

        tools:context="com.example.donggyu.example001_01.MainActivity">


        <TextView  <!--A화면이라고 알리기 위한 TextView-->

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="A화면"

            android:textSize="30dp"

            android:id="@+id/textView"


            android:layout_marginLeft="105dp"

            android:layout_marginStart="105dp" />


        <Button  <!--B화면으로의 이동을 위한 버튼--> 

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="B화면으로 이동"

            android:id="@+id/button"

            android:layout_marginTop="62dp"

            android:textStyle="bold"

            android:onClick="onButton01"

            />

</LinearLayout>



MainActivity.java
package com.example.donggyu.example001_01;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    public void onButton01(View v)//버튼을 누르면..
    {
        Intent intent = new Intent(getApplicationContext(),BActivity.class);
                //Intent는 전달하는 우체부 같은 역할
        startActivity(intent);
                //startActivity() intent를 시작하기 위한 메소드
    }
}
 


여기 까지 만드시면 BActivity.class라는 글에 빨간줄이 뜰 것입니다. 
그것은 연결하려는 BActivity가 존재하지 않기 때문에 뜨는 것입니다.

이제 BActivity를 만들어보겠습니다.

 B화면의 구성을 XML로 만들어줍니다. 위에 했던 A화면 구성에서 글자만 바꿔주도록 하겠습니다.


activity_B.xml
<?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"
    tools:context="com.example.donggyu.example001_01.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="B화면"
        android:textSize="30dp"
        android:layout_marginLeft="105dp"
        android:layout_marginStart="105dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="B화면 종료/A화면으로 돌아가기"
        android:layout_marginTop="62dp"
        android:textStyle="bold"
        android:onClick="onButton01"
        />
</LinearLayout>
 
이제 B화면에서 버튼을 눌렀을시 화면이 사라지게, 꺼지게 하는 동작을 해보겠습니다.

BActivity.class
 
package com.example.donggyu.example001_01;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class BActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
    }
    public void onButton01(View v)
    {
        finish();
    }
}

finish(): 현재 액티비티를 종료하겠다. 라는 의미를 가지고 있는 메서드 입니다.


맞다!! 참고로 
새로만든 BActivity는 menifast에 추가해주셔야 합니다. 

<?xml version="1.0" encoding="utf-8"?>
    package="com.example.donggyu.example001_01">

    <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=".BActivity"></activity>
    </application>

</manifest>
이제 에뮬레이터에 구동해 보시면 끝!!
--------------------------------------

좀 더 응용해서 서로 데이터를 전달해주는 방식으로 변환을 해보겠습니다.

여기서는 데이터를 전달해주는 방법으로 부가데이터(Extar)를 사용합니다
부가데이터(Extra): 
-인텐트는 추가적인 정보를 넣을 수 있도록 번들 객체를 담고 있다.
-이 객체를 통해 인텐트 안에 더 많은 정보를 넣어 다른 애플리케이션 구성요소에 전달할 수 있다. 

MainActivity.class

package com.example.donggyu.example001_01;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void onButton01(View v)
    {
        Intent intent = new Intent(getApplicationContext(),BActivity.class);
        intent.putExtra("word","ABC");
        startActivityForResult(intent,500);
    }
}


putExtra("word","ABC"); 데이터를 담기 위한 메소드
ex)내용물이 문자열 ABC인 데이터를 word라는 이름으로 보낸다.
startActivityForResult(intent,500);시작하겠다. 라는 의미를 가진 메소드
ex)a에서 b로 Intent를 사용하여 500번이란 번호로 전달하겠다.(액티비티가 많아질때 누구에게 요청했는지 번호로 알 수 있습니다.)

BActivity.class

package com.example.donggyu.example001_01;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class BActivity extends AppCompatActivity {

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

        Intent intent = getIntent(); //getIntent로 받아 볼 수 있다.
        //intent안에 extra가 들어있다.
        if(intent != null)
            //받은 데이터가 비어있을 수도 있으니 조건문으로 확인하며 받아준다.
        {
            String title = intent.getStringExtra("word");
            //받은 값이 문자열이니 문자열로 받아준다.
            Toast.makeText(getApplicationContext(),"전달 받은 데이터"+title,Toast.LENGTH_SHORT).show();
            
        }
    }
    public void onButton01(View v)
    {
        Intent intent = new Intent();
        intent.putExtra("meaning","거북이");
        //전해 주기 위한 메소드
        setResult(RESULT_OK,intent);
        //RESULT_OK 응답코드, 정상인지 아닌지 전달해주기 위한
        finish();
    }
}
 
MainActivity.class
package com.example.donggyu.example001_01;

        import android.content.Intent;
        import android.os.Bundle;
        import android.support.v7.app.AppCompatActivity;
        import android.view.View;
        import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void onButton01(View v)
    {
        Intent intent = new Intent(getApplicationContext(),BActivity.class);
        intent.putExtra("word","ABC");
        startActivityForResult(intent,500);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(data != null) //data가 0이 아니면 실행하는 조건문
    {
        String meaning =  data.getStringExtra("meaning");
        //meaning라는 이름의 데이터가 있는지 확인후 받아온다.
        Toast.makeText(getApplicationContext(),"전달 받은 데이터"+meaning,Toast.LENGTH_SHORT).show();
    }
        super.onActivityResult(requestCode, resultCode, data);

    }
    //응답을 받기위한 메소드
}


Posted by 프동프동