繁体   English   中英

从后台调用来电?

[英]Invoke calls from background?

我正在尝试扩展我当前的应用程序(内部公司电话簿),以便能够通过我们的运营商的交换机转发呼叫。 这个过程是一个人打电话给我。 然后,我可以“停放”呼叫并呼叫另一个同事并再次拨打号码4以连接a和同事。 但是当我在脑海中完成代码处理时,我意识到这可能是不可能的。 因为发生的事情是人员A电话,我打开我的应用程序并选择一个人。 应用程序启动呼叫,然后应用程序暂停到后台模式。

我如何继续让应用程序(暂停时)发起第三次拨打号码4,而无需再次激活应用程序? 从我的测试我可以看到应用程序发送调试的东西,但当试图做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次呼叫。这是电话公司总机用于将电话呼叫组合在一起的号码。

我们将应用程序置于内部状态3(由于拨出电话而意图暂停应用程序)

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);
    }   
}

不确定我是否正确理解您的问题。 但一般来说,所有UI线程调用必须在UI线程(应用程序的主线程)上完成。 如果你有一个工作线程,你必须将UI调用委托给UI线程,否则会导致调用被忽略(事实上,它被忽略:))。

要从任何其他线程调用UI线程,请使用InvokeOnMainThread函数。 这是在所有NSObject派生类上实现的方法。

this.InvokeOnMainThread(委托{//在这里做你的东西});

希望这可以帮助。

这对于当前的iOS结构是无法解决的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM