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
public class TCP_Client extends AsyncTask {
 
    protected static String SERV_IP = "server ip"
    protected static int PORT = 0000;
 
    @Override
    protected Object doInBackground(Object... params) {
        // TODO Auto-generated method stub
 
        
        try {
            Socket sock = new Socket(SERV_IP, PORT);
            DataInputStream input = new DataInputStream(sock.getInputStream());
            DataOutputStream output = new DataOutputStream(sock.getOutputStream());
 
            
            try {
                
                WriteSocket(output);
//                ReadSock(input);
 
 
            } catch (IOException e) {
                e.printStackTrace();
            }
 
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        return null;
    }
 
    public void WriteSocket(DataOutputStream data) throws IOException {
        // data send
        byte[] bData = new byte[2];
        
 
        bData[0= (byte0x00;
        bData[1= (byte0x00;
   
        
        data.write(bData);
    }
 
    public void ReadSock(DataInputStream data) throws IOException {
        // data recieve
        byte[] datafile = null;
 
        data.read(datafile);
 
    }
}
cs



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
public class MainActivity extends Activity {
 
    private Button btn;
    TCP_Client tc;
 
    public void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.activity_main);
 
        btn = (Button) findViewById(R.id.Button01);
        btn.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                tc = new TCP_Client();
                tc.execute(this);
            }
        });
 
    }
 
}
cs




'이것저것 > 자바*안드로이드' 카테고리의 다른 글

TabWidget 탭 이미지 변경  (0) 2016.11.28
xml 파싱  (0) 2016.11.24
TabHost  (0) 2016.11.09
TimePickerDialog  (0) 2016.11.08
Okhttp jar  (0) 2016.10.27

브로드캐스트 : OS가 시스템의 상태 정보를 모든 어플리케이션에 알리는 방송


브로드캐스트리시버 : 브로드캐스트를 수신하기 위한 어플리케이션의 구성요소


브로드캐스트리시버 만드는 방법

- 브로드캐스트리시버클래스를 상속받는 클래스 작성
- 해당 클래스를 매니패스트에 구성요소로 등록
- 해당 클래스에 onReceive구현


1
2
3
4
5
6
7
8
9
10
        <receiver 
            android:name=".MyBroadcastReceiver">
            <intent-filter >
 
            브로드캐스트 리시버 정적으로 등록하는 방법
            구현한 브로드캐스트리시버 클래스를 receiver태그로 등록하고
            수신할 액션을 intent-filter에 정의
 
            </intent-filter>
        </receiver>
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        BroadcastReceiver br = new MyBroadcastReceiver();
        registerReceiver(br, new IntentFilter(Intent.ACTION_SCREEN_OFF));
        registerReceiver(br, new IntentFilter(Intent.ACTION_SCREEN_ON));

        //동적으로 등록하는 방법(manifest엔 없어도됨)
        //동적으로하면,, 브로드캐스트리시버를 넣었다뺏다 할 수 있고
//        몇몇 액션에 대해서는 보안상의 이유로 동적으로만 등록 가능
    }
}
cs

1
2
3
4
5
6
            <intent-filter >
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter> 문자수신액션
 
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
 
cs



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
import java.util.Date;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
 
public class MyBroadcastReceiver extends BroadcastReceiver{
 
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Bundle bundle = intent.getExtras();
        Object[] messages = (Object[]) bundle.get("pdus");
        SmsMessage[] smsMessage = new SmsMessage[messages.length];
 
        for(int i = 0; i < messages.length; i++) {
            // PDU 포맷으로 되어 있는 메시지를 복원합니다.
            smsMessage[i] = SmsMessage.createFromPdu((byte[])messages[i]);
        }
 
        // SMS 수신 시간 확인
        Date curDate = new Date(smsMessage[0].getTimestampMillis());
        Log.d("문자 수신 시간", curDate.toString());
 
        // SMS 발신 번호 확인
        String origNumber = smsMessage[0].getOriginatingAddress();
 
        // SMS 메시지 확인
        String message = smsMessage[0].getMessageBody().toString();
        Log.d("문자 내용""발신자 : "+origNumber+", 내용 : " + message);
        
