이번에는 Activity 를 새로 만들고, 만든 Activity 를 시작하는 방법에 대해 알아본다.

Android 는 Activity 를 시작시킨 때 Intent 를 기반으로 하여 시작시킨다. 이 Intent 에 메인 뷰의 EditText 로 입력받은 String 을 추가하여 새로 만든 Activity 를 시작할 때 넘겨주고, Activity 는 TextView 를 포함하는 Layout (ViewGroup)을 통해 전달받은 메시지를 표시해주는 방식이다.

▌버튼 눌렸을 때 호출 될 메소드 정의하기

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage"/>


▌새로운 Activity 실행위한 Intent 생성하기

public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class)// Intent 를 신규 생성, DisplayMessageActivity 를 실행하기 위한 Intent 를 생성함
    EditText editText = (EditText) findViewById(R.id.edit_message)// 현재 Activity 의 OnCreate 에서 처리된 Bundle 의 XML 내에 있는 id 값에 해당하는 View 를 가져옴
    String message = editText.getText().toString()// EditText 의 값 가져옴
    intent.putExtra(EXTRA_MESSAGEmessage)// EXTRA_MESSAGE 를 Key 로 하고 내용을 message 로 하는 데이터를 Intent 에 추가 함. Key-Value Pair 의 extra 를 Intent 에 추가함
    startActivity(intent);
}

public final static String EXTRA_MESSAGE "com.goodjoon.helloandroid.MESSAGE";


▌Activity 추가를 위한 과정

  1. Activity XML 생성
  2. strings.xml 에 Activity Title 추가
  3. Content XML 생성
  4. Android Manifest 에 Activity 등록
  5. Activity 클래스 작성

▌신규 Activity 추가 - Studio 의 New Activity 기능 사용하여 추가하기


원하는 Package 에서 우측클릭>New>Activity>Blank Activity 를 눌러서 Activity 를 추가한다.


Activity 이름을 주고, 중간의 Hierarchical Parent 에서 "..." 을 눌러 메인 Activity 인 HelloActivity 를 선택한다.


Hierarchical Parent

Activity 를 추가할 때 Hierarchical Parent 를 주면, 기본적인 Navigation 동작이 추가된다. up Navigation 버튼이 Navigation Bar 에 추가되고, Back 버튼을 눌렀을 때 Parent Activity 가 호출되는 등의 Action 이 실행된다.

<androidManifest.xml> 내용 중
<activity
    android:name=".DisplayMessageActivity"
    android:label="@string/title_activity_display_message"
    android:parentActivityName=".HelloActivity"
    android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.goodjoon.helloandroid.HelloActivity" />
</activity>

위에서 android:parentActivityName=".HelloActivity" 가 추가된 것을 볼 수 있다.
나중에 수동으로 Activity 를 추가하면 저렇게 parentActivity 를 주면 된다.

위 과정으로 추가하면

  1. Activity XML 생성
  2. Content XML 생성
  3. AndroidManifest.xml 에 Activity 등록
  4. string.xml 에 Activity Title 등록
  5. Activity 클래스 추가

와 같은 과정이 자동으로 실행된다

  1. Activity XML 생성


  1. Content XML 생성

Content XML 이 생성되면 아래와 같이 RelativeLayout 요소의 마지막에 android:id="@+id/content" 를 하여 id 를 하나 부여해주어 Code 에서 findViewById() 로 쉽게 Layout 을 갖고오게 하자.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    ...
    android:id="@+id/content">


  1. Activity 클래스에서 메시지 받아 출력해주기

TextView 뷰를 하나 추가하고, Intent 의 Message 를 TextView 에 출력하도록 할 것이다.
Layout XML 에 추가하는 방법 말고, Activity 클래스에서 코드로 추가하는 방법으로 해본다.

일단, 자기 Activity 를 실행시킨 Intent 내에 Extra 데이터(메시지)를 가져오고,
TextView 뷰를 생성한 다음, 이 뷰를 Layout 을 가져와 그 Layout 에 추가하는 작업을 한다.

코드는 아래와 같다. 자동 생성된 Activity 클래스의 onCreate 의 하단에 해당 내용을 추가하면 된다.
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_display_message);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view"Replace with your own action"Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    // Activity 는 자신을 시작시킨 Intent 를 가져올 수 있음
    // Intent 에서 메시지를 가져오도록 함
    Intent intent = this.getIntent();
    String message = intent.getStringExtra(HelloActivity.EXTRA_MESSAGE);

    // TextView Object 를 만든다
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // 만들어진 TextView 를 RelativeLayout 에 붙인다
    RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
    layout.addView(textView);

}


▌실행 결과

 


