'안드로이드'에 해당되는 글 3건

  1. 2022.08.05 플러터(flutter) 개발환경 구성
  2. 2017.05.17 Google AAD - 구글에서 인증한 안드로이드 개발 자격증
  3. 2017.03.30 App이 foreground 인지 background 인지 구별하기 1

플러터(flutter) 개발환경 구성

Flutter 2022. 8. 5. 01:08

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

플러터는 하나의 원소스 멀티플랫폼을 추구하는 GUI 프레임 워크이다. 

하나의 소스로 android, iOS, Windows, Linux 및 웹용 애플리게이션을 만들수 있으므로, 요즘같은 시대에 매력적인 프레임워크라고 할 수있다.  

플러터_멀티플랫폼

 

또하나의 장점으로는 동일한 사용자 경험( User Experience )을 제공할수 있다는 것이다. 모바일 플랫폼인 android와 iOS만 하더라도 각각의 OS 가 추구하는 디자인이 다르고, UI 철학도 다른데 플러터를 이용하면 같은 UI 를 제공할 수 있게되므로 하나의 서비스라면 android, iOS, Windows 에 통일된 UX를 하나의 소스로 구현하게 되므로 생산성 향상및 서비스의 완성도도 올라간다고 할 수 있다.

[ 개발환경 구성 ] 

개발환경 구성은 크게 3단계로 구성된다. 

  • flutter SDK 다운로드 및 설치 
  • flutter 환경변수 설정 
  • Android Studio에서 flutter 플러그인 설치 

 

먼저 SDK를 다운받아보자. 

macOS는 cpu가 2가지 이므로 자신의 cpu에 맞는 플러터를 다운받는다. 

Intel cpu : https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_3.0.5-stable.zip

Apple Silicon : https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_arm64_3.0.5-stable.zip

최신버전은 아래에서 확인하고 다운을 받도록 하자. 