        SmsManager smsManager = SmsManager.getDefault();
        String sendTo = "010xxxxxxxx";
        String myMessage = message;
        smsManager.sendTextMessage(sendTo, null, myMessage, nullnull);
    }
 
}
cs

1
2
    <uses-permission android:name="android.permission.SEND_SMS"/>
 
cs


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day110 아두이노  (0) 2016.08.30
Day109 아두이노  (0) 2016.08.29
Day105 안드로이드 웹뷰  (0) 2016.08.19
Day103  (0) 2016.08.17
Day102 안드로이드  (0) 2016.08.11

Working with System Permissions

안드로이드 6.0 권한 변경
Declaring Permissions
Learn how to declare the permissions you need in your app manifest.
Requesting Permissions at Run Time
Learn how to request permissions from the user while the app is running. This lesson only applies to apps on devices running Android 6.0 (API level 23) and higher.
Permissions Best Practices
Guidelines for creating the best user experience in requesting and using permissions.


네이버 D2

http://d2.naver.com/home 


Android의 HTTP 클라이언트 라이브러리

Android 애플리케이션에서는 HTTP 통신을 다루는 부분의 비중이 크다. 데이터를 조회하거나 저장하기 위해 서버와 통신하는 모듈은 대부분 HTTP API를 사용하고 있기 때문이다.

TCP/UDP의 낮은 레벨의 통신은 송수신을 위해 개발자가 직접 처리해야됨, 잔 작업도 많고 NAT문제에 자유롭지 않다


사용자가 보는 화면 개발을 제외한다면 HTTP 클라이언트가 애플리케이션 개발의 중심이라고도 할 만하다.

Android 환경에서 HTTP 클라이언트를 개발하는 방식은 다양하다. Android SDK에서 제공하는 기능을 직접 사용하기도 하고, 이를 좀 더 편하게 사용하도록 도와주는 유틸리티 클래스를 프로젝트마다 개발하기도 한다. 오픈 소스 라이브러리를 활용한 애플리케이션도 있다.


SDK에서 제공하는 HTTP 클라이언트의 허점과 변경 사항

Android는 표준 JRE의 클래스와 동일한 형태인 HTTPURLConnection 클래스를 제공한다. 

그리고 오픈 소스로 유명한 Apache HttpComponents의 HttpClient도 SDK에 포함되어 있다. (6.0부터 x)


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
public class NaverBookSearchService {
    //요청을 하기 위한 ID와 SECRET
    private static final String CLIENT_ID = "";
    private static final String CLIENT_SECRET = "";
    
    //요청할 URL
    private static final String URL
    ="https://openapi.naver.com/v1/search/book.xml";
    
    //한번의 요청에서 받아올 아이템 갯수
    private static final int DISPLAY_ITEM_COUNT = 10;
    
    //현재 페이지를 알기 위한 상태값
    private int currentSkip = 1;
    
    //검색할 키워드
    private String keyword;
    
