Android 146

칸이 차면 다음으로 넘어가는 EditText

칸이 차면 다음으로 넘어가는 EditText fun initEditText(){ val et: Array = arrayOf( edittext_0, edittext_1, edittext_2, edittext_3 ) for(i in 0..3){ et[i].addTextChangedListener(object: TextWatcher{ override fun afterTextChanged(p0: Editable?) { if(i==3){ if(p0.toString().isNotEmpty()) et[3].clearFocus() }else { if(p0.toString().isNotEmpty()) et[i+1].requestFocus() } } override fun beforeTextChanged(p0: CharS..

Android/Kotlin 2019.04.04

[Anotation] @RequiresApi, @TargetApi

RequiresApi, TargetApi@TargetApi(Build.VERSION_CODES.O) fun test2(){ } @RequiresApi(Build.VERSION_CODES.O) fun test1(){ }@TargetApi는 IDE에 알려주기만 하는 것.@RequiresApi는 호출 조건을 강제 하는 것. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_test_activty) test1() //안됨 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) test1() //ㅇㅋ test2(..

Facebook Auth에서 이메일정보를 반환하지 않을 때

Problem//페이스북에서 이름과 이메일 정보를 얻어낸다. override fun requestFacebookProfile(loginResult: LoginResult) { val request = GraphRequest.newMeRequest(loginResult.accessToken) { obj, response -> try { val email = obj.getString("email").toString() requestToken(loginResult, email) } catch (e: Exception) { Log.d("SSS", "requestFacebookProfile(): $e" ) view.showToast(R.string.intro_network) } } val parameters = ..

Google로그인 Debug에서는 되고 플레이스토어에 Release 했을 때 안되는 현상

Google Auth Debug에서는 되고 플레이스토어에 Release 했을 때 안되는 현상 Firebase의 SHA1을 콘솔에 있는 걸로 바꿔줘야 한다.(원래는 Gradle - android - signingReport에 있던 것 사용) 1. 앱서명 누른다음, SHA-1복사 1. SHA-1 바꿔넣음.2. google-services.json 새로 받아서 앱에 덮어씌움3. 플레이스토어에 업로드 SHA키 여러개 넣을 수 있다.(debug랑 release동시에 넣어두면 된다)

뷰(View)가 그려지는 과정

안드로이드에서의 액티비티가 포커스를 얻으면, 자신의 레이아웃을 그리도록 요청한다. 이때 액티비티에 레이아웃의 계층구조 중 루트(root) 노드를 제공해야 한다. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(com.empo.android.empoapp.R.layout.activity_main) } 뷰를 그리는 과정은 측정(Measure), 레이아웃(Layout) 단계가 있다. 측정(Measure) 과정 - 뷰의 크기를 구한다 public final void measure (int widthMeasureSpec, int heightMeasureSpec) measure()..

Handler 구현

Handler 기본 생성자를 통해 Handler를 생성하면, 생성되는 Handler는 해당 Handler를 호출한 위치의 스레드의 MessageQueue와 Looper에 자동 연결된다. 1. 메인 스레드가 기본적으로 루퍼를 가지고 있다. 2. 메인스레드에 있는 루퍼는 static 변수로 정의되어 있다. 3. 따라서 어느 쓰레드에서 handler를 부르던 메인스레드에 있는 루퍼 객체를 참조한다. 4. 메인스레드가 아닌 스레드에서는 안드로이드 화면에 그리는 것이 불가능 하기 때문에 핸들러를 사용하는 것이며, 핸들러를 통해 전달된 메세지는 루퍼의 메세지 큐에 저장된다. class MainActivity : AppCompatActivity() { var count = 0 override fun onCreate(..

스레드 구현방법 (Thread클래스 상속, Runnable인터페이스 구현)

스레드를 구현하는 두가지 방법 1. Thread클래스를 상속(extends) -> run() 오버라이드 2. Runnable인터페이스 구현(implements) -> run() 구현 1. Thread클래스 상속하는 방법class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val testThread = TestThread() testThread.start() } } class TestThread: Thread(){ override fun run() { Log...

핸들러(Handler), 루퍼(Looper), 메시지큐(Message Queue)

Handler스레드 간의 통신장치 1. Looper로부터 받은 Message를 처리한다. 2. 다른 스레드로부터 메시지를 받아서 Message Queue에 넣는 역할을 한다. - Handler는 스레드의 Message Queue와 연계하여 Message나 Runnable객체를 받거나 처리하여 스레드 간의 통신을 할 수 있도록 한다. - Handler 객체는 하나의 스레드와, 해당 스레드의 Message Queue에 종속된다. - 새로 Handler 객체를 만든 경우 이를 만든 스레드와 해당 스레드의 Message Queue에 바인드된다. - 다른 스레드의 속한 Handler의 post나 sendMessage 등의 메서드를 호출해서 다른 스레드로 메시지를 전달 할 수 있다. - Message Queue는 ..

Service(unbind, bind)

Service(unbind, bind) Unbound Service startService()를 통해 시작된 서비스는 한번 시작되면 백그라운드에서 무한정 실행될수 있다. 서비스를 시작한 액티비티가 소멸되어도 동작한다.그러나 이렇게 시작한 서비스는 호출한 쪽에 어떠한 결과를 반환할수 없다. 이를 Unbound Service라고 한다. bound ServicestartService() 메소드 대신 bindService() 메소드를 통해 시작되는 서비스를 서비스 바인딩 (Service Bind 혹은 Bound Service)이라 한다.- 이 서비스는 마치 클라이언트-서버 와 같이 동작한다. 서비스가 서버 역할. - 액티비티는 서비스에 어떠한 요청을 할수 있고, 서비스로부터 어떠한 결과를 받을수 있다. - 프로..

AIDL(Android Interface Definition Language)

안드로이드 인터페이스 정의 언어 (AIDL) Service다루는 방법 1 startService() / stopService() 를 이용해서, 특정 Service 를 시작 하거나 종료. Service다루는 방법 2 bindService()를 이용해서, Service 의 IBinder 객체를 얻어온 후, 해당 Service 에서 정의된 API 를 호출 - API호출방법1 - local serviceService와 Service를 이용하는 어플리케이션이 항상 동일한 Process 에서 작동하는 경우에 해당. 이 경우 bindService() 의 결과로 바로 해당 Service 에 접근해서 원하는 API 를 호출할 수 있다. - API호출방법2 -Remote Service실재로 Service가 돌고 있는 Pr..

Nought(7.0)미만 WifiManager 메모리 누수 문제

Android Nought(7.0)미만에서 WindowWifi사용시 메모리 누수문제 Android DocumentWifiManagerpublic class WifiManager extends Object java.lang.Object ↳android.net.wifi.WifiManager This class provides the primary API for managing all aspects of Wi-Fi connectivity.On releases before Build.VERSION_CODES.N, this object should only be obtained from an Context#getApplicationContext(), and not from any other derived cont..

Listener

AccessToken이 만료되었을 때, 재요청하는 기능.Retrofit으로 요청하며 비동기이므로 리스너를 사용. BaseActivity.ktopen class BaseActivity : AppCompatActivity() { internal val apiService: ApiService by lazy { ApiService.create() } internal var disposable: Disposable? = null interface RefreshtokenListener{ fun onSuccess() fun onError() } override fun onDestroy() { disposable?.dispose() super.onDestroy() } ... open fun getStringPref(..