草庐IT

android - IntentService 未触发

coder 2023-12-03 原文

我的应用程序通过 Web 服务调用将数据与远程数据库同步。我在 IntentService 中进行这些调用,以便它们可以在后台运行(我称之为 SyncService)。

启动我的 IntentService 的代码如下所示:

Intent intent = new Intent();
intent.setClass(appContext, SyncService.class);

// place additional values in intent
intent.putExtra("data_type", SyncService.ITEM_TRACKING);
intent.putExtra("user_id", intUserId);

// call SyncService
appContext.startService(intent);

这通常看起来很棒。但是,我的一位 friend 也是我应用程序的用户,他经常告诉我他的数据没有同步并显示在我们的网站上。当我在场时,他的设备恰好显示了这些症状。我将他的设备插入我的计算机,这是我发现的:

  • 启动 SyncService 的代码(即:上面的代码)被命中。
  • 我在 IntentService 的 onHandleIntent 方法中设置了一个断点,它从未被命中。
  • 我检查了他设备的运行服务列表,发现 SyncService 在那里并正在运行。有趣的是,它已经运行了大约 20 分钟。我的印象是 IntentService 在没有要处理的 Intent 时自杀了。
  • 我强行停止了 SyncService(而不是应用程序),突然之间,onHandleIntent 开始反复受到攻击。就好像所有 Intent 都在设备上的某个地方排队,现在才被扔到 SyncService。

有没有人知道可能是什么问题?你认为这是我的应用程序的问题吗?使用 Android?

再次,我向 Android 传递一条消息,说“启动此 IntentService 或将消息发送到已经运行的 IntentService”。那时,我无法控制。消息永远不会到达 IntentService。一旦我强制退出应用程序,消息就会发送到 IntentService 并完成它的工作。

更新:我认为这段代码很好,但我会把它放上去,因为你们中的很多人可能都想看它。

进入 IntentService 的每个 Intent 都有一个 Extra 表示对我发出的调用的“类型”(即:我调用这个网络服务还是那个网络服务等)。当 Intent 进入 IntentService 时,我会检查“类型”,如果队列中已经有该类型的 Intent,我会向它添加一个名为“skip”的 Extra,因此,当它到达时,我不会t 执行搜索(基本上 IntentService 可以构建很多 Intent,并且在 20 秒前调用 this web 服务时调用 this web 服务没有意义)。它基本上可以防止应用程序向网站发送垃圾邮件。

重要的是要注意无论如何都不会命中此代码(一旦问题开始出现)。 onStartCommand 在应用被终止之前不会被调用

    @Override
    public int onStartCommand (Intent intent, int flags, int startId) {
        // here be dragons
        // overriding this method and adding your own code is dangerous. i've wrapped
        // my code in a try/catch because it is essential that the super method be called
        // every time this method is entered. any errors in my code should not prevent this
        // or the app will explode.
        try {
            if (flags == 0 && intent != null && intent.hasExtra("data_type")) {
                Integer intDataType = intent.getExtras().getInt("data_type");

                    if (!mCurrentTypes.containsKey(intDataType)
                            || !mCurrentTypes.get(intDataType)) {
                        mCurrentTypes.put(intDataType, true);  // put this type in the list and move on
                    }
                    else {
                        intent.putExtra("skip", true);  // mark this Intent to be skipped
                    }
            }
        }
        catch (Exception e) {
            // Log.e("Error onStartCommand", "error: " + e);
        }

        return super.onStartCommand(intent, flags, startId);
    }


private void processIntent(Intent intent) {
        // do stuff if no "skip" Extra
        mCurrentTypes.put(intDataType, false);
    }

最佳答案

肯定有一些东西可以让您的服务在您 friend 的设备上运行。如果是这样,对该 Intent 服务的所有后续调用都将排队,直到当前调用完成。如果它没有完成,那么你将得到你所拥有的:下一个服务将不会启动。

你应该仔细检查:

  • 你给网络操作适当的超时
  • 您为网络连接操作设置适当的超时时间
  • 线程之间没有竞争条件。
  • 您记录服务内部可能发生的任何异常,您不想丢失此类信息。

之后,如果您认为一切正常:只需记录服务所做的事情并使用一些错误报告机制使其自动从您 friend 的设备发送。一个简单的解决方案可能是使用 bugsense 或等同物。

接下来,放置某种看门狗:一个线程将继续运行直到您的服务停止(您只需告诉您的线程在服务停止时停止)。过了某个时间限制后,该线程将不得不停止您的服务。

这个看门狗线程可以放在服务本身内部,也可以放在外部,尽管这样放置起来可能更复杂。

关于android - IntentService 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11347038/

有关android - IntentService 未触发的更多相关文章

  1. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  2. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  3. ruby-on-rails - 如何在 Rails Controller Action 上触发 Facebook 像素 - 2

    我有一个ruby​​onrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  6. ruby-on-rails - Ruby method_added 回调不触发包括模块 - 2

    我想写一点“Deprecate-It”库并经常使用“method_added”回调。但是现在我注意到在包含模块时不会触发此回调。是否有任何回调或变通方法,以便在某些内容包含到自身时通知类“Foobar”?用于演示的小Demo:#IncludingModulswon'ttriggermethod_addedcallbackmoduleInvisibleMethoddefinvisible"Youwon'tgetacallbackfromme"endendclassFoobardefself.method_added(m)puts"InstanceMethod:'#{m}'addedto'

  7. javascript - jQuery 的 jquery-1.10.2.min.map 正在触发 404(未找到) - 2

    我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文

  8. ruby - 为什么触发器运算符包含第二个条件? - 2

    以下代码使用了触发器运算符。(1..10).each{|x|print"#{x},"ifx==3..x==5}为什么结果是3,4,5?我觉得应该是3,4。如教程中所述,此表达式在x==3时为真,并一直为真,直到x==5。如果“5”的计算结果为false,如何打印它?谁能为我澄清一下? 最佳答案 来自“TheRubyProgrammingLanguage”的重要链接是:4.6.9.1Booleanflip-flopsWhenthe..and...operatorsareusedinaconditional,suchasanifstat

  9. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  10. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

随机推荐