In actual development of the Android source code, two problems are encountered: instant screen notification after the screen is disconnected from the screen lock, and instant screen notification during the call; because the problem of wake-up on the screen is used in many places, I don't want to modify the source code, so I am afraid that it will lead to more problems.
To solve these two problems, we should adopt a direct solution, that is, the screen will be lit immediately after the screen is disconnected and then released in a few seconds. If: when the recipient hangs up and does not display the screen during the call, the user clicks the screen and releases the screen a few seconds later;
This method of bright screen can be placed in the Call_STATE_IDLE and Call_State_OFFHooK statuses of the Phone Monitor for processing.
In these two states, we will encounter a problem: the release of a lock is clearly implemented, but the screen is still dark. No black screen, no standby. In fact, no bright screen locks are released when the problem persists. If Call_STATE_IDLE and Call_State_OFFHooK are locked multiple times, the locks generated each time are different, even if the same lock name is used, however, the lock is not released and will not be pushed to the screen. Therefore, in Call_STATE_IDLE and Call_State_OFFHooK, you must specify that the new lock is only performed once and release the corresponding lock. In this way, after the screen is highlighted, the screen is displayed after several seconds (the time is controlled by message.
The Code is as follows:
[Java]
TelephonyManager mTelephonyMgr = (TelephonyManager) this
. GetSystemService (Context. TELEPHONY_SERVICE );
MTelephonyMgr. listen (new TeleListener (),
PhoneStateListener. LISTEN_CALL_STATE );
// ====================================
// Add by kylin 2011.11.22 begin
Handler myHandler = new Handler (){
@ Override
Public void handleMessage (Message msg ){
// TODO Auto-generated method stub
Super. handleMessage (msg );
If (null! = Wl ){
Wl. release ();
}
}
};
Handler myHandler2 = new Handler (){
@ Override
Public void handleMessage (Message msg2 ){
// TODO Auto-generated method stub
Super. handleMessage (msg2 );
If (null! = Wl2 ){
Wl2.release ();
}
}
};
// End
// ================================================ ============
Class TeleListener extends PhoneStateListener {
@ Override
Public void onCallStateChanged (int state, String incomingNumber ){
Super. onCallStateChanged (state, incomingNumber );
Switch (state ){
Case TelephonyManager. CALL_STATE_IDLE :{
// Add by kylin 2011.10.21
String getElapsedTimeTemp = mCallCard. getElapsedTime (). toString ();
If (getElapsedTimeTemp! = Null &&! GetElapsedTimeTemp. trim (). equals ("") & PhoneApp. getInstance (). isVTCall () = false ){
// If (PhoneApp. getInstance (). isVTCall () = false ){
GetToast ();
}
Pm. setBtnBacklight (false );
MFlag = false;
MFlag2 = false;
// End
Break;
}
Case TelephonyManager. CALL_STATE_OFFHOOK :{
MFlag = true;
Pm. setBtnBacklight (true );
If (! MFlag2 ){
Pm2 = (PowerManager) getSystemService (Context. POWER_SERVICE );
Wl2 = pm2.newWakeLock (PowerManager. ACQUIRE_CAUSES_WAKEUP | PowerManager. SCREEN_DIM_WAKE_LOCK, "InCallScreen ");
// Wl2.setReferenceCounted (false );
Wl2.acquire ();
Message msg2 = new Message ();
Msg2.what = 200;
MyHandler2.sendMessageDelayed (Ms 2, 5000 );
MFlag2 = true;
}
Break;
}
Case TelephonyManager. CALL_STATE_RINGING :{
Pm. setBtnBacklight (true );
Break;
}
Default:
Break;
}
}
}
// ==========================================
Private void getToast (){
If (mFlag = true ){
Pm = (PowerManager) getSystemService (Context. POWER_SERVICE );
Wl = pm. newWakeLock (PowerManager. ACQUIRE_CAUSES_WAKEUP | PowerManager. SCREEN_DIM_WAKE_LOCK, "InCallScreen ");
Wl. acquire ();
MFlag = false;
Message msg = new Message ();
Msg. what = 100;
MyHandler. sendMessageDelayed (msg, 2000 );
// Wl. release ();
}
}
From Kylin Qilin