본문 바로가기

구글과인터넷/안드로이드

안드로이드 Activity가 어떤 상태 인지.....

[안드로이드] 백그라운드에서 Activity가 어떤상태인지 알수 있을까요? 

첫번째 질문!!
서비스 또는 Thread에서
현재 Activity가 화면에 보여지는 상태인지(onresume인지 onpause 인지)를
확인 할 수 있는 방법이 있을까요?
 
Thread에서 this를 Log로 찍어봣는데, onstop 상태에서도 null로 안찍히더라구요;;;
 
 
두번째 질문!!
AppWidget을 만들었는 데요. 위젯을 1개만 만들수 있게 제한을 걸어줄수 있나요?
home 화면에 위젯이 이미 1개가 존재한다면.. 위젯 생성시 토스트로 더이상 생성이 안됩니다 라는
메시지 등의 출력을 하고 싶거든요~
 
한주의 시작이라 좀 거시기 할텐데... 즐겁게 보내세요^^~

 하솜 2011-10-17 (월) 10:41추천 1
첫번째 질문은.. 확인 불가능 할것 같은데요...  저도 해보진 않았지만..
죽었는지 살았는지는 isFinish()로 확인 가능합니다..
 
두번째는 해당 내용은 launcher에서 지원해야될것 같네요~
아니면 onEnable 등에서 appwidgetid등을 체크해서 해보심이~
왜 2개를 막아야되는지느 잘 모르겠지만요~
 하솜  2011-10-17 (월) 10:41
베플로 선택된 게시물입니다. 
댓글주소 추천 1
  이바둥  2011-10-17 (월) 11:18
첫번째 질문은..
activity 하나만 체크하셔야 되면 onResume, onPause일때 flag값 쓰시면 되지 않을까요?
그게 아니라면 activitymanager의 getRunningTasks 메소드 사용하셔서 topActivity의 classname 비교하시면 될 것 같네요..

두번째 질문은.
onEnable, onDelete 될 때 prefrence 값 설정하시면 될 것 같습니다만..
onEnable이 동일 위젯이 있더라도 최초 위젯시에만 동작하다고 알고 있어요
댓글주소 추천 0
 모암  2011-10-17 (월) 11:30
isFinish() 메소드는 없구 this.isFinishing()이란 메소드가 있긴 있는데요.
처음 액티비티 발생시에는 false값이 나오고 backkey로 나가면 true로 되는데..
다시 액티비티 들어가도 true로 유지가 되더라구요..그래서
이방법 이바둥님이 말씀해주신 flag를 유지하는것으로 해결하였구요.
 
2개를 왜 막아야 하냐면... 제가 앱위젯 예외처리(?) 및 앱을 잘못 만들었나봐요;;;
위젯이 2개가 되면 구동이 좀 이상하게 되서;;;;;;;;;;;;;;;;;
 
다시 갈아엎는 중인데... 차근차근 해봐야겟네요.. service부터....
두분 모두 답변 감사합니다^^~
댓글주소 추천 0
     
     
 하솜  2011-10-17 (월) 13:30
isFinishing() 이 맞네요 ㅋ 대충 기억이 안나서 ;;
위젯이 2개 이상일 때에는 appwidgetid로 구분하셔서 할수있는 방법이 있는데 한번 찾아보세요~
댓글주소 추천 0
          
          
 모암  2011-10-18 (화) 10:51
냅! 감사합니다^^~
댓글주소 추천 0
               
               
 안사지킴이  2011-10-18 (화) 10:51
축하드립니다. ;)
모암님은 럭키라이팅에 당첨되어 4 포인트 지급되었습니다.
댓글주소 추천 0
 ㅈㅅ  2011-10-18 (화) 16:04
메소드 변수때문에 그런거 같은데요^^
위엣분 말처럼 prefrence 값 설정하세요



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: http://appting.com/bbs/board.php?bo_table=B49&wr_id=69459&sfl=wr_subject%7C%7Cwr_content&stx=&sst=wr_hit&sod=asc&sop=and&page=71


안녕하세요.ㅎㅎ
하고있는게 해결이 안되어 질문드립니다.
 
public void onReceive(Context context, Intent intent)
{
}
위에 부분에서
c2dm 메시지 받아 백그라운드 상태와 활성화 상태일때
처리를 틀리게 할려고 하는데요
 
현제 앱 상태를 알수 있는지요?
 
어떻게 알아야 할지 모르겠네요..

축하드립니다. ;)
goodday님은 럭키라이팅에 당첨되어 1 포인트 지급되었습니다.
댓글주소 추천 0
 농구왕전원…  2012-03-19 (월) 09:44
프로세스 정보를 구하는 로직을 찾아서 

만드신 패키지명으로 비교해서

패키지명 프로세스가 있다면 ( 백그라운드 혹은 포그라운드)

없다면 (실행 안된 상태) 

이렇게 하면 안될까요??


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: http://blog.daum.net/_blog/BlogTypeView.do?blogid=0NtUA&articleno=188&_bloghome_menu=recenttext#ajax_history_home

더욱이 추가하자면 이건 Activity의 라이프사이클을 알아야 합니다.
 
일반적으로 홈키를 누르면 종료됏다고 생각하는 경향이 강한데 home키는 절대 종료키가 아닙니다.
 
앱을 (강제)정지시킨 후 안드로이드의 메인화면으로 이동할 뿐인거죠.
 
그렇기에 Activity의 라이프사이클에서 정지(home키를 누르거나, 슬립모드)일때 실행되는 매서드들을
 
살펴보시면 도움이 될 겁니다.

 

==============================================================================

[android] 대기모드/슬립모드 wifi / cpu / 화면 컨트롤

출처: http://curv.tistory.com/185

 

절전 모드로 인하여 wifi 가 꺼지는 것을 방지하기 위해

 

wifiLock 과 wakeLock 을 등록한다.

 

wifiLock 는 말그대로 wifi 상태만 유지

 

wakeLock 는 cpu 상태를 유지하기 위해 사용하였다.

 

wakeLock 의 FLAG 에는 아래와 같이 6가지가 존재한다.

 
매니패스트에는 아래 퍼미션을 추가

<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

 

PARTIAL_WAKE_LOCK : CPU ON, 화면은 꺼짐, 키보드 꺼짐

SCREEN_DIM_WAKE : CPU ON, 화면 어둡게, 키보드 꺼짐

SCREEN_BRIGHT_WAKE_LOCK : CPU ON, 화면 밝게, 키보드 꺼짐

FULL_WAKE_LOCK : CPU ON, 화면 밝게, 키보드 ON

 

추가가 가능하나 PARTIAL_WAKE_LOCK 과는 같이 써도 소용 없는 FLAG 2개

ACQUIRE_CAUSES_WAKEUP : acquire 할 때 스크린과 키보드를 켜줌으로써 중요한 통지(notification)이

왔을 때 사용자가 화면을 바로 볼 수 있도록 함.

ON_AFTER_RELEASE : WakeLock 이 릴리즈 되었을 때 유저 액티버티 타이머가 리셋 되어지고 스크린을 좀더 오래 켤 수 있고, wake lock 을 반복적으로 수행하는 사이에 발생하는 깜빡임 현상을 줄이고자 할 때 사용.

 

샘플 :

 

 WifiLock wifiLock = null;
 WakeLock wakeLock = null;

 public void changeToWakeMode() {

  if (wifiLock == null) {
   WifiManager wifiManager = (WifiManager)getSystemService(WIFI_SERVICE);
   wifiLock = wifiManager.createWifiLock("wifilock");
   wifiLock.setReferenceCounted(true);
   wifiLock.acquire();
  }

  if (wakeLock == null) {
   PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
   wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "wakelock");
   wakeLock.acquire();
  }
 }

 @Override
 public void onStop() {

  if (wifiLock != null) {
   wifiLock.release();
   wifiLock = null;
  }

  if (wakeLock != null) {
   wakeLock.release();
   wakeLock = null;
  }
  
  super.onStop();
 }

 

참고 :

 

http://eddykudo.com/64

http://2-up.tistory.com/713

http://developer.android.com/reference/android/os/PowerManager.html

http://developer.android.com/reference/android/os/PowerManager.WakeLock.html

 

===============================================================================

 [Android] 안드로이드 개발 시 주의사항 - 백그라운드 실행시 주의할 점

 

