我有一个 VOIP 应用程序,我需要在设备启动时在后台登录该应用程序。
目前我的应用程序的初始化是在 UI Active(onCreate()) 上完成的。
我脑子里有以下事情,谁能帮我解开疑惑。
远程服务 (AIDL) 或本地服务?为什么?UI 和Service 交互是如何发生的?UI 激活后,谁得到回调? UI 还是 Service?Service 作为我的 Controller,即 Service 到 UI 数据传递反之亦然?示例应用:Skype。
最佳答案
所以有很多方法可以实现你想要的,关键是什么更适合你的风格和设计。希望您会发现这些信息有用。
对于启动时在后台登录的应用程序,有几个选项。您首先需要的是 BroadcastReceiver,它在 list 中被定义为接收器。让 BroadcastReceiver 捕捉 ACTION_BOOT_COMPLETED Intent 。从这里您可以启动您的服务。这导致 #2。
如果您所做的只是 RESTful 调用,那么 IntentService 确实是理想的选择。 IntentService之间的区别和一个 Service很简单:一个 IntentService 从主线程运行,执行它的“代码”然后死掉。然而,一个服务在主线程上运行(这是一个重要的事实)并且运行时间很长,所以必须告诉它 stopSelf() .更进一步,与 Activity 相比,服务也不太可能被杀死(应用程序组件被杀死以便为新启动的应用程序腾出内存空间),即。它需要更高的优先级。该服务也可以声明为 foreground需要通知但给予更高优先级的服务。我认为在您的情况下,服务将是完美的。
一旦您的 UI( Activity )打开,连接到服务的最佳方式是 Binder .如果需要,这将允许从不同的应用程序/组件到服务的多个接口(interface)。 AIDL 是非常酷的东西,但根据我的经验,管理起来要困难得多,因为所有参数都必须是原始参数或 Parcables。 AIDL 也较慢且效率较低,因为它实际上是一种 IPC 形式。当服务以 Intent 启动时,将调用 onStartCommand() 方法。如果服务由尝试绑定(bind)到它的应用程序启动,则调用 onBind() 方法。但是您可以使用 Intent 启动服务,然后绑定(bind)到它。如果您更喜欢只需要快速调用数据的 RESTful 方法,您可以使用带有 ResultReceiver 的 IntentService。 . This is a great article如果您对 IntentService 和 ResultReceiver 感兴趣,则写了关于 Google I/O 示例的文章,并且总体上实现得很好。
这取决于你。使用 Binder 或 AIDL,您的 Activity 可以调用服务方法,就像调用对象方法一样,其中“回调”只是方法返回。如果您使用 ResultReceiver,则与 Receiver 接口(interface)的 Activity 将是回调。您也可以来回传递 Intents,但这可能会变得困惑。对于您的情况,Binder 方法和 Receiver 一样好。
将服务视为 MVVM 系统中的模型 - 将其用作从中获取数据的助手,而不是控制应用程序逻辑的东西。
抱歉,如果这看起来很困惑,有很多方法可以实现您正在寻找的东西。这只是什么最适合您的情况,您“感觉”更好的问题。更不用说 Android SDK 相当大了。我试图捕获所有可以帮助你的主题。祝你好运!
关于安卓 : Do Application Login in background on boot-up,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10331388/
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
在我的schedule.rb文件中,我有以下几行:set:output,'/log/cron_log.log'every5.minutesdocommand'echo"hello"'end我按照这个问题Rails,usingwhenevergemindevelopment中的建议运行了whenever-w,并且我假设cronfile已编写并正在运行。(我也尝试重新启动Rails服务器。)当我运行$crontab-l时,我看到以下内容:0,5,10,15,20,25,30,35,40,45,50,55****/bin/bash-l-c'echo"hello">>/log/cron_log
我已经安装了DeviseonRails4.2.0,一切似乎都在工作,我使用了以下指南:http://sourcey.com/rails-4-omniauth-using-devise-with-twitter-facebook-and-linkedin/我的设计模块是:devise:database_authenticatable,:registerable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:omniauthable唯一的问题是,如果我尝试通过转到注册页面创建一个新帐户,然后在输入我的电子邮
为了防止在迁移到生产站点期间出现数据库事务错误,我们遵循了https://github.com/LendingHome/zero_downtime_migrations中列出的建议。(具体由https://robots.thoughtbot.com/how-to-create-postgres-indexes-concurrently-in概述),但在特别大的表上创建索引期间,即使是索引创建的“并发”方法也会锁定表并导致该表上的任何ActiveRecord创建或更新导致各自的事务失败有PG::InFailedSqlTransaction异常。下面是我们运行Rails4.2(使用Acti
x={:name=>"John",:data=>{:physical=>{:age=>25,:weight=>150}}}我希望将数据的子属性向上移动一个级别(但不一定只是简单地展平所有属性)。在这种情况下,我基本上想将:physical属性“向上”移动一个级别。我正在尝试这个y=x[:data']y.each{|key|x[key]=y[key]}但是我得到...x=x.except(:data)=>{:name=>"John",[:physical,{:age=>25,:weight=>150}]=>nil}我在找...=>{:name=>"John",:physical=>{:a
我在我的Rails4应用程序中使用resque和resque_scheduler。我的应用程序正在为resque提供一些工作,但工作人员没有在处理这些工作。reque-web显示没有失败。我已经通过运行开始resqueworkerQUEUE=kqueuerakeenvironmentresque:work我的rails控制台2.0.0p353:006>Resque.info=>{:pending=>0,:processed=>0,:queues=>0,:workers=>1,:working=>0,:failed=>0,:servers=>["redis://localhost:637
我经常有这样一种情况,我想做一些条件逻辑,然后返回一部分条件。如何在不重复true或false表达式中的条件部分的情况下执行此操作?例如:ClassName.method.blank??false:ClassName.method有没有办法避免重复ClassName.method?这是一个真实世界的例子:PROFESSIONAL_ROLES.key(self.professional_role).nil??948460516:PROFESSIONAL_ROLES.key(self.professional_role) 最佳答案 假设
我已经安装了ruby2.1.6,vagrant1.7.2abdvirtualbox4.3.28。第一个vagrantup工作正常,盒子被下载,服务器工作,但是当我运行halt然后尝试另一个vagrantup我得到下面的ruby错误信息C:/Users/Mike/.vagrant.d/gems/gems/childprocess-0.5.6/lib/childprocess/windows/lib.rb:308:[BUG]Segmentationfaultruby2.0.0p353(2013-11-22)[i386-mingw32]//lotsofoutputlistingrubyf
我为“消息”创建了一个脚手架,并且new_message_path和edit_message_path(用于link_to's)都已设置,但现在我已经创建了app/views/messages/sent.html.erb,我想做类似的内容,但我不知道该怎么做。我明白了undefinedlocalvariableormethod`sent_message_path'for# 最佳答案 这些方法是在定义路由时自动创建的,对于RESTful路由,它们遵循可预测的约定。运行“rakeroutes”是查看生成的所有路由的有用方法。我建议您阅读
快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目