如何在Android中处于非活动状态时运行方法

时间:2014-01-16 13:45:38

标签: java android background

无论应用当前处于活动状态还是处于活动状态,我都希望我的应用执行某些任务。

我所做的是:

private static void myCurrMethod() {
    boolean checkIn = false;
    if (1==1) {
        checkIn = true;
    }
    // Sending message
    Time now = new Time();
    now.setToNow();
    final String res = "Time is " + now.hour + ":" + now.minute + ":"
            + now.second + " stat " + checkIn;
    new Thread(new Runnable() {
        public void run() {
            try {
                Socket clientSocket = new Socket("xx.xx.xx.xx", 6790);
                DataOutputStream outToServer = new DataOutputStream(
                        clientSocket.getOutputStream());
                outToServer.writeBytes(res + '\n');
                clientSocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }).start();
    // End of it

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            myCurrMethod();
        }
    }, (TIME_INTERVAL_WIFI_EN * MS_PER_MIN));
}

套接字部分用于检查消息的发送频率。 我在使用其他应用时试过这个。如果我的手机连接到安装了ADT的电脑,它可以正常工作。但问题是,它无法正常工作,或者当我的手机未连接到我的电脑时,它可以工作几次。

我在互联网上发现有很多方法可以运行,但是当应用程序处于活动状态时,它们似乎都在后台运行。互联网上有很多东西,有些人建议使用服务,有些人建议使用AsyncTask,有些人建议使用像我这样的方式。我很困惑,最好的办法是什么?

注意:我并不是真的从我的应用中丢弃了这个。例如,如果我的应用程序根本没有启动,那么它应该不起作用。如果我的应用程序从应用程序列表中删除,那么这应该不起作用。基本上我想要的是我们可以在旧的Symbian应用程序中使用的默认行为。

1 个答案:

答案 0 :(得分:0)

应用程序不会“关闭” - 当它们不活动时它们可能会因为释放资源而被杀死,但“最近”列表并不意味着“活动”(它可能在列表中并且已经被杀死,或者不在列表仍然处于活动任务堆栈中。)

如果你想在UI线程上运行,那么使用另一个线程,AsyncTask等。只要你的应用程序运行,它们就会存在,并且即使屏幕上有另一个活动,它们也会继续运行。

如果您需要您的流程在您的活动生命周期中存活,或者在您的应用未处于活动状态时启动(或者即使活动被终止也继续运行该流程),那么您需要一项服务。

这里有很多关于SO的参考资料,以帮助实施任何解决方案。在您的特定情况下,与计算机(或充电器)的连接可能会对Android允许继续运行的活动任务数量产生影响,因此未连接时您的非活动活动将被更快地杀死。您可能需要一项服务来“完成”应用程序处于非活动状态或后台时预期会发生的任何处理。