【问题标题】:Handler postdelayed is not fired after given delay interval when quitting the app in android?在android中退出应用程序时,在给定的延迟间隔后不会触发处理程序postdelayed?
【发布时间】:2015-08-05 12:20:41
【问题描述】:

代码片段:

Handler handler= new Handler();
handler.postDelayed(networkRunnable,
                10000);

/**
 * A runnable will be called after the 10 second interval
 */
Runnable networkRunnable= new Runnable() {
    @Override
    public void run() {
        //Not fired if I quit the app before 10 seconds after 1 second. 
    }
};

设置处理程序发布延迟 10 秒后触发。如果我在 1 到 10 秒之间退出应用程序,则永远不会调用 run 方法。

请帮帮我。

提前致谢。

【问题讨论】:

    标签: android handler runnable postdelayed


    【解决方案1】:

    Android 运行时积极管理进程生命周期,在进程的入口点关闭时(例如,当最后一个活动完成时)销毁进程。话虽如此,我不知道上面的代码会在没有额外逻辑的情况下可靠地执行回调的任何执行环境。

    如果您希望调用确定触发,您需要向 Android 核心注册一个服务并使用服务线程的处理程序来安排调用。 Android 将(通常)保持服务运行,稍后将触发您的调用。然后,您还应该在调用中取消注册服务以释放系统资源。

    【讨论】:

    • 通过从我的警报接收器启动意图服务进行检查。这也不起作用,因为我正在设置延迟的 15 秒和 10 秒处理程序。所以之前把那个意图服务叫出来了。那么如何尝试使用 android 服务。
    • @MVignesh 我不确定我明白你在说什么。您是否正在启动一项服务以响应保持 10 秒呼叫的警报,但呼叫仍未触发?
    • 警报接收器内部我将启动服务。具有 10 秒后延迟处理程序的服务代码。还可以吗?
    • 立即一次又一次调用同一个服务会发生什么。
    • 对服务使用单例模式——确保首先获得服务的句柄,并且仅在句柄尚未填充时才实例化服务。跟踪您有多少未完成的呼叫,并且仅在该计数器归零后关闭服务。最后,您需要一个同步块,以确保在为计数器提供服务时不会发生针对您的服务的调用——也就是说,计数器在达到零后不会返回到非零,并且没有调用钩住一个垂死的服务实例。做到这一点并不容易。
    【解决方案2】:

    为了实现这一点,我使用了一个 AlarmManager 而不是处理程序,它现在正在工作,这是我正在使用的代码的摘录:

    @Override   
    protected void onHandleIntent(Intent intent) {
        Log.d(Constants.TAG, "onHandleIntent");
        ...
        restartService();
        Log.d(Constants.TAG, "finish");   
    }
    
    private void restartService() {
       AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
       Intent queryIntent = new Intent(context, ServiceClass.class);
       PendingIntent pendingQueryIntent = PendingIntent.getService(context, 0, queryIntent,
        PendingIntent.FLAG_UPDATE_CURRENT);
        // schedule the intent for future delivery
        alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + Constants.RESTART_TIME, pendingQueryIntent);
    }
    

    通过这种方式,无论用户使用主页、返回或从最近的应用中滑动关闭应用,我都能重新启动服务,它停止工作的唯一方法是使用强制应用停止。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      相关资源
      最近更新 更多