2012-03-31 88 views

回答

2

你必须为PhoneState实现一个监听器。我这样做在一个私有类:

private class PhoneCallListener extends PhoneStateListener { 

    private boolean isPhoneCalling = false; 

    // needed for logging 
    String TAG = "PhoneCallListener"; 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 

     if (TelephonyManager.CALL_STATE_RINGING == state) { 
      // phone ringing 
      Log.i(TAG, "RINGING, number: " + incomingNumber); 
     } 

     if (TelephonyManager.CALL_STATE_OFFHOOK == state) { 
      // active 
      Log.i(TAG, "OFFHOOK"); 

      isPhoneCalling = true; 
     } 

     if (TelephonyManager.CALL_STATE_IDLE == state) { 
      // run when class initial and phone call ended, 
      // need detect flag from CALL_STATE_OFFHOOK 
      Log.i(TAG, "IDLE"); 

      if (isPhoneCalling) { 

       Log.i(TAG, "restart app"); 

       // restart call application 
       Intent i = getBaseContext().getPackageManager() 
         .getLaunchIntentForPackage(
           getBaseContext().getPackageName()); 
       i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
         | Intent.FLAG_ACTIVITY_CLEAR_TOP 
         | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
       startActivity(i); 

       isPhoneCalling = false; 
      } 

     } 


} 
} 

,你需要允许添加到清单,文件

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
+0

你好krains,我想检查我可能重复当我的活动正在运行时的呼叫状态此时,我希望我的应用程序在后台运行并保持暂停状态,而不是在呼叫结束后,我的应用程序会在该级别暂停时自动恢复。 – 2012-03-31 11:44:07

+0

我不确定它是否有效,但您可能会在这里查看[android dev page](http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_SINGLE_TOP),并只添加FLAG_ACTIVITY_SINGLE_TOP标志意图。 – krains 2012-03-31 11:56:23

1
private class EndCallListener extends PhoneStateListener { 
    private boolean active = false; 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
    if(TelephonyManager.CALL_STATE_RINGING == state) { 
     Log.i("EndCallListener", "RINGING, number: " + incomingNumber); 
    } 
    if(TelephonyManager.CALL_STATE_OFFHOOK == state) { 
     //wait for phone to go offhook (probably set a boolean flag) so you know your app initiated the call. 
     active = true; 
     Log.i("EndCallListener", "OFFHOOK"); 
    } 
    if(TelephonyManager.CALL_STATE_IDLE == state) { 
     //when this state occurs, and your flag is set, restart your app 
     Log.i("EndCallListener", "IDLE"); 
     if (active) { 
     active = false; 
     // stop listening     
     TelephonyManager mTM = (TelephonyManager) m_activity.getSystemService(Context.TELEPHONY_SERVICE); 
     mTM.listen(this, PhoneStateListener.LISTEN_NONE); 
     // restart the inbox activity 
     //Intent intent = new Intent(m_activity, MDInboxActivity.class); 
     //m_activity.startActivity(intent); 
     } 
    } 
    } 
} 

而且你可以通过调用下面的代码初始化上述类:

try { 
    EndCallListener callListener = new EndCallListener(); 
    TelephonyManager mTM = (TelephonyManager) m_activity.getSystemService(Context.TELEPHONY_SERVICE); 
    mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE); 
} catch(Exception e) { 
    Log.e("callMonitor", "Exception: "+e.toString()); 
} 
+0

而不是重新启动收件箱活动,您可以启动您自己的活动。 – Ishu 2012-03-31 11:10:58