jjzjj

Android Oreo JobIntentService继续在Android 7及以下版本的后台运行,并在Android 8及更高版本中经常崩溃

coder 2023-11-30 原文

我最近将所有服务替换为前台服务和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 ");
        }
    }
    }

为了避免JobIntentService崩溃,我从https://issuetracker.google.com/issues/63622293引用了一些内容
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.



我已经在阅读谷歌文档中失去了整整2年的时间... use-less ...与no proper documentationno proper sample codes for its developers .. !!所以我在stack-overflow的每篇文章中都提到了这一点,因为这将有助于节省其他人的时间。

看来您是一名优秀的程序员;只需要一些hints to your posted question:

提示1:

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,这不是一项明智的工作

何时使用前台服务:

仅当您想要实现广播接收器时。...如果您不想实现任何广播接收器;远离.......

提示2:

YOU :- I have recently replaced all my service to foreground services and JobIntentService



**服务具有以下品质:**

只是做一个很小的工作...然后退出...它必须由S BootComplete退出...同样,如果多次调用receiver ...由于同一服务线程可以运行多次...再次如果您想要一项服务来做很多工作...请使用boot_completed ...但还是不建议这样做,我已经建议过,何时在提示1中使用它。

** Intentservice具有以下品质:**

做一个运行时间相对较长的任务,它具有service如果您一次又一次调用相同的topSelf(),则所有调用都将保留在Services can cause data-loss中,并在完成START_STICKY后执行property of execution serially only。如上所述,服务中的情况并非如此。它本身就结束了...不需要由开发人员结束.. !!

**所有产品的独特品质:**

一旦他们成为intentService,Android便可以在以后停止调用,而不会在崩溃时通知您。需要使用queueone by one处理它们。再次...如果为one by one,则为crashed try-catch-exception ...

**那么,什么以及如何实现:**

使用avoid crash:-
  • 易于使用的
  • 使用简单的JobService
  • 可以运行更长或更短的时间任务... 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的名称
  • 只需要将电池设置更改为“请勿优化此应用”即可。
  • 是google正式支持它,建议使用它
  • 它创建FireBaseJobScedular的实例并在其中运行,而且显然非标准公司也不会限制google应用执行其任务。
  • 适用于EVEN ALL THE TIME RUNNING TASK ..,即使我已经在EVEN SUPPORTED BY NON STANDARD COMPANIES上对其进行了测试,并且在Android 5.0以下版本中都可以作为stock-android任务运行。
  • 仍然我还是建议使用GooglePlyServiceOreo,好像万一您要将应用程序上载到Android P一样,现在是强制性的,并且会听到您的消息。和AlarmManager
  • 只需将您的minsdk above 16绑定(bind)到 list 中,并使用target sdk 26的单行许可权
  • 只需对其进行调度...它将在每个制造商的市场上的每台设备上启动...甚至在google playcompile 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 tasks and project is related to... and what you exactly wants to be done in a foreground 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/

    有关Android Oreo JobIntentService继续在Android 7及以下版本的后台运行,并在Android 8及更高版本中经常崩溃的更多相关文章

    1. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

      我在我的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服务器更新战俘

    2. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

      我正在尝试修改当前依赖于定义为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之间的所有版本,你可以这

    3. ruby - 即使失败也继续进行多主机测试 - 2

      我已经构建了一些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

    4. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

      如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

    5. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

      我安装了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

    6. ruby - 继续,未定义 callcc 方法 - 2

      我想学习一些关于Continuation的知识,使用callcc方法从一些文章中键入几个示例,但我遇到了错误:NoMethodError:undefinedmethod`callcc'formain:Objectfrom(pry):2:in`'没有文章提到包含延续库。那么如何解决这个问题呢?谢谢编辑:ruby1.9.2p290(2011-07-09修订版32553)[x86_64-linux] 最佳答案 您需要要求“继续”。require'continuation' 关于ruby-继续,

    7. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

      有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

    8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

      在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

    9. ruby - 安装libv8(3.11.8.13)出错,Bundler无法继续 - 2

      运行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

    10. 安卓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,打开命令窗口,并将路

    随机推荐