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

Android 当屏幕进入睡眠状态时,应用程序似乎停止工作,android,Android,我有一个CPU密集的长时间运行的操作(几个小时),我使用AsyncTask来执行。继续操作时,它会更新屏幕上的进度条,以显示完成任务的百分比 我发现当我的屏幕进入睡眠状态(超时)时,任务似乎停止了。不确定这是因为AsyncTask停止了还是因为它在尝试更新屏幕时卡住了(我想是后者) 除了从不让屏幕休眠外,我还可以如何防止AsyncTask停止执行?如果这是唯一的方法,那么我该如何确保屏幕不睡眠 编辑:我必须补充一点,我知道这听起来像是一个非用户友好的应用程序,正如下面有人评论的那样。这是一项非常

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

我发现当我的屏幕进入睡眠状态(超时)时,任务似乎停止了。不确定这是因为AsyncTask停止了还是因为它在尝试更新屏幕时卡住了(我想是后者)

除了从不让屏幕休眠外,我还可以如何防止AsyncTask停止执行?如果这是唯一的方法,那么我该如何确保屏幕不睡眠


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

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

如果您需要应用程序运行,您可以使用WakeLock保持手机运行(屏幕关闭):和


请注意,wake lock需要wake_lock权限,您需要再次向用户明确,您的应用程序将在手机关机时喝下手机的奶昔。

不确定是否有人会读到这篇文章,因为OP已经有好几年了,但我的处境相同,因为我需要将wakelock用于内部使用的应用程序,让屏幕保持打开状态是不好的(我只需要打开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();
            }
        }
    });
公共类my\u frag扩展片段{
WakeLock wl;
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
setRetainInstance(真);
PowerManager pm=(PowerManager)this.getActivity().getSystemService(Context.POWER\u服务);
wl=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,“MyWakeLock”);
//我碰巧在一个基于异步任务的按钮点击事件中有它
//旁注:我可能应该为我的异步任务使用一个加载程序,但这很好
connectButton.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
如果(度量_任务!=null)
{
Status s=度量值_task.getStatus();
如果(s.name().equals(“RUNNING”)){
if(度量值_任务运行){
度量_任务。取消(true);
connectButton.setText(“开始”);
metrics_task.running=false;

wl.release();我在这篇旧文章上写了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);

重要提示:只能在
活动中调用它,而不能从其他应用程序组件调用。可以找到更多详细信息。

“我有一个CPU密集型的长时间运行操作(几个小时)”--这不完全是对电池供电设备的用户友好使用。@commonware:“这并不完全是一个用户友好的使用电池供电的设备“我完全同意您的看法。请参阅我上面的编辑以了解解释。请查看PowerManager API和WakeLock方法。您可以调用各种标志来防止变暗、锁定和睡眠。@EboMike:谢谢您的回答。PowerManager.WakeLock文档中确实有此警告。”“使用此API将显著影响设备电池寿命。这是否意味着电池将快速耗尽并必须很快重新充电?还是意味着电池寿命本身将受到影响,从而对设备造成永久性损坏?@Ebomike:”您需要向用户明确说明,您的应用程序将在手机关机时喝下手机的奶昔。“我确实理解您的担忧。请参阅我对上述问题的编辑。这意味着电池将大量耗电,必须很快重新充电。这不是永久性损坏(虽然电池在多次充电后会变旧,但如果你的应用程序导致某人每天给手机充电三倍,那么电池的续航时间就不会那么长)@Ebomike:谢谢你的耐心。听起来我的解决方案中似乎有一些基本缺陷。但是AsynTask不正是针对这类东西的吗?在另一个线程中开始阻塞作业并使用publishProgress()更新UI线程??如果停止,当屏幕进入睡眠状态时,有什么意义?完全无关:)异步任务是(太棒了)helper类允许轻松编写需要在UI线程中执行操作的多线程代码。这与手机关机完全无关。感谢您的回答&已经投票通过。我们尝试了“部分唤醒锁定”策略,效果很好。但是,我们还替换了long
wait()
通过间歇较小的
睡眠()
,这似乎也可以正常工作。请查看您是否可以在这个问题上提供帮助:。我们对唤醒锁定和睡眠都持开放态度,提供了一些好的策略。