버그 잡이

안드로이드 잠금화면(screen-rock) 기능 만들기 본문

안드로이드

안드로이드 잠금화면(screen-rock) 기능 만들기

버그잡이 2019. 10. 13. 22:41

https://ccdev.tistory.com/14

 

[Android] 안드로이드 잠금화면(LockScreen) 만들기 기초1

[Android] 안드로이드 잠금화면(LockScreen) 만들기 기초1 안드로이드 잠금화면 만들기 포스팅을 시작합니다 ! 안드로이드 잠금화면 만들기의 기초 첫번 째 포스팅에서는 잠금화면을 띄우기 위한 기본 구성을 알아..

ccdev.tistory.com

*위에 블로그를 참고하여 응용하였습니다.

 

 


 

 

 

프로그래밍을 배우기 전부터 만들고 싶었던 앱이 있었다.

 

"핸드폰 잠금화면 기능"

 

틈만 나면 유튜브, 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);
            }
        });

    }
}

 

 

반응형
Comments