    public NaverBookSearchService(String keyword)
    {
        this.keyword = keyword;
    }
    public void nextPage()
    {
        currentSkip += DISPLAY_ITEM_COUNT;
    }
cs

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
public List<Book> search(){
        List<Book> list = null;
        try {
            URL url;
            url = new URL(URL + "?query="
                    + URLEncoder.encode(keyword, "UTF-8")
                    + "&display=" + DISPLAY_ITEM_COUNT
                    + "&start="+ currentSkip);
 
            URLConnection urlConn = url.openConnection();
            urlConn.setRequestProperty("X-Naver-Client-Id", CLIENT_ID);
            urlConn.setRequestProperty("X-Naver-Client-Secret", CLIENT_SECRET);
             
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(
                    new InputStreamReader(urlConn.getInputStream()));
             
             
             
            int eventType = parser.getEventType();
            Book b = null;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                case XmlPullParser.END_DOCUMENT: // 문서의 끝
                    break;
                case XmlPullParser.START_DOCUMENT:
                    list = new ArrayList<Book>();
                    break;
                case XmlPullParser.END_TAG: {
                    String tag = parser.getName();
                    if(tag.equals("item"))
                    {
                        list.add(b);
                        b = null;
                    }
                }
                case XmlPullParser.START_TAG: {
                    String tag = parser.getName();
                    switch (tag) {
                    case "item":
                        b = new Book();
                        break;
                    case "title":
                        if(b != null)
                            b.setTitle(parser.nextText());
                        break;
                    case "link":
                        if(b != null)
                            b.setLink(parser.nextText());
                        break;
                    case "image":
                        if(b != null)
                            b.setImage(parser.nextText());
                        break;
                    case "author":
                        if(b != null)
                            b.setAuthor(parser.nextText());
                        break;
                    case "price":
                        if(b != null)
                            b.setPrice(parser.nextText());
                        break;
                    case "discount":
                        if(b != null)
                            b.setDiscount(parser.nextText());
                        break;
                    case "publisher":
                        if(b != null)
                            b.setPublisher(parser.nextText());
                        break;
                    case "pubdate":
                        if(b != null)
                            b.setPubdate(parser.nextText());
                        break;
                    case "isbn":
                        if(b != null)
                            b.setIsbn(parser.nextText());
                        break;
                    case "description":
                        if(b != null)
                            b.setDescription(parser.nextText());
                        break;
                    }
                     
                }
                }
                eventType = parser.next();
            }
             
             
             
             
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
    }
cs

1
2
NaverBookSearchService service = new NaverBookSearchService(keyword);
service.search();
cs

search메소드는 네트워크 통신을 사용하기 때문에 UI쓰레드에서 직접 호출할 수 없음, 파생쓰레드를 만들어서 호출해야 하고 파생쓰레드가 얻어낸 데이터를 UI쓰레드로 가져오려면 UI(메인)쓰레드의 핸들러가 필요하다.

UI(메인)쓰레드는 파생쓰레드가 받아온 데이터를 전달 받았을 때 UI에 반영하는 코드를 Handler클래스를 상속받아 handleMessage에 구현, 파생쓰레드는 네트워크 통신을 통해 얻은 데이터를 UI쓰레드에게 전달해주기 위해서 UI(메인)쓰레드의 Handler객체에 대한 참조 필요

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
    private Handler handler =  new Handler(){
 
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            //what이 1이면 NaverBookSearchThread가 보내는 데이터 인걸로
            if(msg.what == 1)
            {
                //arg1이 100이면 처음 검색에 대한 결과를 갖다 준걸로
                if(msg.arg1 == 10)
                {
                    String result = "";
                    List<Book> data = (List<Book>)msg.obj;
                    for(Book b : data)
                        result += b + "\n";
                    Toast.makeText(MainActivity.this, result, 0).show();
                }
                //arg1이 20이면 검색했던 결과에 대해 추가 아이템을 요청한걸로
                else if(msg.arg1 == 20)
                {
                    
                }
            }
        }
        
    };
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class NaverBookSerachThread extends Thread{
    private NaverBookSearchService service;
    private Handler handler;
    
    public NaverBookSerachThread(NaverBookSearchService service, Handler handler)
    {
        this.service = service;
        this.handler = handler;
    }
 
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        
        //service의 search메소드를 수행하고 결과를 핸들러를 통해 메인에게 전달
        List<Book> data = service.search();
    }
    
}
cs

1
2
3
4
5
    public int getCurrentSkip(){
        return currentSkip;
        //nextPage함수가 한번이상 불려서 currentSkip이 1이 아니면
        //처음 검색이 아니고 아이템 추가
    }

c
s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        
        //service의 search메소드를 수행하고 결과를 핸들러를 통해 메인에게 전달
        List<Book> data = service.search();
        
        Message msg = handler.obtainMessage();
        msg.what = 1;
        msg.obj = data;
        if(service.getCurrentSkip() == 1)
            msg.arg1 = 10;
        else                //첫 검색인지 아닌지 구분
            msg.arg1 = 20;
        handler.sendMessage(msg);
    }
cs

1
2
3
4
5
6
7
8
9
10
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String keyword = keywordEdt.getText().toString();
                NaverBookSearchService service = new NaverBookSearchService(keyword);
//                service.search();
                NaverBookSerachThread thread = new NaverBookSerachThread(service, handler);
                thread.start();    
 
            }
        });
cs


리스트뷰 작성

getView할일

1. 껍데기 인플레이션하기(convertView가 null이 아니면 재사용 가능)

2. 껍데기 내부의 위젯들 객체 얻어오기 (findViewByid)

3. 각 위젯에 데이터 바인딩하기

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
public class BookAdapter extends ArrayAdapter<Book>{
    private Context context;
    private int resource;
    private List<Book> bookList;
    
    public BookAdapter(Context context, int resource, List<Book> bookList) {
        super(context, resource, bookList);
        this.context = context;
        this.resource = resource;
        this.bookList = bookList;
    }
 
    static class BookViewHolder{
        public ImageView imageView;
        public TextView titleTv;
        public TextView priceNpub;
        public TextView authorNpubDate;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
//        return super.getView(position, convertView, parent);
 
        //getView메소드는 리스트뷰의 한줄의 아이템을 그리기 위한 뷰를 만들어내는 함수이고
        //한줄의 아이템에 대해서 UI를 인플레이션하고 그 객체를 리턴하면됨
        BookViewHolder holder;
        if(convertView == null)
        {
            //이미 인플레이션 한 뷰가 있다면 매개변수 convertView에 들어와 재사용 가능하닌까
            //convertView가 null일때만 인플레이션 해줌
            LayoutInflater inflater
            = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.list_item, parent, false);
            //처음 인플레이션 될 때 홀더객체를 만들어서 홀더 셋트의 위젯 참조변수들에 findViewById
            holder = new BookViewHolder();
            holder.imageView = (ImageView) convertView.findViewById(R.id.list_img);
            holder.titleTv = (TextView) convertView.findViewById(R.id.list_tv_title);
            holder.priceNpub = (TextView) convertView.findViewById(R.id.list_tv_price_and_publisher);
            holder.authorNpubDate = (TextView) convertView.findViewById(R.id.list_tv_author_and_pubdate);
            