실행 결과는 위와 같다. 텍스트를 입력하고 "보내기" 버튼을 누르면 Intent 를 생성하여 ExtraData 로 Message 를 추가하고, DisplayMessageActivity 를 생성한 Intent 로 시작시킨다.(실행 보다는 '시작' 이 적합한 단어라고 생각한다)










반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
 Auto Completion, Code Assist, Code Suggestion, Parameter Info 등등의 이름으로 불리우는 자동 완성 기능. Visual Studio 와 Visual AssistX 플러그인은 아마 현존 최고의 Assist 기능이 아닐까 생각된다. 

 XCode 의 자동완성 기능도 매우 훌륭한 편이며, Eclipse 또한 많이 괜챦아졌다. IntelliJ 를 기반으로하는 Android Studio 의 자동완성 기능이 어느정도일지 궁굼했는데, 잠깐 사용해본 결과 Eclipse 보다는 낫다는 생각이다. ^^

□ TIP - Auto Completion 관련한 단축키들

Auto Completion / Suggestion / Assist 기능들은 IDE 를 쓰는 큰 이유중의 하나이다. Android Studio 는 IntelliJ 기반의 IDE 이며, 아래와 같은 기능들을 제공한다.

- ALT+Enter (Show Intention Action)
Import 되지 않은 클래스를 Import 하려면 이 키를 사용한다. 매우 자주 사용하는 키 이다. 클래스 import 이외에도, 현재 상황에서 무언가 의도한 액션을 수행하고자 하면 가능한 액션들이 보여진다.
단순히 import 를 편하게 하려면 Settings... 메뉴에서, Editor>General 의 Auto Import 기능에서 on the fly 기능들을 켜놓으면 즉시 Import 되도록 할 수 있다.


- Ctrl+Q (Quick Documentation)
현재 Caret 이 위치한 Class 나 method 의 Document 를 보여준다.


- Ctrl+P (Parameter Info)
현재 Method 의 파라미터 정보를 보여준다. Overload 된 Method 의 Parameter Info 까지 모두 한눈에 볼 수 있어서 편리하고 자주쓰는 기능이다.


- Ctrl+Space (Basic Completion)
Basic Auto Completion 기능으로, 입력중인 내용의 자동완성 목록을 보여준다. 가장 많이 쓴다.
그런데 불행하게도 한글 키보드를 쓰는 나같은 경우는 Ctrl+Space 가 "한자" 기능에 키보드 맵핑이 되어있어 이 Basic Completion 기능이 동작하지 않는다. 그래서 나같은 경우는 Ctrl+, 로 변경해서 사용중이다.


- Shift+Ctrl+Space
SmartType Auto Completion 기능으로, Basic Auto Completion 대비 현재 Context 에 더욱 맞는 Type Completion List 를 보여준다는데, 아직까지는 잘 사용하지 않고있다. 향후에 많이 써보면서 더 알아보도록 하겠다.




□ 주의 - 자동으로 import 가 갱신되지 않을 때, 즉시 자동으로 Import 되도록 하는 방법

Eclipse 플러그인으로 동작하던 때에는 사용하는 클래스에 따라 자동으로 import 문도 optimize 해주고 했었는데, 이상하게 Android Studio 는 Optimize Import (Ctrl+Alt+O) 를 눌러도 자동으로 Import 를 시켜주지 않는다.
이럴때에는 Settings... 메뉴에서, 아래 두개 옵션을 체크해주면 일단 해결된다.


이상 단축키와 관련 메뉴에 대해서 살펴보았다. 필요한 때에 적절하게 단축키를 눌러서 생산성 있는 개발이 되도록 하자~


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
 Ethereum 의 Github 를 가보면 매우 많은 프로젝트들이 Repository 에 올라와 있는게 보이고, 매우 복잡하게 느껴진다.

 그러나 업데이트 안하고 있는 프로젝트나 다른 프로젝트의 Sub Module 들이 많이 섞여있는 상태이므로 자꾸 왔다갔다 하다보면 별로 복잡하게 느껴지지 않는다.

주요 프로젝트들에 대해서 간단히 설명해본다.

yellowpaper

The "Yellow Paper": Ethereum's formal specification

Vitalik Buterin 이 White Paper 를 쓰고있고, Ethereum 의 사상의 기술적인 Spec 이라고 할 수 있는 Yellow Paper 를 Gavin Wood 가 쓴다. 이 Yellow Paper 는 얼핏 보면 수학공식 같아 보이지만, 말로 표현할때의 해석의 모호성을 줄이기 위해 수학적인 기호를 차용한 정도이다. 복잡한 수식은 없으며 대부분 집합 기호를 통해 개념을 설명한다.

