암시적 인텐트로 데이터 공유하기(ShareCompat) - 안드로이드 개발 패턴 시즌2 에피소드6

이미지
출처: 안드로이드 개발자 유튜브 채널   암시적 인텐트를 사용해 데이터를 공유해야 할 경우 데이터 타입, 파일의 수 등을 고려해야한다. 엑스트라로 인텐트에 데이터를 저장해서 데이터를 공유할 수도 있다. 하지만 언급한 여러 고려사항을 처리 하려면 복수의 코드라인을 작성해야한다.   암시적 인텐트를 통해 데이터를 쉽게 공유할 수 있는 헬퍼 클래스인 ShareCompat를 사용하면 데이터 공유를 좀 더 쉽게 할 수 있다. ShareCompat과 내부 클래스인 IntentBuilder를 사용하면 여러 고려사항을 빠르게 처리할 수 있다. 텍스트 공유하기(MIME type: text/plain) Intent shareIntent = ShareCompat.IntentBuilder . from ( activity ) .setType( "text/plain" ) .setText( "shareText" ) .getIntent() ; if (shareIntent.resolveActivity(getPackageManager()) != null ){ startActivity(shareIntent) ; } HTML text 공유하기(MIME type: text/html) Intent shareIntent = ShareCompat.IntentBuilder . from ( activity ) .setType( "text/html" ) .setHtmlText(shareHTMLText) .setSubject( "Subject" ) .addEmailTo( "email address" ) .getIntent() ; if (intent.resolveActivity(getPackageManager()) != null ...

토스트 메시지 빠르게 사라지게 하기

토스트메시지를 연속으로 띄울 때, 아무 조건식 없이 구현하게되면 이전에 띄웠던 토스트 메시지가 빠르게 사라지지 않고 정해진 시간만큼 화면에 남아있게된다. Toast.LENGTH_SHORT으로 duration매개변수를 설정해도 마찬가지다. 이럴 땐, cancel()메서드를 써서 토스트객체가 null이 아닐경우 토스트 뷰를 사라지게 해주면 된다. @Override public void onListItemClick ( int clickedItemIndex) { if ( mToast != null ){ mToast .cancel() ; } String toastMessage = "Item #" + clickedItemIndex + "is clicked." ; mToast = Toast. makeText ( this, toastMessage , Toast. LENGTH_LONG ) ; mToast .show() ; } 위 코드에선 리스트 뷰 내에 구현된 아이템을 클릭할 경우 리스너의 onListItemClick메서드가 실행되도록 하였다.

openConnection()은 네트워크 커넥션을 만들어주지 않는다!

이미지
링크: 안드로이드개발자 홈페이지 openConnection()메서드는 메서드 이름만을 봤을때, 네트워크 접속을 가능하게 해주는 메서드처럼 보인다. 하지만 이 메서드는 실제 네트워크 커넥션을 만들어주는 메서드가 아니다. 단지, http URL connection 인스턴스( URLConnection )를 만들어 리턴시켜주는 역할만을 한다. openConnection()메서드는네트워크 접속과 관련된 매개변수, 속성 등(url, 요청메서드 등)을 조작하게 해주고, 실제 접속은 connect()메서드가 실행되는 시점에서 이뤄지게된다. /** * This method returns the entire result from the HTTP response. * * @param url The URL to fetch the HTTP response from. * @return The contents of the HTTP response. * @throws IOException Related to network and stream reading */ public static String getResponseFromHttpUrl (URL url) throws IOException { HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection() ; try { InputStream in = urlConnection.getInputStream() ; Scanner scanner = new Scanner(in) ; scanner.useDelimiter( " \\ A" ) ; boolean hasInput = scanner.hasNext() ; if (hasInput) { return scanner.next() ; ...

TextView에 글자를 넣어주는 방법(setText, append)

TextView에 글자를 넣어주는 방법은 2가지가 있다. 많이 알려진 setText가 있고, append메서드 역시 사용될 수 있다. 두 메서드의 차이점은 다음과 같다. setText의 경우 메서드가 사용되면, 기존에 TextView에 있던 글자가 사라지고 새로운 텍스트로 대체된다. 반면, append메서드의 경우 기존에있던 text를 덮어쓰지 않고, 텍스트를 추가하게된다.

안드로이드 Min and Target 버전에 대하여

이미지
참고: 유다시티 안드로이드 1.0은 2008년에 출시되었고, 그 이후 총 13번의 주요 릴리즈 업데이트가 있었다. 각 릴리즈는 전통에 따라 달콤한 디저트이름으로 명명되었고, 이름은 알파벳 순서대로 정해졌다. 안드로이드 개발자 사이트 에 들어가면 현재 활성화되어있는 기기에 어떤 플랫폼 버전이 어떤 비율로 돌아가고있는지 확인해 볼 수 있다. 각 플랫폼 버전별 사용자 퍼센티지가 완벽하진 않지만, 종모양의 분포를 보이는걸 확인할 수 있다. x축 좌측에 위치한 오래된 버전의 플랫폼의 점유 퍼센티지가 급격히 낮은 이유는 디바이스의 업그레이드나 교체때문으로 해석할 수 있다. 중간쯤의 플랫폼 버전의 상대적으로 높은 사용자 점유 퍼센티지를 보이는데, 이 버전을 사용하고있는 디바이스는 2년정도 전에 출시된 디바이스이다. 가장 최신의 플랫폼은 출시된지 얼마안된 디바이스이거나 업그레이드를 통해 새로운 버전을 설치한 경우이다. minSDK에 대하여 minSDK는 내가 개발한 앱이 돌아갈수 있는 최소의 SDK버전을 의미한다. 어떤 버전을 선택하던 상관은 없다. 하지만 주의할점은 존재한다. minSDK를 설정하는것은 필터같이 작용하기 떄문이다. 내가 가진 스마트폰의 플랫폼 버전보다 더 높은 minSDK버전을 가진 어플리케이션은 구글플레이(구글 스토어)에 뜨지 않기 때문이다. 그럼 왜 minSDK를 1로 설정하고 개발하지 않는것일까? 최소 SDK버전을 1로 설정하면 누구나 구글스토어에서 나의 앱을 다운받을수 있음에도 불구하고 말이다. 일반적으로 앱 개발자들은 가능한한 많은 사용자를 대상으로 앱을 만든다. 하지만 낮은 버전의 플랫폼을 지원하는덴 비용상의 문제가 발생한다. API가 변경되거나 업데이트됨에 따른 실행 경로 재설정이나 기기별로 상이한 스펙으로 인한 UX변경 등 말이다. 타겟 디바이스를 넓게 잡는것과 넓어진 타겟 디바이스를 지원하기위한 비용을 잘 생각하고 균형을 맞춰야하는게 이 때문이다. 또 주의할 점은 각 버전이 출시될 떄마다 해당 버전이...

로컬에 저장된 Json파일로부터 데이터읽어오기(String으로 변환), 그리고 Array(JsonArray)에 저장하기

/** * Reads the JSON file and converts the JSON data to a { @link String}. * * @return A { @link String} representation of the JSON data. * @throws IOException if unable to read the JSON file. */ private String readJsonDataFromFile () throws IOException { InputStream inputStream = null; StringBuilder builder = new StringBuilder() ; try { String jsonDataString = null; inputStream = getResources().openRawResource(R.raw. menu_items_json ) ; BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream , "UTF-8" )) ; while ((jsonDataString = bufferedReader.readLine()) != null ) { builder.append(jsonDataString) ; } } finally { if (inputStream != null ) { inputStream.close() ; } } return new String(builder) ; } /** * Adds { @link MenuItem}'s from a JSON file. */ private void addMenuItemsFromJson () { try { ...