            //holder객체는 각 위젯들의 findViewById한 결과들 집합이다.
            convertView.setTag(holder);
        }
        else
        {
            holder = (BookViewHolder) convertView.getTag();
        }
        Book book = bookList.get(position);
        //여기까지 이제 홀더객체 안의 각 위젯에 book객체의 각 멤버변수값들이랑 바인딩하면 된다.
        holder.imageView.setImageResource(R.drawable.ic_launcher);
        holder.titleTv.setText(book.getTitle());
        holder.priceNpub.setText(book.getPrice() +"원\t출판사 : "+book.getPublisher());
        holder.authorNpubDate.setText("저자 : "+ book.getAuthor() + "\t출판일 : " + book.getPubdate());
        return convertView;
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MainActivity extends Activity {
    private EditText keywordEdt;
    private Button searchBtn;
    private ListView listView;
    private BookAdapter adapter;
    private List<Book> bookList;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        keywordEdt = (EditText) findViewById(R.id.main_edt_search);
        searchBtn = (Button) findViewById(R.id.main_btn_search);
        listView = (ListView) findViewById(R.id.main_listView);
        bookList = new ArrayList<Book>();
        adapter = new BookAdapter(this, R.layout.list_item,bookList);
        
        listView.setAdapter(adapter);
cs

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
    private Handler handler =  new Handler(){
 
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            //what이 1이면 NaverBookSearchThread가 보내는 데이터 인걸로
            if(msg.what == 1)
            {
                //arg1이 10이면 처음 검색에 대한 결과를 갖다 준걸로
                if(msg.arg1 == 10)
                {
//                    String result = "";
//                    List<Book> data = (List<Book>)msg.obj;
//                    for(Book b : data)
//                        result += b.getTitle() + "\n";
//                    Toast.makeText(MainActivity.this, result, 0).show();
                    bookList.clear();
                    bookList.addAll((List<Book>) msg.obj);
                    adapter.notifyDataSetChanged();
                }
                //arg1이 20이면 검색했던 결과에 대해 추가 아이템을 요청한걸로
                else if(msg.arg1 == 20)
                {
                    
                }
            }
        }
        
    };
cs




1
    <uses-permission android:name="android.permission.INTERNET"/>
cs

' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day103  (0) 2016.08.17
Day102 안드로이드  (0) 2016.08.11
Day99 안드로이드 파일 복사  (0) 2016.08.08
Day98_2 안드로이드 OpenHelper  (0) 2016.08.05
Day98 안드로이드 db Select문  (0) 2016.08.05
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class PersonAdapter extends ArrayAdapter<Person>{
 
    //BaseAdapter가 리스트뷰의 어뎁터가 되기 위한 기본 부모클래스이지만 
    //관리하는 데이터가 배열에 특화되있는 어레이어뎁터를 상속받는게 작업이 쉽다.
    
    private Context context;
    private int resource;
    private List<Person> personList;
    
    public PersonAdapter(Context context, int resource, List<Person> objects) {
        super(context, resource, objects);
        // TODO Auto-generated constructor stub
        this.context = context;
        this.resource = resource;
        this.personList = objects;
    }
        
}
cs


1
2
 //BaseAdapter는 추상클래스, 어뎁터로서의 동작에 대한 템플릿은 구현되 있지만
 //getView, getItem, getItemPosition등등.. 핵심동작은 사용자가 상속받아서 정의해야됨
cs

ArrayAdapter는 바로 사용가능한 완성폼

getView만 우리 뷰에 맞게 재정의하면됨

1
2
3
4
5
6
7
8
9
10
11
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
//        return super.getView(position, convertView, parent);
        if(convertView == null)
        {
            LayoutInflater inflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(resource, parent, false);
        }
        return convertView;
    }
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        callIv.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + person.getPhoneNum()));
                //<uses-permission android:name="android.permission.CALL_PHONE"/>
                //manifest에서 권한추가
                context.startActivity(intent);   전화걸기
            }
        });
        smsIv.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {                 문자 창으로 가기
                // TODO Auto-generated method stub
                Intent sendIntent = new Intent(Intent.ACTION_VIEW);
                sendIntent.putExtra("address", person.getPhoneNum());//받는사람
                sendIntent.setType("vnd.android-dir/mms-sms");
                context.startActivity(sendIntent);
            }
        });
cs


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day98 안드로이드 db Select문  (0) 2016.08.05
Day97  (0) 2016.08.04
Day94 안드로이드 listview  (0) 2016.08.02
Day93 AlertDialog  (0) 2016.07.29
Day92  (0) 2016.07.28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void onClick(View v) {
                // TODO Auto-generated method stub
                String phoneNum = phoneNumEdt.getText().toString();
                String msg = msgEdt.getText().toString();
                Intent intent = new Intent(MainActivity.this, AnotherActivity.class);
                intent.putExtra("phoneNum", phoneNum);
                intent.putExtra("msg", msg);
//                startActivity(intent);//액티비티 그냥 호출
                startActivityForResult(intent, 1001);
                //호출하는 엑티비티로부터 응답을 받기 위해 코드를 지정해서 호출
                //호출했던 엑티비티가 종료되고 이 엑티비티로 돌아올때 ↓
            }
        });        //호출할때 지정해줬던 코드값이 requestCode파라미터에 들어오면서
    }            //onActivityResult함수가 호출됨
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1001)
        {
            Toast.makeText(this"Another로부터 돌아옴"0).show();
        }
    }
cs



1
2
3
4
5
6
7
Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        String phoneNum = bundle.getString("phoneNum");
        String msg = bundle.getString("msg");
        Log.d("DEVEL", phoneNum);
        Log.d("DEVEL", msg); //log에서 확인하는 방법
//배포할때는 지우기
    }

cs



