2014-01-22 51 views
2

我想要做的是,雙擊電源按鈕將提升烤麪包「發送信息」,如果屏幕是開或關,無所謂。我做了什麼是,我記錄了點擊電源按鈕的時間長度&如果當前點擊和上一次點擊持續時間之間的差異小於1秒,則會提高敬酒度。但它也提高了單擊的敬酒。請幫我當電源按鈕被按下兩次時提高烤麪包

1.MainActivity.java 
public class MainActivity extends Activity { 
@Override 
public 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); 
    BroadcastReceiver mReceiver = new CloseSystemDialogsIntentReceiver(); 
    registerReceiver(mReceiver, filter); 
    } 

@Override 
    protected void onPause() { 
     // when the screen is about to turn off 
     if (CloseSystemDialogsIntentReceiver.wasScreenOn) { 
      // this is the case when onPause() is called by the system due to a screen state change 
      System.out.println("SCREEN TURNED OFF"); 

    } else { 
     // this is when onPause() is called when the screen state has not changed 
    } 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    // only when screen turns on 
    if (!CloseSystemDialogsIntentReceiver.wasScreenOn) { 
     // this is when onResume() is called due to a screen state change 
     System.out.println("SCREEN TURNED ON"); 
    } else { 
     // this is when onResume() is called when the screen state has not changed 
    } 
    super.onResume(); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_POWER) { 
     // Do something here... 
     Log.d("ONKEYDOWN", "ONKEYDOWN"); 
     event.startTracking(); // Needed to track long presses 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

@Override 
public boolean onKeyLongPress(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_POWER) { 
     // Do something here... 
     Log.d("onKeyLongPress", "ONKEYDOWN"); 
     return true; 
    } 
    return super.onKeyLongPress(keyCode, event); 
} 
@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) { 
     Log.d("dispatchKeyEvent", "ONKEYDOWN"); 

     return true; 
    } 

    return super.dispatchKeyEvent(event); 
} 
} 

2.CloseSystemDialogsIntentReceiver.java

public class CloseSystemDialogsIntentReceiver extends BroadcastReceiver { 

public static boolean wasScreenOn = true; 
static long prevTime=0; 
static long currTime=0; 
@Override 
public void onReceive(Context context, Intent intent) { 

    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     // do whatever you need to do here 
     prevTime = System.currentTimeMillis(); 
     Log.d("CHECK IN RECIVER WHEN ON","CHECK IN RECIVER WHEN ON"); 
     wasScreenOn = false; 
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
     // and do whatever you need to do here 
     Log.d("CHECK IN RECIVER WHEN ON","CHECK IN RECIVER WHEN OFF"); 
     currTime = System.currentTimeMillis(); 
     wasScreenOn = true; 
    } 
    if ((currTime - prevTime) < 1000 && (currTime - prevTime)>-1000) { 
     if ((currTime - prevTime) < 1000) { 
      Toast.makeText(context, "double Clicked power button", 
        Toast.LENGTH_LONG).show(); 
      Log.e("eciver ", "double Clicked power button"); 
      currTime = 0; 
      prevTime = 0; 
     } 
    } 
    } 
    } 

回答

0

您應該取消註冊的onDestroy廣播接收器,其次這種系統事件應在業務處理並不是一個前臺活動,可以當屏幕熄滅時會被銷燬。您的活動可能會失去所有狀態並在這些印刷機之間重新創建。

0

編輯你的代碼是這樣的:

public class CloseSystemDialogsIntentReceiver extends BroadcastReceiver { 

public static boolean wasScreenOn = true; 
static long prevTime=0; 
static long currTime=0; 
@Override 
public void onReceive(Context context, Intent intent) { 

if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
    // do whatever you need to do here 
    Log.d("CHECK IN RECIVER WHEN ON","CHECK IN RECIVER WHEN ON"); 
    wasScreenOn = false; 
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
    // and do whatever you need to do here 
    Log.d("CHECK IN RECIVER WHEN ON","CHECK IN RECIVER WHEN OFF"); 
    wasScreenOn = true; 
} 

if (prevTime == 0) { 
// power button first time pressed or after you double-pressed 
    prevTime = System.currentTimeMillis(); 
} else if (((currTime = System.currentTimeMillis()) - prevTime) < 1000) { 
// second press under 1s(double-pressed), reset prevTime 
    Toast.makeText(context, "double Clicked power button", 
     Toast.LENGTH_LONG).show(); 
    Log.e("eciver ", "double Clicked power button"); 
    prevTime = 0; 
} else { 
// second press over 1s, considered as first press for next checking 
    prevTime = currTime; 
} 
} 
}