2013-02-24 2 views
0

저는 제작하려고하는 Android 코드와 관련하여 약간의 문제가 있습니다. 내가하려는 일은 사용자가 전화기를 잠금 해제하고 프로그램을 처음 시작할 때 1을 표시하고 사용자가 화면 잠금을 눌러 전화기를 잠그면 0을 단순히 인쇄하는 것입니다. 나는 이것이 onPause와 onResume을 사용해 보았으므로 안드로이드 라이프 사이클과 관련이 있다고 생각했지만, 내 프로그램은 0, 결코 1을 출력하지 않았다. logTime 메서드는 단순히 1 또는 0을 출력하고 MainActivity의 onCreate 메서드는 onResume() 메서드를 한 번 호출합니다. 여기 내 코드입니다 :Android에서 화면을 켜고 끕니다.

MainActivity :

protected void onPause(){ 
    if(ScreenReceiver.screenOn){ 
     logTime(ScreenReceiver.screenOn); 
super.onPause(); 
} 

protected void onResume() 
    if(!ScreenReceiver.screenOn){ 
    logTime(!ScreenReceiver.screenOn); 
super.onResume(); 
} 

화면 수신기 : 그것은 단지 0의 출력합니다 왜

public class ScreenReceiver extends BroadcastReceiver{ 
public static boolean screenOn; 


@Override 
public void onReceive(Context context, Intent intent){ 
    if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){ 
     screenOn = false; 
    } 
    else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){ 
     screenOn = true; 
    } 

} 

}

는 잘 모르겠어요. 이유를 아는 사람이 있습니까? 감사!

+0

'logTime'해야합니다 단지'logTime (ScreenReceiver.screenOn),'더'' –

+0

@ A - C 흠 괜찮 (ScreenReceiver.screenOn!가!).하지 지금 문제가 있습니다. 응용 프로그램을 다시 시작할 때마다 1을 기록 할 수 없습니다. 화면 잠금을 해제해도 아무 것도 인쇄되지 않지만 화면을 잠그면 0이 인쇄됩니다. 왜? – user200081

+0

수신자를 등록/등록 취소 하시겠습니까? 당신이 가지고있는 것은 (기본적으로 같은 매개 변수로'logTime()'을 호출하는 것과는 별도로) 올바르게 보인다. –

답변

0

이 있습니다 ... (화면 단지에 져 있는지 여부) true이,이, 당신이 screenOn의 반대를 기록, 그래서 다시 0이 될 것이다 것활동의 onPause()과 실제 방송이 수신되는 사이의 지연입니다. 따라서 일반적으로 변수 변경이 발생하지 않았기 때문에 "홀수"(잘못된) 판독 값을 얻을 수 있습니다. 이 수신기는 동적으로 등록해야하며 화면이 꺼져 있고 다시 켜지는 경우에도 수신해야합니다. 대개 Receiver는 누설을 막기 위해 onPause()에서 등록이 취소되었지만 여기서는 onDestroy()을 사용할 것이므로 마지막 호출을 사용할 수 있습니다. 간단히하기 위해 활동에서 BroadcastReceiver을 만들고 logTime()을 완전하게 호출했습니다.

샘플 코드 :

public class MainActivity extends Activity { 

    BroadcastReceiver receiver; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    receiver = new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
     if(arg1.getAction().equals(Intent.ACTION_SCREEN_OFF)){ 
      logTime(false); 
     } 
     else if(arg1.getAction().equals(Intent.ACTION_SCREEN_ON)){ 
      logTime(true); 
     } 
     } 
    }; 
    registerReceiver(receiver, filter); 
    } 

    @Override 
    protected void onDestroy() 
    { 
    try{ 
     unregisterReceiver (receiver); 
    } 
    catch (NullPointerException e){ 
     e.printStackTrace(); 
    } 
    catch (IllegalStateException e1){ 
     e.printStackTrace(); 
    } 
    super.onDestroy(); 
    } 


    public void logTime (boolean screen) 
    { 
    Time now = new Time(); 
    now.setToNow(); 

    String lsNow = now.format("%m-%d-%Y %I:%M:%S"); 
    TextView myText = (TextView) findViewById (R.id.myText); 
    myText.append (" " + lsNow + (screen ? "0" : "1")); 
    } 
} 
+0

빠른 질문 - 수신기가 있어야하는데 무엇입니까? 어떤 유형의 변수입니까? – user200081

+0

@ user200081'BroadcastReceiver receiver; 그것은 단지 BroadcastReceiver입니다. 내 샘플을 코드와 병합하는 대신, 내 견본이 작동하는지 확인하기 위해 액티비티에서 사용중인'layout' XML에 컨텐트 뷰를 설정하면됩니다. 보시다시피, 나는 더 이상 필요하지 않기 때문에'onPause()/onResume()'을 없앴습니다. –

+0

매력처럼 작동합니다. 도와 주셔서 정말 감사합니다! – user200081

0

모든 것은 바로 코드를 기반으로 보인다, 항상

화면이 screenOnfalse로 설정, 해제하면 ... 0을 인쇄해야합니다, 당신의 활동의 onPause가 호출 될 때, 그것은 0

인쇄

응용 프로그램이 실행되고이라고 onResume, screenOn

관련 문제