1
2
3
setContentView(R.layout.activity_another);
        //매개변수로 받은 레이아웃 xml자원에 따라 모든 위젯을 객체화하고 + 
        //화면에 그리는 역할
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ok_btn.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                setResult(RESULT_OK);  // 현재 엑티비티를 호출했던 엑티비티로 돌아갈때 결과 코드를 세팅함
                finish();               // 해당 상수는 Activity클래스에 정의되 있는 상수이고 맘대로 아무 숫자나 써도됨
            }    //엑티비티를 종료시키는 메소드
        });
        cancel_btn.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                setResult(RESULT_CANCELED);
                finish();
            }
        });
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1001){
            if(resultCode == RESULT_OK)
            {
                Toast.makeText(this"Another로부터 확인으로 돌아옴"0).show();
            }
            if(resultCode == RESULT_CANCELED)
            {
                Toast.makeText(this"Another로부터 취소로 돌아옴"0).show();
            }
        }
    }
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//폰번이랑 문자내용으로 이뤄진 모델클래스를 만들어서
//하나의 객체로 묶어서 인텐트에 실어 보냅시당
public class SmsMsg {
    private String phoneNum;
    private String msg;        
    public String getPhoneNum() {
        return phoneNum;
    }
    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    
    
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
public class SmsMsg implements Parcelable{
 
    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // TODO Auto-generated method stub
        dest.writeString(phoneNum); dest.writeString(msg);
    }
}
cs


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
//편의를 위해 만든 메소드의 이름이 꼭 이형태일 필요는 없음
    public void readFromParcel(Parcel parcel)
    {
        phoneNum = parcel.readString();
        msg = parcel.readString();
    }
    
    public SmsMsg(){
        
    }
    public SmsMsg(Parcel parcel){
        readFromParcel(parcel);
    }
    public static final Parcelable.Creator<SmsMsg> CREATOR = new Creator<SmsMsg>() {
        
        @Override
        public SmsMsg[] newArray(int size) {
            // TODO Auto-generated method stub
            return new SmsMsg[size];
        }
        
        @Override
        public SmsMsg createFromParcel(Parcel source) {
            // TODO Auto-generated method stub
        //매개변수로 넘어온 Parcel객체로부터 순서대로 읽어서 각각 멤버에 세팅하고 만든 모델객체를 리턴    
//            SmsMsg data = new SmsMsg();
//            data.setPhoneNum(source.readString());
//            data.setMsg(source.readString());
//            return data;
            
            return new SmsMsg(source);
        }
    };
cs

1
2
3
4
5
6
7
8
9
10
11
12
String phoneNum = phoneNumEdt.getText().toString();
                String msg = msgEdt.getText().toString();
                Intent intent = new Intent(MainActivity.this, AnotherActivity.class);
                SmsMsg smsMsg = new SmsMsg();
                smsMsg.setPhoneNum(phoneNum);
                smsMsg.setMsg(msg);
                intent.putExtra("SmsMsg", smsMsg);
                
//                intent.putExtra("phoneNum", phoneNum);
//                intent.putExtra("msg", msg);
//                startActivity(intent);//액티비티 그냥 호출
                startActivityForResult(intent, 1001);
cs

1
2
3
4
5
6
7
8
Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
//        String phoneNum = bundle.getString("phoneNum");
//        String msg = bundle.getString("msg");
        SmsMsg smsMsg = (SmsMsg) bundle.get("SmsMsg");
        
        phoneNum_View.setText("전화번호 : " + smsMsg.getPhoneNum());
        main_msg_View.setText("메시지 내용\n"+smsMsg.getMsg())
cs


버튼클릭이벤트 다른방법

1
2
3
    public void registerBtnClick(View v){
        Toast.makeText(this"이벤트 처리 이렇게도 되징"0).show();
    }
cs


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day92  (0) 2016.07.28
Day91  (0) 2016.07.27
Day89 안드로이드 엑티비티 전환  (0) 2016.07.25
Day88  (0) 2016.07.22
Day87  (0) 2016.07.21

https://www.iconfinder.com/

아이콘이미지가 필요할때!


사진을 어플에서 사용하려면 사진을 res폴더 drawble에 넣어둬야하고 

사진의 이름이 사진의 식별자가 되고 식별자는 소문자나 숫자로만 이뤄져있어야됨


사진을 뷰로 표현하는 위젯은 ImageView고 원하는 사진을 src속성에 지정


