안드로이드에서 특정시간에 앱이 켜지고 꺼지는 동작을 취해야할 때가 있다. (특수한 경우임...)
이번 글은 앱 자체를 껐다 켰다하는 것은 아니고 앱이 꺼졌다, 켜졌다 하는 효과를 주기위한 팁정도로 이해하면 될 것 같다.
실제로 앱이 켜지고 종료되고 하는 로직을 실행하고 싶었지만, 전원이 꺼지고 다시 전원이 켜질때
무조건 최상위레벨에 앱이 실행되어야하는데 그러기 위해선 루팅권한을 얻어야하고 런처앱을 따로 만들어줘야하기 때문에
상당히 많은 공수가 들어간다.
나는 배포하는 날이.... 얼마남지 않은 상황에서...이러한 고객사의 요구사항 요청이 들어와서 할 수 없이
기획과 협의 후 실제로 앱이 꺼지고 켜지는 동작을 하지 않지만 임시적으로 실행되고 종료되는 효과를 주기로 합의했다.
(다음 버전에서 릴리즈 할 때 적용할 예정..)
우선 오픈시간과 종료시간을 정한다.
그다음 사용자가 정한 일정시간마다 현재시간을 불러와서 오픈시간과 종료시간을 체크하고 조건에 맞는 경우
화면의 디스플레이 밝기를 0으로 낮추고, 임의대로 만든 검정색의 이미지뷰를 보이게해 마치 앱이 종료된것 같은 효과를 줄 것이다.
굳이 이미지뷰를 덮어씌우는 이유는 디스플레이 시스템 밝기를 0으로 줘도 최소한의 밝기가 유지되기 때문에 화면이 보인다.
따라서 임의적으로 우리는 검정색 이미지뷰를 그위에 덮어씌워서 마치 앱이 종료된것 같은 일종의 꼼수?를 부릴것이다.
즉 현재시간이 오픈시간일 경우 검정색 이미지뷰를 보이지 않게하고 시스템과 앱내의 밝기를 100으로 최대화해서 마치 앱이 켜진것 같은 효과를 주고,
현재시간이 종료시간일 경우 시스템과 윈도우의 밝기를 0으로 최소화하고 검정색 이미지뷰를 보이게해 마치 앱이 종료된 것 같은 효과를 줄 것이다.
실제 디바이스가 잡아먹는 전기세의 대부분은 디스플레이이기 때문에 디스플레이 밝기를 최소화하면 임시적으로 전기세를 절약할 순 있다...
아래와 같은 느낌으로 하면 얼 추 실행된다.. 코드 내용은 그리 어렵지 않으니 쭉 보면 될 것 같다..
private static int CHECKTIME = 10000;private static final String CLOSING = "19:30";
private static final String OPEN = "08:30";@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainTimerTask timerTask = new MainTimerTask();
mTimer = new Timer();
mTimer.schedule(timerTask, 5000, CHECKTIME);// 앱이 켜지고 5초 이후에 타이머가 작동되며 타이머의 주기는 10초이다.
}
}Date nowTime = null;
Date colsingTime = null;
Date openTime = null;
int closingCompare, openCompare;
boolean displayClosingTime = false;
private Handler mHandler = new Handler();
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
Date rightNow = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
String dateString = formatter.format(rightNow);
try {
Date nowTime = formatter.parse(dateString);
colsingTime = formatter.parse(CLOSING);
openTime = formatter.parse(OPEN);
closingCompare = nowTime.compareTo(colsingTime);
openCompare = nowTime.compareTo(openTime);
} catch (ParseException e) {
e.printStackTrace();
}
if( closingCompare > 0 ){
//현재시간이 종료시간 이후인 경우.
displayBrightness(0);
Toast.makeText(getApplicationContext(), "종료시간 이 후인 경우 ", Toast.LENGTH_SHORT).show();
}else if(closingCompare < 0 ){
//현재시간이 종료시간 전 일 경우.
Toast.makeText(getApplicationContext(), "종료시간 이 전인 경우", Toast.LENGTH_SHORT).show();
if(openCompare < 0 ){
//새벽일 경우
//종료시간 전이지만, 오픈시간 전이기 때문에 새벽시간임.
Toast.makeText(getApplicationContext(), "종료시간 전이지만, 오픈시간 전이기 때문에 새벽시간임.", Toast.LENGTH_SHORT).show();
displayBrightness(0);
}else if(openCompare > 0){
//오픈시간 이후이면서 종료시간 전인 경우 -> 즉 오픈시간과 종료시간 사이
Toast.makeText(getApplicationContext(), "즉 오픈시간과 종료시간 사이", Toast.LENGTH_SHORT).show();
displayBrightness(100);
}
}
}
};private void displayBrightness(int brightness){
if(brightness == 100){
mBlind_view.setVisibility(View.INVISIBLE);
getWindow()
.getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}else{
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
mBlind_view.setVisibility(View.VISIBLE);
}
Settings.System.putInt(getContentResolver(),"screen_brightness",brightness);
WindowManager.LayoutParams myLayoutParams = getWindow().getAttributes();
myLayoutParams.screenBrightness = brightness;
getWindow().setAttributes(myLayoutParams);
}
'프로그래밍 > Android' 카테고리의 다른 글
[Android] Android 4대 컴포넌트(Activity,Service,Broadcast Receiver,Content Provider) (0) | 2017.06.12 |
---|---|
[Android] 비디오뷰 에러시 예외처리 (0) | 2017.06.02 |
[Android] status bar hide 및 막는 방법 (3) | 2017.05.31 |
[Android] Build시 Java Heap size 부족 해결방법 (0) | 2017.05.24 |
[Android] 화면에 계속 앱 띄우는 방법 (2) | 2017.05.22 |
댓글