( https://docs.flutter.dev/get-started/install/macos

zip 파일을 적당한 곳에 압축을 해제하고 아래처럼 언집을 한다. 

cd ~/hanburn
unzip ~/Downloads/flutter_macos_3.0.5-stable.zip

 

다음으로는 어디서든지 flutter를 실행 할 수 있도록 환경변수에 추가해 준다.  아래의 hanburn은 유저이름이다. 

export PATH="$PATH:/Users/hanburn/flutter/bin"

 

다음으로는 Android Studio에서 flutter 플러그인을 설치해야 되는데, 혹시 Android 개발환경이 안되어 있는 사람은 아래글을 보고 android 개발 환경을 구성하도록 하자. 

2022.01.03 - [android] - MacBook M1 에 안드로이드 개발환경 설정하기

 

MacBook M1 에 안드로이드 개발환경 설정하기

M1 맥북의 성능이 너무 좋다고 해서 하나 장만하였는데.. 오랜만의 초기 환경설정을 정리해본다. 1. Android Stduio 설치하기 다운받기 : https://developer.android.com/studio 다운받을때, arm용을 받으면 된다..

hanburn.tistory.com

 

안드로이드 스튜디오 설치가 되었으면, 플러터 닥터를 실행해서 안드로이드 연결을 위한 점검을 한다. 

flutter doctor

그러면 자동으로 환경 체크를 하면서 문제가 있으면 문제가 있다고 알려준다. 예를들면 아래와 같은 형식이다. 아래는 Android SDK 경로는 찾았는데, command line tools 를 못찾았으니 친절하게 다운받는 경로도 알려주고 있다. ㅋ 

[-] Android toolchain - develop for Android devices
    • Android SDK at /Users/obiwan/Library/Android/sdk
    ✗ Android SDK is missing command line tools; download from https://goo.gl/XxQghQ
    • Try re-installing or updating your Android SDK,
      visit https://docs.flutter.dev/setup/#android-setup for detailed instructions.

여기까지 설치하였으면 이제는 Android Studio에서 플로터 플러그인을 설치하면 된다. 

Android Studio의 preference를 열고 Plugins를 선택하고 검색창에 flutter를 치면 된다. 제일 상단에 있는 11.9M 크기를 선택해서 설치하면 끝이다.  추가로 flutter 관련된 여러가지 플러그인이 있는데, 요건 차차 사용해보면서 좋은것을 정리해서 따로 포스팅 하도록 하겠다. 

다음으로는 모든 개발의 시작인 hello, world 같은 기본적인 시작을 해보자~ 



:

Google AAD - 구글에서 인증한 안드로이드 개발 자격증

개발 2017. 5. 17. 00:10

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

2016년 google I/O에서 발표했다고 하는데요, 구글에서도 과거 MCSE 같은 인증 자격증 제도를 운영하고 있습니다. 

과거 Java의  SCJP 를 취득한다고 취업에 크게 도움이 되지 않았고, Microsoft의 MCSE 도 비슷했다. 우리나라의 정보처리기사 정도의 가치가 있을런지.. 


2017년 3월 14일 기준으로 61개국에서 322명이 취득했다고 하니, 그렇게 인기가 많은건 아닌거 같다. 개발 해보면 알듯이 개발 능력을 어떤 시험으로 책정하기가 어렵기에, 이런류의 자격증은 base-line을 검증하는, 즉 최소 이정도는 알고 있다는 의미정도를 부여할수 있다. 


구글에서는 AAD를 소개하는 동영상도 만들었다. 정확한 명칭은 AAD (Associate Android Developer) 인증프로그램이라고 한다. 


구글의 기술블로그에도 소개가 되어 있다. 

https://developers-kr.googleblog.com/2017/03/introducing-associate-android-developer.html


응시료가 149달라라고 하니 대략 15만원. 비싸구나. 그리고 시험에 응시하면 48시간동안 문제를 풀어서 제출해야 한다고 한다. 물어 보는 내용은 다음과 같다. 


테스트 및 디버깅

    로컬 JVM 유닛 테스트 작성 및 실행

    장치 UI 테스트 작성 및 실행

    문제 설명이 주어지면 실패를 복제하십시오.

    디버그 정보를 출력하려면 시스템 로그를 사용하십시오.

    애플리케이션 크래시 디버깅 및 수정 (포착되지 않는 예외)

    활동주기 문제를 디버그하고 수정합니다.

    뷰에 문제 바인딩 데이터 디버그 및 수정


응용 프로그램 사용자 인터페이스 (UI) 및 사용자 경험 (UX)

    응용 프로그램의 기본 화면과 탐색 흐름 모의

    UI, 백그라운드 작업 및 데이터 지속성 간의 상호 작용을 설명하십시오.

    XML 또는 Java 코드를 사용하여 레이아웃 만들기

    사용자 정의보기 클래스 만들기 및 레이아웃에 추가

    사용자 정의 응용 프로그램 테마 구현

    공통 위젯 그룹에 맞춤 스타일 적용

    RecyclerView 항목 목록 정의

    로컬 데이터를 RecyclerView 목록에 바인딩

    메뉴 기반 또는 서랍 탐색 구현

    응용 프로그램의 UI 텍스트를 다른 언어로 현지화하십시오.

    접근성을 위해보기에 내용 설명 적용

    사용자 정의보기에 접근성 후크 추가


기본 응용 프로그램 구성 요소

    응용 프로그램의 주요 기능 및 비 기능 요구 사항 설명

    레이아웃 리소스를 표시하는 활동 만들기

    백그라운드 스레드에서 로더를 사용하여 디스크에서 로컬 데이터 가져 오기

    로더를 통해 데이터 변경 사항을 UI로 전파

    알람을 사용하여 시간에 민감한 작업 예약

    JobScheduler를 사용하여 백그라운드 작업 예약

    서비스 내부 백그라운드 작업 실행

    비표준 작업 스택 탐색 (딥 링크) 구현

    외부 지원 라이브러리의 코드 통합


영구 데이터 저장소

    데이터베이스 스키마를 정의하십시오. 표, 필드 및 색인 포함

    응용 프로그램 전용 데이터베이스 파일 만들기

    단일 결과를 반환하는 데이터베이스 쿼리 작성

    여러 결과를 반환하는 데이터베이스 쿼리 작성

    데이터베이스에 새 항목 삽입

    데이터베이스의 기존 항목 업데이트 또는 삭제

    콘텐츠 공급자를 통해 다른 응용 프로그램에 데이터베이스 노출

    원시 리소스 또는 자산 파일 읽기 및 구문 분석

    사용자 입력에서 영구적 인 환경 설정 데이터 생성

    환경 설정 값을 기반으로 응용 프로그램 로직 토글


기술면접 자료로 사용해도 될것 같다. 

자세한 자료는 다음을 참고 

https://developers.google.com/training/certification/





:

App이 foreground 인지 background 인지 구별하기

android 2017. 3. 30. 22:24

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 App을 만들다 보면은 App이 background로 내려가는 시점을 알아야 할 때가 있다. 

그런데, 안드로이드에서는 Home 버튼을 눌렀는지 알 수 있는 방법이 없어서 약간의 편법을 사용해야 한다. 



먼저 고전적인 방밥으로는 ActivityManager를 이용하는 방법이다. 

코드로 보면 아래와 같다. 


private boolean isAppIsInBackground(Context context) {
    boolean isInBackground = true;
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
        List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
            if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                for (String activeProcess : processInfo.pkgList) {
                    if (activeProcess.equals(context.getPackageName())) {
                        isInBackground = false;
                    }
                }
            }
        }
    } else {
        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        ComponentName componentInfo = taskInfo.get(0).topActivity;
        if (componentInfo.getPackageName().equals(context.getPackageName())) {
            isInBackground = false;
        }
    }

    return isInBackground;
}