출처: http://drcarter.tistory.com/entry/Android-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B0%9C%EB%B0%9C-%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%8B%A4%ED%96%89%EC%8B%9C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90

 

 

 안드로이드의 특징중에 하나를 꼽는다면 백그라운드 실행이라고 할 수 있겠습니다. 아이폰과 다르게 멀티테스킹이 가능한
안드로이드는 그만큼 활용도가 많다는 것입니다. 하지만 그것에 따른 다른 주의 사항이 있습니다.
그 중에 하나가 바로 wifi모드를 유지하는 것입니다.

  안드로이드는 대기 모드로 들어가게 되면 배터리 소모를 줄이기 위해서 wifi를 자동으로 꺼버리게 됩니다. 하지만 무선으로
데이터를 주고 받는 중이거나, 스티리밍을 하고 있는 중간에 대기 상태로 들어가게 되고 자동으로 wifi가 꺼지게 된다면 3G
의 무선 데이터 모드로 바뀌게 되겠지요. 그렇게 된다면 3G 데이터의 사용이 많아지게 되고 나중엔 사용자의 요금에 지대한
영향을 줄 것으로 생각됩니다.
  백그라운드 실행 중에도 wifi 상태를 유지하기 위해서는 

android.net.wifi.WifiManager.WifiLock


을 이용해서 wifi상태를 유지시켜줘야 합니다.
자세한 설명음
http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html
이 곳에 가시면 확인할 수 있습니다.

간단히 사용방법을 보게 된다면


WifiManager.WifiLock wifiLock = null;
//등록
if (wifiLock == null) {
                WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
 wifiLock = wifiManager.createWifiLock("wifilock");
 wifiLock.setReferenceCounted(true);
 wifiLock.acquire();
}
//해제
if (wifiLock != null) {
                wifiLock.release();
 wifiLock = null;
}


이렇게 하면 됩니다.
대기 상태에서도 wifi를 유지하고 있게 된다면, 배터리 소모가 빠르고 많아진다는 단점이 있지만, 그만큼 3G 데이터를 사용하는것이 적어진다는 것에 대한 장점도 있게 됩니다.

  두번째로 주의할 점은, 대기상태가 오래 된다면 cpu의 활동을 정지시켜 버립니다. 이것도 배터리 소모를 줄이기 위한 것이기는 하지만, 단적인 예로 들어서 스트리밍으로 음악을 듣고 있는 중에서 화면을 꺼버린 대기 모드일 경우에 cpu를 정지 시킨다면 음악을 들을 수 없게 되겠지요. 그래서 wifi상태를 유지 시켜주기 위한 WifiLock이 있듯이 cpu상태를 활동상태로 유지시켜주는 WakeLock이 있습니다.

 

android.os.PowerManager.WakeLock


자세한 설명은
http://developer.android.com/reference/android/os/PowerManager.WakeLock.html
이곳에 가셔서 확인해 볼 수 있습니다.

이것을 사용하는 방법은 간단히


PowerManager.WakeLock wakeLock = null;
//등록
if (wakeLock == null) {
 PowerManager powerManager = (PowerManager) context.getSystemService(context.POWER_SERVICE);
 wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "wakelock");
 wakeLock.acquire();
}
//해제
if (wakeLock != null) {
 wakeLock.release();
 wakeLock = null;
}


이렇게 하면 됩니다.

이 두가지를 유지시켜 준다면, 백그라운드로 실행을 하면서 대기 모드로 전환이 된다고 해도, 해당 어플이 죽거나 하는 일은 없겠지만, 그만큼 배터리 소모가 많아지기 때문에 안드로이드폰을 오래 사용할 수는 없겠지요.

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: http://www.androidpub.com/829786


제목과 같이 어플이 foreground 인지? background 인지?

상태를 알수 있는 방법 알려주세요.

무식한 방법인듯 하나 아래와 같이 하면 foreground 인지? background 인지? 확인 가능 합니다. 

  ActivityManager activityapp = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
  
  List<RunningAppProcessInfo> list = (List<RunningAppProcessInfo>)activityapp.getRunningAppProcesses();

  for(int i = 0 ; i < list.size() ; i++) {
      RunningAppProcessInfo info = list.get(i);
      if ( info.processName.equals("") && info.importance == info.IMPORTANCE_FOREGROUND ){  
      }
  }


레디필
서비스를 만듭니다.
액티비티에서 pause 나 stop때 서비스에 정지 상태임을 알립니다.