기본적으로 사진은 영역에 맞게 축소/확장됨

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
<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="${relativePackage}.${activityClass}" >
 
    <ScrollView 
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4"
        > 수직스크롤
    <HorizontalScrollView 
        수평 스크롤
        >
        
    </HorizontalScrollView>    
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/bas" />
    </ScrollView>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="horizontal" >
 
    <ImageView 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@drawable/ud"/>
    </LinearLayout>
    
    <ScrollView 
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4"
        >        
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/har" />
    </ScrollView>
</LinearLayout>
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this"얍!"0).show();
                if(count == 0){
                    iv1.setImageResource(R.drawable.har);
                    iv2.setImageResource(R.drawable.bas);
                    count = 1;
                    }
                else{
                    iv1.setImageResource(R.drawable.bas);
                    iv2.setImageResource(R.drawable.har);
                    count = 0;
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this"얍!"0).show();
                
                Drawable tmp = iv1.getDrawable();
                
                if(tmp.equals(iv1.getDrawable())){
                    iv1.setImageDrawable(iv2.getDrawable());
                    iv2.setImageDrawable(tmp);
                }
                else{
                    iv2.setImageDrawable(iv2.getDrawable());
                    iv1.setImageDrawable(tmp);
                }
            }
cs



1
2
3
4
5
6
7
8
9
10
    <EditText
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4"
        android:textColor="#0c64cf"
        android:maxLength="80"
        android:id="@+id/edit"
        android:gravity="top"
        
        ></EditText>
cs


1
2
3
4
    public void onClick(View v) {
                // TODO Auto-generated method stub
                finish(); //현제 엑티비티 종료
            }
cs

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
        edit.addTextChangedListener(new TextWatcher() {
            String str;
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub
                try {
                    int length = edit.getText().toString().getBytes("KSC5601").length;
                    text.setText(length + "/80Bytes");
                    if(length > 80)
                        edit.setText(str);
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }                
            }
            
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // TODO Auto-generated method stub
                str  = s.toString();
                
 
            }
            
            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
            }
 
        });
cs


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day89 안드로이드 엑티비티 전환  (0) 2016.07.25
Day88  (0) 2016.07.22
Day86  (0) 2016.07.20
Day85 안드로이드 액티비티  (0) 2016.07.19
Day84 안드로이드  (0) 2016.07.18

액티비티 만들기

1. 액티비티를 상속받는 자바클래스 작성

2. MainFest에 액티비티를 등록

3. 액티비티가 사용할 레이아웃xml파일 작성(옵션)

4. 1의 onCreate메소드에서 3파일을 뷰로 연결.


R.java -> 안드로이드에서 사용하는 자원들을 자바코드에서 참조할 수 있도록 참조값을 갖는 연결고리

R.java는 어플리케이션의 패키지명으로 지정된 패키지 경로에 자동생성됨 (자원등록 중 에러가 발생하면 생성되지 않음)


액티비티가 속한 패키지명도 어플리케이션의 패키지명과 동일하게 한다

[장점]

1. R.java랑 같은 패키지에 위치해서 R클래스를 따로 임포트 해주지 않아도 됨

2. Manifest에 액티비티 등록할때 패키지명 생략가능

3. 1,2는 패키지 구조 복잡도가 올라가면 다시 분리 되겠지만 코드관리를 위해



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="패키지명"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="20" />
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity"></activity>
                              .으로 시작하면 앞에 어플의 패키지명 
    </application>
 
</manifest>
cs

activity태그는 필수로 name속성을 가져야하고 name속성의 값에는 사용할 자바 클래스 파일(Activity를 상속받은)을 지정해야 됨

엑티비티는 어플리케이션의 구성요소이자 하나의 화면단위이고 명령처리흐름을 갖음

어플리케이션은 최소 하나의 메인엑티비티를 가져야하고 메인엑티비티가 되는 녀석을 Intent-filter에 메인속성과 런처 속성을 가져야됨


1
2
3
4
            <intent-filter >
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
cs



