如何在Xamarin.Mac中实现应用程序背景。我想要一些类似于android服务的东西:
Android服务-服务是一种应用程序组件,可以在后台执行长时间运行的操作,并且不提供用户界面。另一个应用程序组件可以启动服务,并且即使用户切换到另一个应用程序,它也可以在后台继续运行。此外,组件可以绑定到服务以与其进行交互,甚至可以执行进程间通信(IPC)。例如,一项服务可以从后台处理网络事务,播放音乐,执行文件I / O或与内容提供者进行交互。〜Android.com
提前致谢。
正确的方法是使用launchd和“应用程序类型”设置(在“ Xamarin Studio”或“ Visual Studio for Mac中” )将应用程序安装为LaunchAgent(每个用户实例)或LaunchDaemon(每个计算机实例)。 ”项目选项对话框)应设置为“可执行文件”,而不是“可通过用户界面执行”(或类似操作)。
作为“ LaunchAgent”,您可以选择与桌面进行交互,并且代码在每个登录用户而不是系统进程帐户的上下文下运行。您将不会在“停靠栏”中看到磁贴(除非您分配了NSApp),并且仅在显式调用Mac API使其实现时才看到“状态菜单栏”。此外,launchd将定期检查并启动您的进程,以确保该进程始终在运行。)无需使用任何Cocoa / Mac API来实现代理/守护程序,则您可以launchd
在上面和下面运行任何控制台应用程序。仍然是真实的。
与集成的launchd是不平凡的,但有据可查的MacOS的平台,因为它没有任何其他平台/工具链(Java,C ++,OBJ-C,斯威夫特也同样适用于Xamarin.Mac开发的应用程序,.. 。),对于大多数开发人员来说,如果我不得不猜测学习如何使用launchd是2-4小时的投资。
由于Xamarin.Mac本身并不明确支持已启动(并且IMO不应),因此您还将承担给launchctl
自己打电话的任务。作为一个经验丰富的.NET开发人员,我发现将所有“ launchctl丑陋”包装在“安装程序类”中很好用(然后,您只需要运行installutil
以安装/卸载代理/服务/应用程序即可。)这些安装程序类也可以是实现可在Windows和Linux上使用,这意味着跨平台安装只需要使用即可installutil
。
另外,您可以在应用程序捆绑包Info.plist中设置特定的属性,但这不是必需的。但是,大多数人会发现编辑现有的plist比与启动的集成更容易。值得注意的是,一个行为上的差异是编辑plist以包括LSBackgroundOnly
或LSUIElement
不保证您的应用程序正在运行,而是使用launchctl
will。
高温超导
launchd
Wikipedia.org上的文章launchctl
Apple.com上的手册页LSBackgroundOnly
Apple.com上的参考LSUIElement
Apple.com上的参考installutil
Microsoft.com上的参考(尽管Windows使用其自己的“服务控制管理器(SCM)” API而不是launchctl
。)也适用于Mono / Xamarin Linux / Mac平台。)本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句