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으로 액티비티를 띄울 수 있다는 장점이 있다.)

 

 

결과화면

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
package com.example.boostcoursepractice;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
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.FrameLayout;
import android.widget.GridView;
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 ;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        menuBtn = (Button) findViewById(R.id.menu_btn) ;
 
        menuBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
                startActivityForResult(intent, 101);
            }
        });
 
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
 
        if(requestCode ==101)
        {
            String name = data.getStringExtra("name");
            Toast.makeText(getApplicationContext(), "메뉴화면으로부터 응답 : " + name , Toast.LENGTH_SHORT).show();
        }
    }
}
 
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
package com.example.boostcoursepractice;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
public class MenuActivity extends AppCompatActivity {
 
    Button returnBtn;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
 
        returnBtn = (Button) findViewById(R.id.return_btn);
 
        returnBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("name""mike") ;
 
                setResult(Activity.RESULT_OK,intent);
                finish();
            }
        });
 
    }
}
 
cs

 

activity_main.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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/menu_btn"
        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="156dp"
        android:layout_marginLeft="156dp"
        android:layout_marginTop="340dp"
        android:text="메뉴 화면 띄우기" />
 
</RelativeLayout>
cs

 

activity_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
<?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">
 
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메뉴화면"
        android:textSize="40dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
    <Button
        android:id="@+id/return_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="돌아가기"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
cs

 

 Intent intent = new Intent(getApplicationContext(), MenuActivity.class);

                startActivityForResult(intent, 101);

위 코드 처럼 Intent안에 새로 띄울 액티비티를 집어 넣고 startActivityResult로 인자를 전달하여 띄운다. 이때 101은 사용자가 지정해준 요청코드로서 나중에 띄운 액티비티가 꺼지고 본래의 액티비티로 돌아올때 어떤 액티비티가 꺼졌는지 구별하는 역할을 해준다. 

 

 Intent intent = new Intent();

                intent.putExtra("name""mike") ;

 

                setResult(Activity.RESULT_OK,intent);

                finish();

intent의 putExtra를 이용하여 name이라는 키 값에 mike라는 string자료를 넣어주었다. 그리고 setResult라는 함수를 사용하여 응답코드인 Activity.RESULT_OK intent를 전달해주므로서 intent안의 데이터를 전달해주는 형식이다.

 

원래의 액티비티로 돌아오면

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

        super.onActivityResult(requestCode, resultCode, data);

 

        if(requestCode ==101)

        {

            String name = data.getStringExtra("name");

            Toast.makeText(getApplicationContext(), "메뉴화면으로부터 응답 : " + name , Toast.LENGTH_SHORT).show();

        }

    }

 

와 같이 onActivityResult함수가 호출되는데 이때 requestCode를 통하여 종료된 액티비티를 구별해주고 data라는 인텐트를 통해 그 안의 데이터를 data.getStringExtra함수로 인자에 키값을 넣어 받아볼 수 있다.

 

 

 

 

 

결과화면

 

 

 

결과화면

 

+ Recent posts