특정 어플이 실행되면 진짜 종료는 아니더라도 비슷한 효과를 줄 수 없을까요?

조회수 4256회

아래에서 앱잠금 어플을 만드려하고 있는 대학생입니다.

좋은 답변을 많이 해주셔서 특정 앱이 실행되는 이벤트를 뺏어오는 것은 상당히 어렵다는 것을 알게되었습니다.

하여 대체할 수 있는 방법이 무엇이 있을지 생각해보았는데

  1. 일단 실행시킨 후 해당 앱이면 내가 만든 앱이 따라 켜진 후 내 앱의 액티비티가 스크린에 보이기, 내 앱을 끄면 해당 앱도 같이 꺼지기

  2. 일단 실행시킨 후 해당 앱에서 터치 등의 동작이 한번 더 이루어지면 1번과 같이 액티비티 띄우기

  3. 일단 실행시킨 후 해당 앱이면 계속 onStop으로 보내기

실행의 우선권을 뺏는 것이 어렵다면 실행을 일단 시킨 후 막을 방법에 대해 생각을 해보았습니다. 어떤 방법이 가장 현실적일지 조언해주시면 다시 한번 정말 감사하겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 새로운 것에 직접 부딪혀 해쳐나가는 것이 진정한 실력입니다. 공식 문서를 참고해보세요. 알 수 없는 사용자 2016.3.31 17:01
  • 감사합니다. 꼭 명심하겠습니다!! 알 수 없는 사용자 2016.4.9 01:32

1 답변

  • 앱잠금 앱이라하면 https://play.google.com/store/apps/details?id=com.domobile.applock 이런 앱을 말씀하시는건가요? 마켓에서 다운받아서 테스트해보니 앱잠금이 잘 동작하네요.

    이런것을 구현하시려는거라면...(혹시 제가 잘못이해한것이라면 알려주세요.)

    AccessibilityService 를 이용해보세요.

    AccessibilityService를 이용하려면 AndroidManifest에는 아래와 같은 권한이 필요합니다.

    <application>
        <service
            android:label="@string/accessibility_service_name"
            android:name=".WindowChangeDetectingService"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService"/>
            </intent-filter>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/accessibilityservice"/>
        </service>
    </application>
    

    위와같은 권한이 포함되면 사용자는 설정에서 접근성 권한을 켜줘야 동작합니다. 사용자가 접근성권한을 켜면 앱들이 실행되거나 변화가 있을때 AccessibilityEvent 를 받을 수 있습니다.

    public class MyAccessibilityService extends AccessibilityService implements OnInitListener {
    
        private static final String LOG_TAG = "onAccessibilityEvent";
    
        @Override
        public void onServiceConnected() {
        }
    
        @Override
        public void onAccessibilityEvent(AccessibilityEvent event) { 
        //어느앱이던지 앱이 실행되면 여기로 무조건 AccessibilityEvent가 들어옵니다. 여기서 해당앱인지 체크를 하고 앱이 맞으면 내가 설정한 앱을 띄워주면 되지 않을까요?
            AccessibilityNodeInfo source = event.getSource();
            if (source != null && source.getText() != null) {
                Log.i(LOG_TAG, source.toString());
                Log.i(LOG_TAG, source.getText().toString());
            }
        }
    
    
        @Override
        public void onInterrupt() {
            /* do nothing */
        }
    
    
        @Override
        public void onInit(int status) {
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
    
        @Override
        protected boolean onKeyEvent(KeyEvent event) {
            return false;
        }
    }
    
    

    위와같은 방법으로 해보면 되지 않을까 싶어요. Acceeibility에 관한 간단한 예제소스를 참고해보세요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 와 이런 서비스가 있었군요!!!! 정성스런 답변에 정말 진심으로 감사드립니다. 정말 아쉽게도 프로젝트 아이템을 잠금화면에서 문제를 풀어 잠금해제할 수 있는 앱으로 바꾸었습니다ㅠㅠ 그렇지만 답변해주신 내용 꼭 기억해두었다가 소중히 사용하도록 하겠습니다. 감사합니다. 알 수 없는 사용자 2016.4.9 01:37

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)