后台2分钟后如何调用方法

时间:2018-06-27 04:52:10

标签: java android service

2分钟后我需要调用一个方法。我已经尝试过处理程序和计时器,但是当应用程序关闭时它不起作用。然后我有呼叫计时器在服务中,单击按钮即可启动服务,并在2分钟后停止服务。它有效,但问题是服务有时会自行调用。下面是我的代码。

MyService类

public class MyService extends Service {

private static Retrofit retrofit = null;

@Override
public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public void onCreate() {
    new CountDownTimer(120000, 1000) {
        public void onTick(long millisUntilFinished) {
            Log.d("message", "start");
        }
        public void onFinish() {
            Log.d("message", "finish");

            callMyMethod();
            stopService(new Intent(MyService.this, MainActivity.class));
        }
    }.start();
}

我从那里开始服务的MainActivity类。

stopService(new Intent(getContext(), MyService.class));
startService(new Intent(getContext(), MyService.class));

清单

<service android:name="MyService" android:enabled="true" android:exported="true"/>

注意:我只想按一下按钮即可致电服务,并在2分钟后停止服务。 请寻求帮助来解决此问题,或者如果除服务之外还有其他好的解决方案。

已更新:如果网络响应未成功,我该如何处理重试。

MyService类

public class MyService extends Service {

private static Retrofit retrofit = null;

@Override
public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public void onCreate() {
    new CountDownTimer(120000, 1000) {
        public void onTick(long millisUntilFinished) {
            Log.d("mess", "start");
        }
        public void onFinish() {
            Log.d("mess", "finish");

            selectDriverForJOb();
            stopSelf();//(new Intent(MyService.this, MainActivity.class));
        }
    }.start();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
     return START_NOT_STICKY;
}

private void selectDriverForJOb() {
    SharedPreferences sharedPreferences = getSharedPreferences("Login_credentials", MODE_PRIVATE);
    String user_id = sharedPreferences.getString("userID", null);
    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    APIServices_interface selectDriver_interface = retrofit.create(APIServices_interface.class);
    Call<SelectDriverforJobResult> call = null;
    try {
        call = selectDriver_interface.selectDriverforJob(user_id);
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (call != null) {
        try {
            call.enqueue(new Callback<SelectDriverforJobResult>() {
                @Override
                public void onResponse(Call<SelectDriverforJobResult> call, Response<SelectDriverforJobResult> response) {
                    SelectDriverforJobResult selectDriver = response.body();
                    String message = selectDriver.getMessage();
                    if(!(message.equalsIgnoreCase("success"))){

                    }
                }

                @Override
                public void onFailure(Call<SelectDriverforJobResult> call, Throwable t) {
                    Log.d("mess : ", "Error Updating ");
                    //want to retry
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
}

2 个答案:

答案 0 :(得分:2)

应用关闭后,您的服务将无法运行,请阅读background restriction。 这实际上不是Service用例。

可以解决您的问题的方法是AlarmManager。将警报精确设置为2分钟后,接收器将在触发时被调用。在使用AlarmManger之前,请先阅读setExactAndAllowWhileIdle()setExact()

或者,您也可以使用WorkManager来设置“精确作业”。但是,如果您不需要Job Constraints,这将是一个过大的杀伤力。因此,如果您的工作不取决于网络连接之类的约束或其他约束,则可以选择AlarmManger

PS :-如果您的任务取决于网络连接,则应使用WorkManager。阅读Schedule tasks with WorkManager

答案 1 :(得分:2)

在服务中覆盖onStartCommand并返回START_NOT_STICKY,它将不会重新启动

public void onStartCommand()
{
     return START_NOT_STICKY
}

并使用由stopSelf()插入的stopService(new Intent(getContext(), MyService.class));