问一个关于Service的问题

jerrypiaopiao 2013-02-20 05:41:43
在重写Service的onStart方法后,发现onStart方法中的代码并未执行,有木有人知道是怎么回事?
...全文
195 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xfyunyun 2013-02-26
  • 打赏
  • 举报
回复
引用 2 楼 bjrxyz 的回复:
service有两种启动方式还可以onbind,话说onstart好像已经被废弃了,换成onstartcommand了
赞同2楼~~~
太上绝情 2013-02-25
  • 打赏
  • 举报
回复
引用 3 楼 veardn 的回复:
onStart方法只在service没启动的时候调用一次,如果service已经启动那不会调用onstart的
楼上你说的是oncreate吧
veardn 2013-02-25
  • 打赏
  • 举报
回复
onStart方法只在service没启动的时候调用一次,如果service已经启动那不会调用onstart的
太上绝情 2013-02-24
  • 打赏
  • 举报
回复
service有两种启动方式还可以onbind,话说onstart好像已经被废弃了,换成onstartcommand了
胡耀文 2013-02-20
  • 打赏
  • 举报
回复
关于调试windows service, 其实这是一个老生常谈的问题了. 通常的处理办法是, 在service运行后, 在调试器中选择attach to process. 然而这种做法也有一定的局限性, 例如在service启动时的OnStart事件中的代码, 基本上很难调试. 往往当attach到我们的service的时候, 这部分代码已经执行过了. 于是, 有人提出, 可以另写一个project来调用这个OnStart方法, 或将OnStart方法中的代码搬到另一个project中测试. 不过, 这些方法终究不是以windows服务的方式调试的, 不能够最真实的反应service运行时的执行状况(如权限问题等环境问题). 我的做法是, 在OnStart方法的最开始部分加上"Debugger.Launch()"的调用, 当service运行到此处时, 将会弹出一个选择调试器的对话框, 同时暂停在当前位置. 这样, 我们就做到了在代码中手动的启动调试器. 示例代码如下: using System.Diagnostics; public partial class MyService : ServiceBase{ public MyService(){ InitializeComponent(); } protected override void OnStart(string[] args){ #if DEBUG Debugger.Launch(); //Launches and attaches a debugger to the process. #endif // TODO: add your initialize code here. } protected override void OnStop(){ } } 调试WindowsService的OnStart函数是比较困难的也比较让人头疼的事情,用attach process的方法是不能调试OnStart函数的,在挂载时就已经执行过了。我在网上看了一些方法都是比较麻烦的,有的说是写一个console程序将OnStart函数里的代码先在console程序里调试通了再放到service中,感觉这个方法工作量太大了,^_^我是比较懒的,后来在网上看到一个很简单的方法是这样的 virtual void OnStart(String* args[]) { Debugger::Launch(); //TODO: Add code here to start your service. } 我试了这个方法后,发现还是不行,我查了msdn说Debugger::Launch()是发动和挂载到相应的进程中,他并没有breadkpoint的功能,我就想啊,要是能动态的加一个breakpoint那问题不是就解决了吗? virtual void OnStart(String* args[]) { Debugger::Launch(); Debugger::Launch(); //TODO: Add code here to start your service.这样就可以跳到这里来调试了 } 可是我们在程序中设置断点后在运行exe文件时是不会break的。既然Debugger有挂载的功能会不会也有动态设置断点的功能呢,^_^,去msdn看了下它的成员函数果然有一个方法Debugger::Break()可以动态设置断点,问题就轻松解决了。^_^。既然Debugger::Break();可以动态设置断点那么在调试windowsService的其他函数中也可以用到,那调试windowsService程序不是和调试winform程序一样简单了吗?^_^ virtual void OnStart(String* args[]) 中的参数,是在启动服务时可以传入的。 例如:>cmd sc start servicename args[0] args[1] .........

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