7
8
9
10
public class MainActivity extends Activity{
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
 
cs

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"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="안녕 안드로이도"
        android:id="@+id/tv"
        /> id 만들어놓기
    <button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="버튼이닷"
        android:id="@+id/btn"
        />
</LinearLayout>
cs

1
2
   TextView tv =(TextView) findViewById(R.id.tv);
   Button btn = (Button) findViewById(R.id.btn);
cs

xml에 정의한 UI 위젯의 참조값 얻기

1
2
3
4
5
6
7
8
9
        btn.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                tv.setText("Bye Android");
                
            }
        });        
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="나이를 입력하세요" />
 
    <EditText
        android:id="@+id/num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="numberSigned" />
 
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="버튼" />
 
    <TextView
        android:id="@+id/age"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends Activity{
    private EditText inputAge;
    private Button btn;
    private TextView result;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        inputAge = (EditText) findViewById(R.id.num);
        btn = (Button) findViewById(R.id.btn);
        result = (TextView) findViewById(R.id.age);
        //지금은 이름을 대충 지었는데 id값들은 신중하게 잘 지어야됨 
        //모든 xml파일에서 하나의 id 네임스페이스를 사용함
        
cs


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day89 안드로이드 엑티비티 전환  (0) 2016.07.25
Day88  (0) 2016.07.22
Day87  (0) 2016.07.21
Day86  (0) 2016.07.20
Day84 안드로이드  (0) 2016.07.18

안드로이드 개발환경 구축하기

- JDK가 설치

- Android SDK(안드로이드 개발 라이브러리 준비)

->SDK Manager프로그램을 통해 다운로드할 수 있음

- IDE(통합개발환경) 설치 (안드로이드 스튜디오, 이클립스)

- 테스트 실행환경 준비 (기본 가상머신, 지니모션, 블루스택, 진짜 핸드폰 등등...)


통합개발환경을 이클립스로 사용하는 경우에는...

SDK와 이클립스간 연동과 각종 안드로이드 문법 인식을 위해 플러그인(안드로이드ADT)을 설치해줘야 됨


안드로이드 스튜디오는 인텔리제이를 기반으로 구글에서 안드로이드 전용 개발툴로 배포중


Android Developers

https://developer.android.com/
이 페이지 번역하기
The official site for Android developers. Provides the Android SDK and documentation for app developers and designers.

패키지네임이 같은 어플 두개는 같은 폰에 설치안됨

그러닌까 유일한 패키지네임으로 작성하셔야 마켓에 런칭도 가능 ㅇ


액티비티는 안드로이드 어플리케이션의 구성요소(주요한)로써 하나의 화면단위이기도 하고 명령처리흐름이기도 한다.



AndroidManifest.xml

어플에 대한 전반적인 설정파일, 어플리케이션 구성요소 등록, 권한정보...



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<resources>
 
    <string name="app_name">HelloWorld</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    
<!--     상수들은 res에 등록해놓고 사용하기를 권장 -->
string_ko.xml
string_en.xml
이런식으로 언어별 문자열상수들을 여러개 등록하고
 
Ko버전의 app_name에는 안녕친구야
En버전의 app_name에는 HelloBro라고 해두면 
실행되는 환경의 언어설정에 맞는 문자열이 사용됨ㅇㅇ
</resources>
 
cs


activity_main.xml

1
2
3
4
5
6
7
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
<!--     Layout태그는 UI의 컨테이너 태그(자바의 패널이나 프레임같은 친구) -->
<!-- 화면 구성요소 중 자바로 치면.. 레이블 HTML로 치면 인풋 타입 텍스트 리드온리 에 해당하는 요소 (안드로이드에서는 위젯) -->
</RelativeLayout>
cs


MainActivity.java

1
2
3
4
5
6
7
8
public class MainActivity extends Activity {
 
    @Override //엑티비티가 만들어질때 호출되는 함수
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Resource중 layout에 있는 activity_main을 이 엑티비티의 화면으로 사용
    }
cs



' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day89 안드로이드 엑티비티 전환  (0) 2016.07.25
Day88  (0) 2016.07.22
Day87  (0) 2016.07.21
Day86  (0) 2016.07.20
Day85 안드로이드 액티비티  (0) 2016.07.19

+ Recent posts