当前位置 : 主页 > 手机开发 > android >

Android Oreo JobIntentService继续在Android 7及以下版本的后台运行,并且经常在Android

来源:互联网 收集:自由互联 发布时间:2021-06-11
我最近将我的所有服务都替换为前台服务和JobIntentService,因为在oreo及以上版本中有一些后台执行限制( https://developer.android.com/about/versions/oreo/background).根据文档,JobIntentService就像Android 7的
我最近将我的所有服务都替换为前台服务和JobIntentService,因为在oreo及以上版本中有一些后台执行限制( https://developer.android.com/about/versions/oreo/background).根据文档,JobIntentService就像Android 7的Intent Service一样.在下面,就像JobScheduler for Android 8&以上.我注意到Google提供的新JobIntentService存在问题.

Android 8&以上:

在Android 8及更高版本中连续发生崩溃.这里有一张票提到了同样的问题https://issuetracker.google.com/issues/63622293,我添加了一些极客建议的临时解决方案.

Android 7&下面:
一旦工作完成,JobIntentService就像Intent Service一样不会停止.

我在服务中实现了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年阅读谷歌文档的完整年份…哪些是无用的…没有适当的文档,没有适合其开发人员的示例代码.. !!所以我在堆栈溢出的每个帖子中提到这一点,因为它有助于节省其他人的时间.. !!

它看起来你是一个优秀的程序员;只需要对您发布的问题提供一些提示:

提示-1:

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

前台服务:

如果你需要所有的时间运行过程;什么都不会结束……一旦开始它就会在服务中使用它从其OnStartCommand返回START_STICKY.再次不建议使用,好像你想不惜一切代价实现它…那么你将不得不使用setOngoing的通知(true)哪个最终用户无法刷掉你的通知,它将保留在那里永远….

使用前台服务:

接收器也有限制;在Oreo之上,您不能通过在清单中声明它并仅通过创建接收器来使用所有接收器和意图操作…我建议只使用BootComplete权限并使用单个接收器接收boot_completed意图并调用服务在O之下并调用O之上的前台服务.现在从该前台服务中为所有人实现运行时接收器并在Ondestroy方法中取消注册它.我从来没有找到实现运行时接收器的官方示例代码,最后我已经成功实施了几个月的艰苦工作…是的,这不是一个聪明的工作,因为谷歌

何时使用前台服务:

只有你想实现广播接收器….如果你不想实现任何广播接收器;远离…….

提示-2:

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

**服务质量:**

只做一个非常微小的工作……然后退出……它必须由Stop​​Self()退出……再次,如果多次调用服务可能会导致数据丢失……同样的服务线程可以运行更多不止一次…再次,如果你想要一项服务做很多工作……使用START_STICKY ……但是不建议再次推荐我已经建议,何时在提示1中使用它.

** Intentservice的质量如下:**

执行相对较长时间运行的任务并且它只具有串行执行属性如果您反复调用同一个intentService,则所有调用将保留在队列中,并在逐个完成后逐个执行.如上所述,这不是服务中的情况.它自己结束……没有必要由开发人员结束.. !!

**独特的品质:**

一旦他们崩溃,android可以阻止他们将来调用,而不会通知你,因为它崩溃的应用程序.需要使用try-catch-exception处理它们以避免崩溃.再次……如果您在服务中实现线程,那么try-catch-exception将不会使您的应用程序崩溃…

**那么地狱&如何实施呢:**

使用FireBaseJobScedular: –

>易于使用
>使用简单的JobService
>可以运行更长或更短的时间任务……即使是所有的时间运行任务
>甚至非标准公司支持,如vivo,mi,oppo,one 3,…这需要库存 – android会对其进行更改,并提供FunTouchO,ColorOs,OxygenO等名称
>只需将电池设置更改为“不优化此应用”
>是谷歌正式支持它并建议使用它
>它创建GooglePlyService的实例并在其中运行.显然,非标准公司也不会限制谷歌应用程序执行其任务.
>在Oreo上工作..,即使我已经在Android P上测试过它,并且在Android版本5.0下作为AlarmManager任务工作.
>我仍然建议使用16以上的minsdk,目标sdk 26,好像万一你要将你的应用程序上传到谷歌播放它现在是强制性的,那个消息会听到你的消息.并编译sdk 26.
>只需将您的JobService绑定在清单中,并使用receive_boot_complete的单行权限
>只需安排它……它将在每个制造商的市场上的每个设备上启动……即使是冷启动和热启动
>它最大限度地减少了很多代码,你可以专注于实际的任务.
>任务完成后,您可以返回false以指示任务已完成,它将结束JobService.

为什么我建议,因为我是一个UNKNOwn公司的首席技术官,并且经历过许多类型的Android手机制造商的前台服务引起的问题……不是Apple和ios所以我们必须经历它.自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..

网友评论