gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:42:13 26 4
gpt4 key购买 nike

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

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com