마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

종료해도 다시 나타나는 액티비티

0 추천
안녕하세요 초보 안드로이드 개발자입니다.

 

죽여도 살아나는 서비스가 아니라

 

죽여도 홈버튼을 눌러도 계속 최상단으로 올라오는 액티비티를 구현하고 싶은데

 

제가 시도해본건 서비스를 돌리고 서비스가 죽을 때 서비스에서 액티비티를 호출.

이거였는데 안되더라고요..서비스에서는 액티비티 호출이 안되나요?

 

앱을 실항하는 식으로 하고픈데 어떤 방법이 있을까요?

 

생각해보니 알람앱같은것들은 알람시간이디면 앱이 실행이 되잖아요

그것처럼 구현하면 되려나요?

무한히 켜지는 앱
윤둥이 (4,560 포인트) 님이 2013년 7월 18일 질문

1개의 답변

+1 추천
 
채택된 답변

그냥 엑티비티에서와 같이 실행 하시면 되는데....

어려워 하시는 것 같아  방금짠 소스하나 올려드립니다.

테스트도 거치지 않은 소스이므로 정상작동은 장담못하지만 충분한 참고자료가 될듯 합니다.

 

new Thread(new Runnable() {
   @Override
   public void run() {
     while (true) {
      ActivityManager activityapp = (ActivityManager) getApplicationContext()
       .getSystemService(Context.ACTIVITY_SERVICE);
     List<ActivityManager.RunningTaskInfo> task = activityapp
       .getRunningTasks(1);
     ComponentName topActivity = task.get(0).topActivity;
 
     String strPackage = topActivity.getPackageName();
     String myAppPackageName = "실행할 패키지 네임";
 
     if (!myAppPackageName.equals(strPackage)) {
     Intent intent = getPackageManager()
       .getLaunchIntentForPackage("실행할 패키지 네임");
     startActivity(intent);
  } else {
     Log.e("out", "out");
}
}
}
}).start();
 
서비스 create단에 추가하시면 됩니다.
get_task퍼미션도 주셔야 하구요.
엑티비티 시작과 동시에 위소스가 들어간 서비스를 시작 하시면 됩니다.
 
저는 이렇게 해야 다시 살아난다는 것을 보여주기 위해 그냥 무한루프를 돌렸지만 상황에 맞는 이벤트는 직접 구현 하시면 됩니다.
 
많은 도움이 되셨기를 바랍니다.
 
ThisPlus (46,920 포인트) 님이 2013년 7월 18일 답변
윤둥이님이 2013년 7월 18일 채택됨
추가 설명을 드리자면 루프문에서 최상단에 있는 어플의 패키지네임을 받아오고 그 패키지 네임이 내가 항상 위로 띄우고자 하는 어플이 아닐경우 나의 어플을 다시 호출하는 겁니다.
안녕하세요 신경써주셔서 너무 감사합니다..

주신 소스를
onStartCommand에 넣어봤씁니다..
co.kr.casho는 패키지 명이 맞습니까?

흠..

질문을 다시 써봐도 될까요?

1. 홈버튼을 눌르고 나가도 액티비티 호출해서 앱 다시 올라옴

2. 뒤로가기버튼은 막았어요.
프로세스 관리에서 앱을 강제로 죽여도 서비스는 살아나는데
서비스에 의해서 앱을 실행시키고싶어요..

3. 휴대폰 전원을 껐다가 부팅할 때에도 앱 자동 실행

서비스는 어찌어찌해서 계속 살려두고 있는데요 지금
휴대폰을 껐다 켜도 서비스 자동 살아나고 Noti도 앱이 존재하는한 절대 안없어지고

흠.. 서비스를 이용해서 앱을 실행 할 수 있나요..?


아니면!!

알람 어플있잖아요?
그런 어플들은 알람 시간이 되면 알람 어플이 실행되지 않나요? 죽어있어도? 아닌가? 켜놔야되는건가?

여튼 만약 죽어있는 상태에서 시간이 돼서 알람어플이 실행된다면!!

알람매니져를 이용해서 Activity의 상태를 잡아가지고 앱을 실행한다! 어때요? 가능한가요?

방법이나 비슷한 예가 있다면 알려주세요!

감사합니다 !!
어디서든 앱을 실행은 가능합니다.
물론 서비스 알람메니져 모두 가능합니다.
서비스부분은 해결 하셨다니 부트가 완료된후에 어플 및 서비스가 자동 실행 되는 부분이 문제신가요???

그부분이라면 BroadcastReceiver 에 BOOT_COMPLETE 로 부팅이 완료 됬음을 캐치 할수 있습니다.

