我最近将所有服务替换为前台服务和JobIntentService,因为在oreo及更高版本中存在一些后台执行限制(https://developer.android.com/about/versions/oreo/background)。根据文档,JobIntentService的行为类似于适用于Android 7及更高版本的Intent Service,行为类似于JobScheduler(适用于Android 8及更高版本)。我注意到Google提供的新JobIntentService中存在问题。
Android 8及更高版本:
在Android 8及更高版本中不断发生崩溃。这里有一张票提到了同样的问题https://issuetracker.google.com/issues/63622293,我添加了一些极客建议的临时修复程序。
Android 7及以下版本:
一旦工作完成,充当Intent Service的JobIntentService不会停止。
我已经在服务中实现JobIntentService,只要用户执行某些操作,该服务就会触发。
代码
public class SampleJobIntentService extends FixedJobIntentService {
public static void postData(Context context, String data) {
Intent intent = new Intent(context, SampleJobIntentService.class);
intent.setAction(INITIAL_ACTION);
intent.putExtra(SAMPLE_ID, data);
SampleJobIntentService.enqueueWork(context,intent);
}
public static void enqueueWork(Context context, Intent work) {
SampleJobIntentService.enqueueWork(context, SampleJobIntentService.class, JOB_ID, work);
@Override
protected void onHandleWork(@NonNull Intent intent) {
if (intent != null) {
SampleRequest sampleRequest = requests.get(intent.getAction());
if (sampleRequest != null) {
try {
// perform some networking operations
} catch (Exception ex) {
Log.d("Error for intent ");
}
Log.i("send action ");
} else
Log.e("action not found for ");
}
}
}
public abstract class FixedJobIntentService extends JobIntentService {
@Override
GenericWorkItem dequeueWork() {
try {
return new FixedGenericWorkItem(super.dequeueWork());
} catch (SecurityException ignored) {
doStopCurrentWork();
}
return null;
}
private class FixedGenericWorkItem implements GenericWorkItem {
final GenericWorkItem mGenericWorkItem;
FixedGenericWorkItem(GenericWorkItem genericWorkItem) {
mGenericWorkItem = genericWorkItem;
}
@Override
public Intent getIntent() {
if (mGenericWorkItem != null) {
return mGenericWorkItem.getIntent();
}
return null;
}
@Override
public void complete() {
try {
if (mGenericWorkItem != null) {
mGenericWorkItem.complete();
}
} catch (IllegalArgumentException ignored) {
doStopCurrentWork();
}
}
}
}
最佳答案
Well..., Its a lot big theory...!! It would not be able to put it all here. I will try my best which will make some your concepts clear.
use-less ...与no proper documentation和no proper sample codes for its developers .. !!所以我在stack-overflow的每篇文章中都提到了这一点,因为这将有助于节省其他人的时间。hints to your posted question:YOU :- I have recently replaced all my service to foreground services and JobIntentService
ALL THE TIME RUNNING PROCESS; WHICH WILL NEVER END... ONCE IT IS STARTED,则将其用于服务中,该服务会从START_STICKY返回OnStartCommand。还是不建议您使用它,就像您想不惜一切代价实现它一样...然后,您将不得不使用带有setOngoing(true)的通知,该通知最终用户将无法永久删除您的通知。 ..Oreo以上版本之上,您不能通过在 list 中声明它并仅通过使其成为接收者来使用所有接收者和 Intent Action 。在O之下,并在O之上调用前台服务。现在,您将从该前台服务实现所有对象的运行时接收器,并在Ondestroy方法中注销它。我从未找到用于实现运行时接收器的正式示例代码,最后经过数月的辛苦工作,我终于成功实现了它。是的,由于Google,这不是一项明智的工作YOU :- I have recently replaced all my service to foreground services and
JobIntentService
BootComplete退出...同样,如果多次调用receiver ...由于同一服务线程可以运行多次...再次如果您想要一项服务来做很多工作...请使用boot_completed ...但还是不建议这样做,我已经建议过,何时在提示1中使用它。service如果您一次又一次调用相同的topSelf(),则所有调用都将保留在Services can cause data-loss中,并在完成START_STICKY后执行property of execution serially only。如上所述,服务中的情况并非如此。它本身就结束了...不需要由开发人员结束.. !!intentService,Android便可以在以后停止调用,而不会在崩溃时通知您。需要使用queue到one by one处理它们。再次...如果为one by one,则为crashed try-catch-exception ...avoid crash:-you are implementing threads within services try-catch-exception(例如vivo,mi,oppo,one + 3,...)需要will not save your application from being crashing对其进行更改,并提供诸如FunTouchOs,ColorOs,OxygenOs的名称FireBaseJobScedular的实例并在其中运行,而且显然非标准公司也不会限制google应用执行其任务。 EVEN ALL THE TIME RUNNING TASK ..,即使我已经在EVEN SUPPORTED BY NON STANDARD COMPANIES上对其进行了测试,并且在Android 5.0以下版本中都可以作为stock-android任务运行。 GooglePlyService,Oreo,好像万一您要将应用程序上载到Android P一样,现在是强制性的,并且会听到您的消息。和AlarmManager。 minsdk above 16绑定(bind)到 list 中,并使用target sdk 26的单行许可权google play和compile sdk 26上JobService最小化。 receive_boot_complete表示任务已完成,它将结束JobService。 cold boot很好的公司的hot boot,并且在许多类型的android手机制造商中都经历过you can focus on actual tasks引起的问题...这不是return false,所以我们必须经历它。从过去的18年以来一直保持开发人员的身份,我现在也大部分都在编码...在所有开发项目中,其开发策略仅由我自己考虑。Correct me ... too... As you have not mentioned
what your tasksandprojectis related to... and what you exactly wants to be done in aforeground service and intent-service... Let me know..., It would be my pleasure to help you. It is a general theoretical answer rather than what you wants.... But for giving you actual answer i will need exact your project scope..
关于Android Oreo JobIntentService继续在Android 7及以下版本的后台运行,并在Android 8及更高版本中经常崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51627968/
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
我想学习一些关于Continuation的知识,使用callcc方法从一些文章中键入几个示例,但我遇到了错误:NoMethodError:undefinedmethod`callcc'formain:Objectfrom(pry):2:in`'没有文章提到包含延续库。那么如何解决这个问题呢?谢谢编辑:ruby1.9.2p290(2011-07-09修订版32553)[x86_64-linux] 最佳答案 您需要要求“继续”。require'continuation' 关于ruby-继续,
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路