Ethereum 의 중요 개념인 Block, State/State Transition, Transaction, Gas, Contract 등에 대한 동작 방식을 정의해놓았다. Ethereum 내부의 개발자들은 이 Yellow Paper 를 보고 구현한다고는 하지만 사실 이 내용만 보고 그들의 사상을 구현하기에는 부족한 부분들이 매우 많다. 통신, 마이닝, 로직의 흐름 등은 설명되어 있지 않으므로 설계서 보다는 핵심 사상의 정의 수준이라고 해야 하겠다.

go-ethereum

Official golang implementation of the Ethereum protocol

나도 2014년 말 Ethereum 을 접하면서 Go 언어라는것을 처음 알게 되었다. Go 언어는 Chrome 의 V8 엔진 개발에 참여하고 Java Hotspot 컴파일러를 개발한 Robert Griesmer, UTF-8 과 분산 운영체제를 개발한 Rob Pike, UNIX 의 창시자라 불리는 Ken Thompson, 프로그래밍 천재라는 Russ Cox 등의 천재들이 만들어낸 매우 간결하지만 강력한, Google 이 만들어낸 걸작의 언어이다. Ethereum 의 공식 구현체 중 가장 빠르게 버전업이 되는 구현체이며, DApp 클라이언트 플랫폼으로 Go Ethereum (Geth) 를 공식화 하고있다. 코드도 매우 깔끔한 편이다.

webthree-umbrella

The umbrella project for all of C++ Web Three implementation

작년까지만 해도 C++ Ethereum 으로 불리우던 cpp-ethereum 프로젝트가 있었는데, 이 프로젝트가 webthree-umbrella 라는 이름으로 바뀌었고 git repository 구조도 바뀌게 되었다. Ethereum 의 공식 구현체이며 Repository 내 많은 submodule 들이 이 프로젝트에 dependecy 로 참조되고 있다. 나도 비록 근래에는 Java 기반의 Enterprise S/W Architect 를 했지만 2000년 부터 7년 간을 C++ 을 했었기에 주로 이녀석을 분석했었는데, 처음 코드를 보면서 "이게 뭔 C++ 이야?" 라는 생각이 들었는데, boost 라이브러리들을 많이 사용하고, C++ '11 스펙을 사용하는 관계로 C++ 98 스펙에 익숙했던 나에게는 해석에 참 많은 시간이 필요로 하게 하였다. Gavin Wood 의 해커끼(?) 보이는 코드의 복잡함들도 더러 보이며 TrieDB 쪽은 특히 Template Class를 꼬아서 쓰기때문에 해석 중에 컨텍스트를 잃어버리는 경우도 생겼다. 버그도 많은편이고 코드 복잡성은 Top 수준이다. Ethereum 은 C++ Ethereum 을 Backend 용으로 적합하고 Go 보다는 좀더 나은 성능을 원하는 경우에 사용할것을 권고한다. 비교적 자주 업데이트 되는 편이지만 작년 기준으로는 Go 대비 한발 늦는 개발 진행 때문에 Geth 와 함께 코드를 보는 경우도 있었다.

pyethapp

 forked from heikoheiko/pyethapp

이름에서 보이듯이 Python 기반의 프로젝트이다. Ethereum 은 Pyethapp 은 "학습" 목적으로 단정짓는다. (사실 작년 Frontier 발표 전에는 그런 말도 안보이더니..) 성능과 기능 보다는 Ethereum 의 동작 원리를 이해하고 분석하는데에 사용할것을 권고하고 있다. Python 은 언어도 쉬운편이니 Ethereum 의 핵심 메커니즘 맛보기 수준 정도를 원한다면 이녀석으로 시작해보는것도 괜챦을 듯 하다. 상세한 코드 주석이 세심한 배려심을 드러내고있다.

Java implementation of the Ethereum yellowpaper

작년에 파일럿 시스템을 만들 때 codebase 로 활용했던 녀석이다. 지금와서 보면 참 후회스러운 선택이었지만 일단 작년 5~6월 정도에는 매우 Simple 한 코드와 Java 의 간결성 때문에 이녀석을 선택했었다. 그러나 C++ ETH (eth) 와 Geth 대비 확연히 떨어지는 구현도를 보였으며, 심지어 Miner 는 불과 며칠 전에 Homstead Prerelease 버전인 1.1.0 버전에서야 추가 되었다. 공식 구현체가 아니므로 너무 큰 기대는 하지 않는게 상책이지만 요즘은 어떤지 확인이 한번 필요하기도 하다.

alethzero

The AlethZero Hardcore Ethereum Client

