Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- base64 변환
- UIPresentationController
- 스크롤 탭
- oberve url
- UIViewControllerTransitioningDelegate
- ViewBuilder
- development language
- convert base64
- 기존 앱
- swift
- SwiftUI
- detect url
- 상단 탭바
- Side Menu
- pod install
- swift #swift keychain #keychain 사용법
- Android
- Tuist
- notifychanged
- GeometryReader
- DevelopmentRegion
- scrolling tab
- Swift Package Manager
- url 관찰
- transformation.map
- DataBinding
- List
- url 추적
- 개발자 면접
- ios
Archives
- Today
- Total
버그 잡이
안드로이드 잠금화면(screen-rock) 기능 만들기 본문
*위에 블로그를 참고하여 응용하였습니다.
프로그래밍을 배우기 전부터 만들고 싶었던 앱이 있었다.
"핸드폰 잠금화면 기능"
틈만 나면 유튜브, SNS에 빠져 시간을 낭비하는 나의 모습을 반성하며 이를 제어할 수 있는 방법으로 잠금화면 기능을 생각했다.
'내가 낭비한 시간을 돈으로 환산해서 보여주는 잠금화면 기능이 있으면 좋겠다'
그래서 이번에 한번 만들었다.
기능 : 핸드폰 사용 시간을 계산해서 잠금화면에 띄워줌
원리 : 핸드폰이 꺼진 시간 - 핸드폰이 켜진 시간 = 사용시간
<필요한 기능>
(layout)
1.스크린락 on/off 버튼이 있는 "screenbtn.xml"
2.잠금화면으로 뜰 "lockscreen.xml"
(java클래스)
1.핸드폰 화면의 on/off를 인식해줄 리시버 "ScreenReceiver.java"
2.리시버를 돌려줄 서비스 "ScreenService.java"
3.잠금화면 "LockScreenActivity.java"
4.잠금화면을 켜고 꺼줄 "MainAcitivity.java"
*lockscreen.xml
*screenbtn.xml
*ScreenReceiver.java
public class ScreenReceiver extends BroadcastReceiver {
long first = 0;
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){ //화면이 켜졌다는 인텐트를 받으면
first = System.currentTimeMillis(); //켜졌을때의 시간 계산
}
if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){ //화면이 꺼졌다는 인텐트를 받으면
Intent i = new Intent(context, LockScreenAcitivity.class); //LockScreenActivity를 띄움
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
long second = System.currentTimeMillis(); //꺼졌을때의 시간 계산
i.putExtra("SECOND", second); //screen-On 시간과 screen-OFF 시간을 넘겨줘서 LockScreenActivity에서 계산
i.putExtra("FIRST", first);
context.startActivity(i);
}
}
}
*ScreenService.java
public class ScreenService extends Service {
private ScreenReceiver mReceiver = null;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mReceiver = new ScreenReceiver();
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON); //addAction으로 2개 이상의 신호를 받을 수 있어
registerReceiver(mReceiver,filter); //브로드캐스트리시버를 등록
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) { //서비스를 강제 종료했을때, 서비스를 어떤 방법으로 다시 시작시킬지 결정.
super.onStartCommand(intent, flags, startId);
if(intent != null){
if(intent.getAction()==null){
if(mReceiver==null){
mReceiver = new ScreenReceiver();
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(mReceiver,filter);
}
}
}
return START_REDELIVER_INTENT; //이후 서비스 재생성 가능, 강제로 종료되기 전에 전달된 마지막 Intent를 다시 전달해주는 기능 포함.
}
@Override
public void onDestroy() {
super.onDestroy();
if(mReceiver != null){
unregisterReceiver(mReceiver); //리스버 등록 해제
}
}
}
*LockScreenActivity
public class LockScreenAcitivity extends Activity {
private Window window;
TextView textView;
TextView textView2;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lockscreen);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); //안드로이드 기본 잠금화면 보다 위에 이 activity를 띄워라
long first = getIntent().getLongExtra("FIRST", 0);
long second = getIntent().getLongExtra("SECOND", 0);
long timeUsed = (second - first)/1000/60; //지난번 핸드폰 사용시간 계산
textView = (TextView)findViewById(R.id.money);
textView.setText("지난 핸드폰 사용 시간(분): "+timeUsed);
textView2 = (TextView)findViewById(R.id.money2);
textView2.setText("환산 금액(희망연봉+지출) : "+(233+93)*timeUsed + " 원"); //분(minute) 단위로 환산한 금액. 그냥 내 맘대로 설정.
}
}
*MainActivity
public class MainActivity extends AppCompatActivity {
private Button onBtn, offBtn;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screenbtn);
onBtn = (Button)findViewById(R.id.screenOnBtn);
offBtn = (Button)findViewById(R.id.screenOffBtn);
onBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), ScreenService.class);
startService(intent);
}
});
offBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), ScreenService.class);
stopService(intent);
}
});
}
}
반응형
'안드로이드' 카테고리의 다른 글
picass vs glide vs fresco 안드로이드 이미지 라이브러리 비교 (0) | 2020.03.13 |
---|---|
안드로이드(android) 위젯(widget) 만들기 (1) | 2020.03.10 |
안드로이드 EditText 안에 스크롤바 넣기, 키보드 뜰때 밀림 현상 해결 (0) | 2019.11.03 |
안드로이드 getIntent() 두 개 이상 받기. (0) | 2019.10.27 |
RecyclerView 선택 삭제, action Mode, contextual action bar (0) | 2019.10.20 |
Comments