Android/Android 코드2020. 3. 30. 12:37

/**
* Created by skchoi on 2020/03/27
*
* ForegroundCheck.get().isBackground
* ForegroundCheck.get().appStatus
*
* 간단한 동작 설명
* onActivityStarted 추가 되면 카운트 +1
* onActivityStopped 추가 되면 카운트 -1
* 카운트가 0 이면 백그라운드
* 카운트가 1 보다 크면 포그라운드
* 카운트가 1 이면 포그라운드 전환
*/
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;

public class ForegroundCheck implements Application.ActivityLifecycleCallbacks {

private static ForegroundCheck instance;

public static void init(Application app) {
if (instance == null) {
instance = new ForegroundCheck();
app.registerActivityLifecycleCallbacks(instance);
}
}

public static ForegroundCheck get() {
return instance;
}

private ForegroundCheck() {
}

private AppStatus mAppStatus;

public AppStatus getAppStatus() {
return mAppStatus;
}

// check if app is return foreground
public boolean isBackground() {
return mAppStatus.ordinal() == AppStatus.BACKGROUND.ordinal();
}



public enum AppStatus {
BACKGROUND, // app is background
RETURNED_TO_FOREGROUND, // app returned to foreground(or first launch)
FOREGROUND; // app is foreground
}


// running activity count
private int running = 0;

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {

}

@Override
public void onActivityStarted(Activity activity) {
if (++running == 1) {
mAppStatus = AppStatus.RETURNED_TO_FOREGROUND;
} else if (running > 1) {
mAppStatus = AppStatus.FOREGROUND;
}
}

@Override
public void onActivityResumed(Activity activity) {
}

@Override
public void onActivityPaused(Activity activity) {
}

@Override
public void onActivityStopped(Activity activity) {
if (--running == 0) {
mAppStatus = AppStatus.BACKGROUND;
}
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}

@Override
public void onActivityDestroyed(Activity activity) {
}


}

 

체크가 필요한 Service나 Activity에서

 

if (ForegroundCheck.get().isBackground()) {
// TODO: 2020/03/27 skchoi 앱이 백그라운드일 때 noti띄워줌
} else {
// TODO: 2020/03/27 skchoi 앱이 포그라운드면 해당 app에서 갱신처리.
}

 

다음과 같이 사용해서 하고 싶은 일을 처리해 준다.

Posted by Sharpen

댓글을 달아 주세요

JAVA/JAVA 상식2019. 11. 8. 10:34

람다와 함수형 인터페이스
Supplier -> R get() 같은 역할을 한다.(int를 반환 하는 메소드 처럼 씀)
Consumer -> void accept(T t) 메소드와 같은 역할을 한다.(param을 받아서 소모하는 메소드 처럼 씀)
Predicate -> boolean test(T t) true, false 조건 판단이 필요할 때 역할을 맡는다..
UnaryOperator -> Integer func(Integer param) 매개변수와 리턴 타입이 동일할 때의 역할을 맡는다. Long이든 Double든 unary는 단항을 의미 Operator은 연산
Function<T, R> -> R apply(T t) T를 인자로 받아서 R을 리턴해 주는 보통 정의되는 메소드 역할을 맡는다.
IntFuction 전달인자는 int 반환은 R
toIntFunction 매개변수는 T 반환을 int로
UnaryOperator 단항 동일 매개변수T 반환값T 같은 자료형인 경우
BinaryOperator 두개 매개변수T 반환T로 같은 자료형인 경우
Bi~ 매개 변수가 두개인 람다 Bi는 Binary의 약자일 듯.

Posted by Sharpen

댓글을 달아 주세요

Android/Android 코드2019. 9. 19. 13:05

sendBroadcast(new Intent(Const.ACTION_RELOAD_FAVORITE));

같이 기존에 Broadcast를 날리던 코드는
안드로이드 시스템 전체에 방송을 때리기 때문에 

자신의 앱에만 방송을 날리도록 코드를 수정한다.

LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(new Intent(Const.ACTION_RELOAD_FAVORITE));

Posted by Sharpen

댓글을 달아 주세요

Android/Android Error2019. 3. 6. 09:30


AAPT2 error: check logs for details 

현재 안드로이드 스튜디오 3.3.1을 쓰고 있는데 run시 에러가 발생해서 구글링해봐도  

프로젝트 내에 gradle.properties  파일을 열고 수정해 주라는 글만 있었다.

android.enableAapt2=false



그런데 2018년도 까지만 쓸 수 있는 거다. 이러면서 문제 해결이 되지 않았다.


프로젝트 build.gradle 내에 gradle버전을 올려주고


dependencies {

    classpath 'com.android.tools.build:gradle:3.3.2'


// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}


이어서 자동으로 나오는 

gradle/wrapper 폴더에서 gradle-wrapper.properties를 

distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip

최신으로 수정해주니 빌드에 성공했다.


최신으로 변경하면 어디경로의 xml에 에러가 뜨는 건지 알 수 있는데 그걸 수정해 주니 해결됬다.

나 같은 경우는 레이아웃 파일에서

<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?> 이렇게 두번 선언이 되있었다.




Posted by Sharpen

댓글을 달아 주세요

Android/Android Error2018. 9. 3. 23:44

책 예제를 따라치던 중 이런 에러가 발생했다.


error: attribute 'com.zxcv5500.toyproject:contentScrim' not found.
error: attribute 'com.zxcv5500.toyproject:layout_scrollFlags' not found.
error: attribute 'com.zxcv5500.toyproject:layout_collapseMode' not found.


error: resource string/appbar_scrolling_view_behavior (aka com.zxcv5500.toyproject:string/appbar_scrolling_view_behavior) not found.

에러가 나는 원인은 사용하는 라이브러리를 app모듈 단의 build.gradle에 추가해주지 않아서 그런 듯 하다.


다음과 같이 라이브러리 부분을 추가해 준다.



dependencies {



implementation 'com.android.support:design:27.1.1'
}


Posted by Sharpen

댓글을 달아 주세요