2013-04-16 9 views
0

브로드 캐스트 리시버가 화면을 켜고 끌 때까지 대기합니다. 원하는 작업은 다음과 같습니다.안드로이드가 브로드 캐스트 리시버를 일시 중지했습니다.

public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     pause some seconds... 
     ...do something 
    } 
} 

어떻게 현재 스레드를 onReceive 메소드로 중지 할 수 있습니까?

+0

화면이 꺼진 후 원하는 작업이 조금 다릅니다. 당신이 "일을이"정말, _wall time_의 "몇 초"다음에 일어날 것을 _sure_ 싶지 또는 당신의 마음에 당신이 뭔가 다른 있나요? –

+0

사실, 나는 내 마음에 다른 뭔가를했습니다 : 나는 화면 이상 10 초 동안 정화에 대한 – user1071138

+0

감사 났을 경우 screenOff/screenOn에 수행 한 작업이 만 수행되도록합니다. 나는 제안했다. –

답변

-1

Handler.postDelayed 방법을 사용하십시오.

그래서 코드 당신은 할 수 없습니다이

Handler h = new Handler(); 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     h.postDelayed(new Runnable(){ 
      public void run(){ 
        // do something 
      } 
      },pause_time_in_milis); 
    } 
} 
+0

나는 장치가 없음으로 인해 인'ACTION_SCREEN_OFF' 이벤트와'Runnable' 사이에서 잠을 잘 수있을 것 같아요? –

+0

죄송합니다. 문제를 제대로 설명하지 않았습니다.화면이 10 초 이상 꺼져있는 경우 조치를 취하고 싶습니다. 그렇지 않으면 아무 작업도 수행 할 수 없습니까? 가능합니까? – user1071138

+0

화면이 얼마나 오랫동안 꺼져 있는지 알 수있는 방법이 있습니까? – user1071138

5

과 같이 될 것입니다 그리고 당신은 핸들러에 BrodcastReceiver도 postDelayed()을 일시 정지 안된다

스레드가 다른 작업을 수행해야하므로 스레드를 중지하면 안됩니다. 잘못된 디자인이므로 차단하지 마십시오.

당신은 워드 프로세서 때문에 postDelay 수 없습니다

당신이 onReceive()에서 반환되면, 브로드 캐스트 리시버가 더 이상 활성 상태 이며, 그 호스팅 프로세스가 다른 응용 프로그램으로 만 중요하다 그 안에 실행중인 구성 요소. 특히 해당 프로세스가 BroadcastReceiver (사용자가 을 가지지 않았거나 최근에 상호 작용하지 않은 응용 프로그램의 경우)를 호스트하는 경우에만 onReceive()에서 시스템이 처리 될 것으로 간주하므로 해당 프로세스에서 이 중요하기 때문에 특히 중요합니다. 비어 있고 은 리소스를 다른 중요한 프로세스에 사용 가능하도록 적극적으로 종료합니다.

즉, onReceive()에서 반환되는 순간이 모든 것이 매우 빠르게 죽을 것임을 의미합니다.

브로드 캐스트 후 일정 시간이 지나면 서비스를 시작할 수 있고 그 서비스는 시간을 기다리거나 기다리는 시간이 몇 초보다 길면 그냥 이 서비스를 AlarmManager에 시작하고 AlarmManager가 서비스를 시작하게하십시오.

+0

이것은 맞습니다. onReceive()에서 장기 실행 작업을 수행하면 안됩니다. 10 초의 시간 초과가 있고 그 후에 시스템이 스레드를 차단하고 죽이기로 간주 할 수 있습니다. – NickT

3

간략한 설명에 따르면 onReceive()보다 AlarmManagerset(RTC, System.currentTimeMillis()+10000, thePendingIntentToNotifyYou)을 사용하는 것이 좋습니다. 이 방법을 사용하면 장치가 잠자기 상태가 아닌 한 10 초 후에 알림을 받게됩니다. (그렇지 않은 경우 RTC_WAKEUP을 사용하십시오.)

브로드 캐스트 리시버를 통해 켜고 끄는 화면에 대한 정보도 제공됩니다 (하지 않을 경우 타이머도 중지해야 함). 이미)과는 조건이 10 초 동안 (위해 화면을 찾고 여부를 알 수 있도록) 작은 상태 머신을 유지 thePendingIntentToNotifyYou의 트리거에 보유해야합니다.

+0

더 쉬운 방법으로 해결했습니다 : – user1071138

+0

@ user1071138 어떻게 구현 했습니까? –

+0

onReceive 메소드로 : if (intent.getAction(). equals (Intent.ACTION_SCREEN_OFF)) { wasScreenOn = false; handler.postDelayed (새의 Runnable() { @Override 공공 무효 실행() { 경우 (wasScreenOn) { 무언가를 ... 사실 hasStopped =;! } }}, 10000); } else if (intent.getAction(). equals (Intent.ACTION_SCREEN_ON)) { wasScreenOn = true; if (hasStopped) { 할 일 ... hasStopped = false; } } – user1071138

관련 문제