【问题标题】:Is it possible to execute network tasks in onTaskRemoved?是否可以在 onTaskRemoved 中执行网络任务?
【发布时间】:2018-08-13 04:17:07
【问题描述】:

当我的应用程序完全关闭时(从背景中清除)我需要将我的请求发布到服务器并且当响应服务停止工作时,这是我的服务类:

public class OnClearFromRecentService extends Service {

    private SharedPreferences prefs;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("ClearFromRecentService", "Service Started");

        return START_STICKY;
    }

    @Override
    public void onDestroy() {

        super.onDestroy();
        Log.d("ClearFromRecentService", "Service Destroyed");

    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {

        Log.e("ClearFromRecentService", "END");

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(App.baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        RequestInterface requestInterface = retrofit.create(RequestInterface.class);

        String authorization = prefs.getString("token_type","")+" "+prefs.getString("access_token","");

        Call<JsonArray> response = requestInterface.AppOff(ChatList.offline_user,authorization);

        response.enqueue(new Callback<JsonArray>() {
            @Override
            public void onResponse(Call<JsonArray> call, retrofit2.Response<JsonArray> response) {

                String asd = "asd";



                stopSelf();
            }

            @Override
            public void onFailure(Call<JsonArray> call, Throwable t) {

                Log.d(t.getLocalizedMessage(),"failed");

                stopSelf();

            }
        });


    }

清单中的定义:

 <service android:name="com.iranMobleh.OnClearFromRecentService" android:stopWithTask="false" />

并从 MainActivity 启动服务,如下所示:

 startService(new Intent(this, OnClearFromRecentService.class));

似乎这段代码是真的,但问题是当应用关闭时它不能等待改造响应

【问题讨论】:

    标签: android android-service


    【解决方案1】:

    首先,如果您设置了android:stopWithTask="false",那么onTaskRemoved 将不会被调用。所以设置为android:stopWithTask="true"。请参阅 Service Documentation

    现在我们转向解决方案。您必须将您的网络服务调用放入新的服务/作业中。并在调用onTaskRemoved 时通过AlarmManagerWorkManagerEvernoteJobsJobScheduler 启动该服务/作业。

    而不是再次写同样的东西。我发现两个很好的答案非常适合您的要求。 This & This

    上面的答案只有一个变化。我认为 EvernoteJobs 或 WorkManager 会比 AlarmManager 更好。

    很容易实现。

    public class DemoSyncJob extends Job {
    
        public static final String TAG = "job_demo_tag";
    
        @Override
        @NonNull
        protected Result onRunJob(Params params) {
            // run api call here
            return Result.SUCCESS;
        }
    
       public static void runJobImmediately() {
        int jobId = new JobRequest.Builder(DemoSyncJob.TAG)
                .startNow()
                .build()
                .schedule();
        }
    }
    

    访问 Evernote-jobs 页面进行集成。

    更新

    您必须使您的项目与库兼容。这是库使用的版本。因此,请确保您使用的是最低限度的这些版本。

    ext {
        compileSdkVersion = 26
        targetSdkVersion = compileSdkVersion
        minSdkVersion = 14
    
        buildToolsVersion = '27.0.3'
    
        supportLibVersion = '26.1.0'
    }
    

    【讨论】:

    • 我如何下载这个?因为我尝试了很多次,发现下载库有问题,你之前测试过吗?还是给我解释一下?
    • 你好像是Android新手,兄弟,你不需要下载它。
    • 您只需将implementation 'com.evernote:android-job:1.2.6' 添加到您的build.gradle 和同步项目中。通过添加类似的依赖项,您的项目将自动添加它。
    【解决方案2】:

    使用 WorkManager 在后台运行工人类。

    或者使用 Evernote 的 android-job。

    evernote android-job 库的链接:https://github.com/evernote/android-job

    【讨论】:

      【解决方案3】:

      你可以更好地尝试在服务类中使用onDestroy 方法,因为如果应用程序被强制关闭,则有时不会调用onTaskRemoved 方法,所以我建议在服务类中使用onDestroy 方法,

      您可以使用 Intent Service 来实现您的目标,在 onDestroy() 中使用该服务

      你可以看看下面的例子。

      http://stacktips.com/tutorials/android/creating-a-background-service-in-android

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多