2011-05-09 60 views
3

我正試圖擴展我目前的應用程序(內部公司電話簿),以便能夠通過運營商的交換機轉接呼叫。這個過程是人呼喚我。然後,我可以「停放」該呼叫並呼叫另一個同事,並再次撥打號碼4來連接人員a和同事。但是當我頭腦中的代碼過程中,我意識到這可能是不可能的。因爲發生的事情是Person A電話,我打開我的應用程序並選擇一個人。該應用發起呼叫,然後該應用暫停到後臺模式。從後臺調用調用?

我該如何繼續讓應用程序(暫停時)啓動第四次呼叫而不必再次激活應用程序?從我的測試中,我可以看到應用程序發送調試的東西,但當試圖做UI的東西,如打開瀏覽器,它不會通過。當有一個活躍的電話時,它甚至是可能的嗎?或者電話會採取行動並抑制所有應用程序?

只是希望在此之前提供一些快速的輸入,然後再繼續前進,花費無用的時間來實現這一點,甚至可能無法實現。

編輯:增加了一些代碼示例。

首先用戶按下聯繫簿中的一行。

public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
    { 
     Console.WriteLine("Initiate Call to Contact"); 
     NSUrl url = new NSUrl("tel:" + _items.Contacts[indexPath.Row].Number); 

     if (!UIApplication.SharedApplication.OpenUrl(url)) 
     { 
      var av = new UIAlertView("Not supported" 
       , "Scheme 'tel:' is not supported on this device" 
       , null 
       , "Ok thanks" 
       , null); 
      av.Show(); 
     } 
    } 

這將提示用戶撥打這個號碼(因爲據我所知你無法啓動沒有提示?

呼叫現在,當這樣做的計時器啓動(設置基於)發起的第三個呼叫數4.這是電話公司的交換機採用配對電話中一起數。

我們把應用程序的內部狀態3(intented應用中止由於呼出)

public partial class AppDelegate : UIApplicationDelegate 
{ 
    int ourTask; 
    public override void DidEnterBackground (UIApplication application) 
    { 
     Console.WriteLine("Entered Background!"); 

     ourTask = application.BeginBackgroundTask(delegate { 

      if(ourTask != 0) { 

       application.EndBackgroundTask(ourTask); 
       ourTask = 0; 
      } 

     }); 
     new System.Action(delegate { 
      if(_state == 3) { 
     BeginInvokeOnMainThread(delegate { 
     Console.WriteLine("Code queued"); 
      if(UIDevice.CurrentDevice.IsMultitaskingSupported) { 
       Thread.Sleep(10000); 
       NSUrl url = new NSUrl("tel:" + 4); 

      if (!UIApplication.SharedApplication.OpenUrl(url)) 
      { 

       Console.WriteLine("Not supported!"); 
      } 
       Console.WriteLine("Invoke Finished!"); 
      } 
      application.BeginInvokeOnMainThread(delegate { 

       if(ourTask != 0) { 
        application.EndBackgroundTask(ourTask); 
        ourTask = 0; 
        Console.WriteLine("App Ended!"); 
       } 
       }); 
      }); 
      } 
     }).BeginInvoke(null,null); 
    } 
} 
+0

首先,確定你可以做到這一點。其次,解釋在哪個線程上有哪些功能,以及第四個呼叫在哪裏啓動? (用戶界面按鈕,其他地方?) – 2011-05-09 13:45:46

+1

你可以在這裏澄清一些事情 - 通過「電話」你的意思是「電話」? – Luke 2011-05-09 14:20:33

+0

檢查我的編輯在幾分鐘 – Anders 2011-05-10 05:54:15

回答

0

這對於當前的iOS結構是無法解決的。

1

不知道我是否正確理解您的問題。但一般來說,所有UI線程調用都必須在UI線程(應用程序的主線程)上完成。如果你有一個工作者線程,你必須將UI調用委託給UI線程,否則會導致忽略該調用的效果(事實上,它被忽略:))。

要從任何其他線程調用UI線程,請使用InvokeOnMainThread函數。這是一個在所有NSObject派生類上實現的方法。

this.InvokeOnMainThread(delegate {//在這裏做你的東西});

希望這會有所幫助。

+0

我試過這個(或它已經這樣做),但它似乎沒有什麼影響。我將添加幾行代碼來演示 – Anders 2011-05-10 05:53:58