이때 서비스를 실행 시켜 주시면 되겠죠???
그부분까지는 완료가 되었습니다.
서비스는 항상 살아있죠 서비스가 디스트로이 돼도 다시 살아납니다 앱이 존재하는 한.
서비스 말고.. 액티비티 앱 화면이 계속 나오게 하고싶습니다.
앱을 종료해도 액티비티가 다시 뜨도록..
음~~~!1 제가 질문을 잘못 이해 한건가???
제가 드린 소스를 붙이시면 어플이 죽으면 어플을 재실행 하고 백그라운드로 사라지면 다시 화면위로 불러 오는데 말입니다.
제가 잘못붙혔나요? ㅎ 저도 그렇게 이해하고

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(LOG_TAG, "onStartCommand");
        android.os.Debug.waitForDebugger();
        startForeground(noti, notification);
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    ActivityManager activityapp = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
                    List<ActivityManager.RunningTaskInfo> task = activityapp.getRunningTasks(1);

                    ComponentName topActivity = task.get(0).topActivity;

                    String strPackage = topActivity.getPackageName();
                    String myAppPackageName = "com.yun.neverdie.MainActivity";

                    if (!myAppPackageName.equals(strPackage)) {
                        Intent intent = getPackageManager().getLaunchIntentForPackage(myAppPackageName);
                        startActivity(intent);
                    } else {
                        Log.e(LOG_TAG, "outoutoutoutoutoutoutoutoutoutoutoutoutoutoutoutoutoutoutoutout");
                    }
                }
            }
        }).start();
        return START_STICKY;
    }

이렇게 붙혔는데 아무 반응이 없어요..
아!!!살아납니다 감사합니다 정말 형님 ㅠㅠ감사합니다

아 ㅠㅠㅠ감사합니다

근데 이게 백그라운드에 계속 돌고있어서 메모리낭비가 심할거같은데..

앱이 내려가거나 종료 됐을때만 실행되게 할라면

onStop 부분에 작성하면 될까요?
하아 너무 감사합니다 짜이뚱님 정말 ㅠㅠ
ㅠㅠㅠㅠㅠㅠㅠㅠㅠ정말정말 감사합니다
소스 분석 해보고 공부 좀 더 해볼게요 정마 감사합니다
패키지 네임을 다시한번 확인 해봐주시구요...
퍼미션은 주셨는지???
제가 드린 소스를
onCreate()
최상단에 위치시켜 주세요...
잘되는데.....
네 잘됩니다 너무너무 잘됩니다
그런데 부팅을 했을 때에도 실행하게 하려고

ACTION_BOOT_COMPLETED를 검사하는 브로드케스트 리시버에 같은 소스를 넣었는데
브로드케스트리시버를 상속받은 클래스에서는
getApplicationContext() 를 지원하지 않고 startActivity도 지원하지 않는데 어떻게 하나요..?
음 그부분은 저도 확실하게 답을 못드리겠는데....
저는 onPause()에 넣을것 같네요~~!
거기서는 서비스를 호출하시는거죠
어플을 호출하는게 아니라 서비스를 호출하면 자동으로 어플이 실행 되겠죠....
액티비티의 온포우즈여? 하..
서비스 말고 그곳에..
흠..더 분석해보고 여러가지로 시도해볼게요
정말 진심으로 감사드립니다 ㅠㅠ
네 도움이 됐다니 기쁘네요~~! 수고 하세요~~!
짜이뚱님 지금 계신가요? 혹시.. 연락좀 닿으면 또 한번 여쭙고싶은게 있는데.. 어제 그 app 테스크를 이용해서 강제 실행시키는 로직에 대해서요..
음~~~ 머특별할 것도 없는데....무슨일이신지?
아 점심먹고오느라 못봤어요 ㅠ 죄송합니다
어제 주신 코드에 run 부분이 while 문으로 돌아가잖아요

그러다보니까 계속 얘가 테스크 상태를 쓰레드로 검사하다보니 메모리가 상당히 많이 먹게되고 안좋더라고요

그래서 제가 반복문을 없애고
onDestroy 또는 onPouse에다가 주신 코드를 메서드화 해서 호출을 했어요

그러니까 문제가 생기는게

onDestroy 당시에 당장 메서드는 호출돼서 테스크 검사를 하지만
디바이스 자체에서 화면은 전환되는데 테스크가 즉각 바뀌어 반영되지 않는 것 같더라고요....그래서 다시 앱이 실행될 때도 있고..아닐때도있고..

이런 문제는 어떻게 해결하면 좋을까요..?
음 확실히 말씀드릴수 있는건 onDestory는 불리는 시점이 불명확합니다.
그래서 반드시 수행되어야할 작업은 이함수에서 하지 않죠...
뭐 저도 이런 기능은 넣어 본적이 없는지라....
저도 딱히 떠오르는 방법은 생각이 나지 않습니다.
저도 일일이 테스트를 해봐가면 해봐야할 작업응로 보입니다.
근데 액티비티 생명주기 만으로 모든 액티비티의 상태를 체크 할수 있을지 의문이 들기는 합니다.
많은 도움못드려 죄송합니다.
ㅎㅎ 아닙니다 감사합니다 !!
...