C++ Team 이 개발하고 있는 일종의 Debug 툴이다. eth 를 테스트하기에 충분한 기능들이 들어가있고, Qt 기반의 GUI 로 Tx 을 날리거나 Block, Peer, Node, Tx, Contract Code 실행, Mining 상태 등을 보여준다. C++ 팀의 주력 개발 Client 라 보면 된다. 단 Mist 와 같은 DApp Client 가 아니고, eth 의 동작을 테스트하는 목적으로 보면 되는 클라이언트이다. 

mix

The Mix Ethereum Dapp Development Tool

Mix 는 공식적인 Ethereum 의 DApp 개발도구이다. HTML/CSS/JavaScript 기반으로 DApp 을 만들고, Smart Contract 를 개발할 수 있도록 되어있다. Contract Code 를 개발하고 컴파일하고 검증할 때 사용하면 좋으며, 아래 Mist 에서 실행되는 DApp 은 Mix 로 개발하는게 순서상 맞다.

mist

Mist browser

Mist 는 Go 언어로 Go 개발팀이 만들고 있는 일반 End-User 용 Ethereum Client 이다. DApp 을 구동하는 플랫폼이며, Browser 와 유사한(내부적으로 Web View 를 갖는) 클라이언트이다. 웹 엔진과 Geth 가 통합된 형태라고 보면 되며, 향후 Light Weight Client 는 이 mist 형태로 일반 유저에게 배포될 것이다.

solidity

The Solidity Contract-Oriented Programming Language

Solidity, Serpent, LLL 은 Smart Contract 를 기술하는 언어이다. Solidity 는 C++ 팀이 개발하고 있으며, 현재 가장 잘 만들어진 Smart Contract 구현 언어이다. solc 로 Solidity 코드를 컴파일 하면 EVM Code 가 생성되도록 되어있으며, 요즘은 예제들도 상당히 많이 돌아다니므로 배우기가 더 쉬워졌다. 문법은 JavaScript 와 유사하여 러닝커브도 짧은 편이다.

Serpent 도 Smart Contract 기술 언어중에 하나이다. 문법이 Python 매우 유사하다. Solidity 다음으로 많이 사용되나 요즘은 Ethereum 에서도 Solidity 를 많이 밀고있는 상황이라 상대적으로 Serpent 는 약간 뒤쳐지는 느낌이다.

이외에 LLL 과 Mutan 이 있었는데 LLL 은 Low-Level 언어이며 현재는 더이상 발전시키지 않고있는 언어이다. Mutan 은 훨씬 이전부터 지원하지 않고있다. LLL 은 현재도 사용할 수는 있다. OP Code 의 래퍼 정도로 매우 저수준이기 때문에 간단히 코드 짜서 테스트해보고 디버깅 할때에는 LLL 을 사용할 수도 있다.

web3.js

Ethereum Compatible JavaScript API

Ethereum 의 JavaScript API 이다. 내부적으로는 JSON RPC 를 통해 eth / geth 와 통신한다. Geth/Eth 의 Javascript Console 이나 브라우져, Node.js runtime 에서 사용할 수 있는 API 이다. 특히 이 web3.js 의 spec 을 자주 보게 될것인데, ethereum 의 console 의 명령이 frontier 이전 버전은 Command 방식으로 사용하다가, 아예 Command 는 지양하도록 하며 Console 에서 모든 명령은 이 web3 JavaScript API 를 사용하도록 했기 때문이다.

diary

The Ethereum Developer logs

바로 어제 부터 글이 올라오기 시작한다. 개발일지같은 형태로 올라오는데, 급 외부 사람들과의 Communication 에 신경을 쓰고있다. 신임 C++ Team Leader 인 Christian Reitweissner 의 글을 봐도 커뮤니케이션 열심 하겠다고 하는걸로 봐서 내부적으로 뭔가 일이 있었나보다. 앞으로 자주 들러보게 될 것 같다.

wiki

The Ethereum Wiki -

Ethereum 의 기술적인 부분들은 이제 이 Wiki 로 통합되었다. 이전에는 ethereum/ethereum 프로젝트(리파지토리)에 가이드를 올렸는데, 이제는 ethereum/wiki 프로젝트로 옮겨갔다. 좀더 정리되는것 같은 느낌이 나지만 아직도 각 프로젝트 별 문서는 자체 리파지토리 내의 Wiki 를 사용하는 등 산만함이 완전히 가시지는 않았다.


위와 같이 주요 리파지토리(프로젝트) 들에 대해 알아보았다. 앞으로 블로그에서 저 프로젝트들이 종종 언급될 듯 한데 한번쯤 들어가서 Readme.md 파일이라도 읽어보는게 좋겠다는 생각이다.




반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,