小编Sta*_*raX的帖子

防止Android服务的多个副本

startService 的doco声明"如果此服务尚未运行,它将被实例化并启动(如果需要,为它创建一个进程);如果它正在运行,那么它仍然在运行." 我发现每次调用startService似乎都是启动一个单独的服务实例,因为服务正在进行的工作(在我的测试用例中,通常写入新的日志文件)正在为每次调用再次完成.我试图通过循环ActivityManager来检测服务... getRunningServices(Integer.MAX_VALUE))但它没有显示出来.SGS 11上的Android 2.3.3我在这里遗漏了一些东西.我知道Service的onCreate()方法只有在创建时才被调用,而且因为我在服务中运行了一个连续的进程(

在我的Activity的onResume方法中,我正在启动服务("myService"):

    Intent intent = new Intent(this, myService.class);
startService(intent);
Run Code Online (Sandbox Code Playgroud)

在MyService中,我有一个onCreate之类的

@Override 

public void onCreate(){
    super.onCreate();
    ...
Run Code Online (Sandbox Code Playgroud)

从我设置定时器的地方,使用TimerTask,它一次/秒写入日志文件.

这按预期工作 - 我可以看到正在编写的日志.在Activity的onResume方法中,在调用StartService方法之前,我通过调用包含checkForRunningService方法检查myService服务是否存在

for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
    if (service.service.getClassName().contentEquals("com.gpsanimator.startrax.myService")) {
    Toast.makeText(getApplicationContext(), "Service IS SO running: ", Toast.LENGTH_SHORT).show();
        return true;
}
Run Code Online (Sandbox Code Playgroud)

这永远不会找到myService服务,即使它似乎正在运行,因为它很乐意写入日志文件.

每次恢复我的Activity时,我的myService服务的onCreate方法被调用 - 它生成一个新的日志文件并开始写入它以及不断更新的原始日志文件.第一次调用startService时服务是否启动?然后继续跑?后续调用startService()是否应该发现服务已经运行,因此不会再次触发onCreate()方法?但那不是我所看到的.似乎每次调用startService()都会触发Service的onCreate()方法.

这显然比这更复杂,我想深究它.

service android android-service

17
推荐指数
2
解决办法
2万
查看次数

如何从Android GPS位置获取准确的时间戳

我正在尝试使用我的requestLocationUpdates中使用GPS_PROVIDER的位置监听器上的location.getTime获取位置的GPS时间.我期待所提供的时间是从GPS时钟开始的时间 - 精确到十亿分之一秒,但是四舍五入到毫秒.我得到的东西取决于平台,但肯定似乎不是我所期待的.
在SGS 11 - Android 2.3.3上,返回的值始终是精确的秒,毫秒部分始终为.000.根据我对GPS的经验,我似乎不太可能在整个第二个时间间隔内完全发生GPS的每次轮询.
在HTC-A7275 Android 2.3.3上 - 我得到了手机的系统时间,当然不是GPS时间.
我通过弄乱手机的时间和检查位置时间来证实了这些发现.
SGS 11上的NMEA句子中的时间戳提供给3秒的3位小数,但在HTC上,它们都是xxx.0.使用NMEA的问题在于,从MNEA获取日期和时间以及完整位置真的很麻烦:只有GPGGA句子中有高度,但它没有日期戳,所以它在UTC午夜左右变得棘手.
我正在寻找精确的时间 - 最好是我的轨道记录器的毫秒,这样我就可以可靠地比较来自不同玩家的曲目.还有人在这方面做过更多的工作吗?

time gps android location

6
推荐指数
1
解决办法
4202
查看次数

WatchKit_Extension.InterfaceController没有实现委托方法

我正在尝试使用一个简单的应用程序学习watchkit连接,并花了两天徒劳地研究这个错误:

{app name} _WatchKit_Extension.InterfaceController不实现委托方法.

我已经盲目地复制了"SimpleWatchConnectivity" https://developer.apple.com/library/content/samplecode/SimpleWatchConnectivity/Listings/SimpleWatchConnectivity_WatchKit_Extension_InterfaceController_swift.html演示代码中的代码.并且在没有成功的情况下搜索了论坛.

我的代码构建并运行正常,但我在手表上收到以下错误

2018-01-06 10:39:20.522995 + 1100 messageDemo WatchKit Extension [338:743006] [WC] - [WCSession onqueue_handleDictionaryMessageRequest:withPairingID:] _ block_invoke委托messageDemo_WatchKit_Extension.InterfaceController没有实现委托方法2018-01-06 10:39: 20.524378 + 1100 messageDemo WatchKit扩展[338:743006] [WC] - [WCSession _onqueue_sendResponseError:identifier:dictionaryMessage:]标识符:A150D814-453C-44B7-B970-913697526D6A,带有WCErrorCodeDeliveryFailed

当我执行时:

2018-01-06 10:39:20.522995+1100 messageDemo WatchKit Extension[338:743006] [WC] -[WCSession onqueue_handleDictionaryMessageRequest:withPairingID:]_block_invoke delegate messageDemo_WatchKit_Extension.InterfaceController does not implement delegate method
2018-01-06 10:39:20.524378+1100 messageDemo WatchKit Extension[338:743006] [WC] -[WCSession _onqueue_sendResponseError:identifier:dictionaryMessage:] identifier: A150D814-453C-44B7-B970-913697526D6A with WCErrorCodeDeliveryFailed
Run Code Online (Sandbox Code Playgroud)

来自iOS ViewController.

我的界面控制器如下:

if (WCSession.isSupported())  
    {  
        WCSession.default.delegate = self;  
        WCSession.default.activate()  

        if let messageText =  textField.text{  
             WCSession.default.sendMessage(["message": messageText]  
                ,replyHandler: {replyMessage in …
Run Code Online (Sandbox Code Playgroud)

swift apple-watch watchkit watchconnectivity

4
推荐指数
1
解决办法
1783
查看次数