当屏幕进入睡眠状态时,应用似乎停止工作

时间:2011-03-17 21:15:24

标签: android

我正在使用AsyncTask来执行CPU密集型长时间运行(几个小时)。随着它的继续,它会更新屏幕上的进度条,以显示完成任务的百分比。

我发现当我的屏幕进入睡眠状态(超时)时,任务似乎停止了。不确定这是否因为AsyncTask停止或者在尝试更新屏幕时遇到困难(后者我在考虑)。

除了永不让屏幕睡眠之外,我还能阻止我的AsyncTask停止执行吗?如果这是唯一的方法,那么我该如何确保屏幕不会睡眠?

编辑:我必须补充说,我知道这听起来像一个非用户友好的应用程序,如下面的某个人评论。这是一项非常专业的任务(处理数千个图像文件以比较不同系统上的处理),将由内部少数用户使用,而不是公开发布。

3 个答案:

答案 0 :(得分:21)

这是预期的行为。这个想法是,由于应用程序不好,手机的电池不应该耗尽。如果屏幕关闭,用户通常希望手机睡眠。

如果您需要运行应用,可以使用WakeLock保持手机正常运行(关闭屏幕):Documentation herehere

请注意,唤醒锁定需要获得WAKE_LOCK权限,同样,您需要向用户明确说明您的应用会在关机时喝掉手机的奶昔。

答案 1 :(得分:6)

不确定是否有人会读到这个,因为OP已经好几年了,但是我在同一条船上我需要使用唤醒锁用于内部使用的应用程序,并且让屏幕保持开启状态不对(我只是需要cpu所以我可以运行一些指标查询)我只是使用部分唤醒锁;即:

public class my_frag extends Fragment {
    WakeLock wl; 


    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    setRetainInstance(true);        
    PowerManager pm = (PowerManager) this.getActivity().getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");  

    //I happen to have it in a button click event based on an async task 
    //Side note: I should probably be using a Loader for my Async task but this works fine 
    connectButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if (metrics_task != null)
            {
            Status s = metrics_task.getStatus();
            if (s.name().equals("RUNNING")){
                if (metrics_task.running){
                metrics_task.cancel(true);
                connectButton.setText("Start");
                metrics_task.running = false;
                wl.release(); <--releases it on async stop
                }
                else{
                    metrics_task = new start_metrics(ae);
                    metrics_task.execute();
                    wl.acquire(); <--starts it on async start
                }
            }
            else{

                metrics_task = new start_metrics(ae);
                metrics_task.execute();

            }
            }
            else{
                metrics_task = new start_metrics(ae);
                metrics_task.execute();
            }
        }
    });

这很好用但没有问题

答案 2 :(得分:1)

我在这篇旧帖子上花了2美分,以防有人帮忙。如果您只想阻止屏幕进入睡眠状态,那么这是一个简单的解决方案,无需用户许可 - 而且只需2行代码:

// prevent the screen from sleeping
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

// do your stuff

// don't forget to re-enable the screen time-out so it won't stay awake from now on
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

重要提示:它只能在Activity内调用 - 而不能在其他应用组件中调用。可以找到更多详细信息here