키캣미만에서는 RunningTaksInfo를 이용하고, 키캣이상에서는 RunningAppProcessInfo 를 이용하는 방식이다. 그런데 이 방색을 사용할때는  GET_TASKS 권한을 AndroidManifest.xml에 추가해야 하는데,  GET_TASKS 권한이 deprecated 되었다. 



그래서 다른 방식으로 사용하는것이 Activity의 onStart(), onStop() 함수를 오버라이드(override) 해서 count 하는 방식이다. 대략적인 코드는 아래와 같은 모습이다. 


public class BaseActivity extends Activity {
public static int foregroundCount = 0; // 전역 count 변수

@Override
protected void onStart() {
    super.onStart();
    foregroundCount = foregroundCount+ 1;
}


@Override
protected void onStop() { super.onStop(); foregroundCount = foregroundCount - 1;
} }


Application에서 사용하는 모든 Activity가 BaseActivity를 상속받게 하고, foregroundCount 가 1이상이면 foreground로 볼 수 있는 것이다. 

Activity가 많다면 은근히 작업이 많아 질 수도 있고, 나주에 추가되는 Activity에서 BaseActivity 로부터의 상속을 빼먹으면 버그가 발생하기 쉬운 방식이다. 



그럼 좀 더 안전한 방법은 없을까? 

앱에있는 Application 클래스를 이용하는 방법이 있는데, 

먼저 background에 있는지 체크하는 방법을 알아보자 


public class MyApplication extends Application {
    // ...
    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (level == TRIM_MEMORY_UI_HIDDEN) {
           isBackground = true;
           notifyBackground();
        }
    }
}


그런데, onTrimMemory 함수는 screen off 상태일때는 호출이 안되므로, 아래처럼 리시버를 등록해서 체크해야 한다. (screen off 상태는 전원버튼을 눌러서 화면을 끄는것을 말한다. ) 


public class MyApplication extends Application {
  // ...
  @Override
    public void onCreate() {
        super.onCreate();
        // ...
        IntentFilter screenOffFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
              if (isBackground) {
                  isBackground = false;
                  notifyForeground();
              }
            }
        }, screenOffFilter);
      }
}


이렇게 하면 background 상태는 체크가 되는데, foreground 상태는 어떻게 알아 낼 수 있을까?

간단하게 ActivityLifecycleCallback() 함수를 이용하면 된다. 


public class MyApplication extends Application {
    // ...
    @Override
       public void onCreate() {
           super.onCreate();

     registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
               // ...
               @Override
               public void onActivityResumed(Activity activity) {
                 if (isBackground) {
                     isBackground = false;
                     notifyForeground();
                 }
               }
               // ...
           });
       }
       // ...
}



이상으로 App이 foreground에 있는지, background에 있는지 체크하는 방법에 대해서 

1. ActivityManager를 이용하는 고전적인 방법 

2. Activity의 onStart(), onStop() 을 활용한 방법

3. Application의 onTrimMemory(), registerActivityLifecycleCallbacks() 를 활용하는 방법

으로 알아 보았습니다. 





: