Android BroadcastReceiver.onCreate()完成后线程是否关闭?

Android BroadcastReceiver.onCreate()完成后线程是否关闭?,android,broadcastreceiver,Android,Broadcastreceiver,我有一个广播接收器,我需要在那里做长时间的操作。这是我的代码: public class clsMyReceiver extends BroadcastReceiver { PowerManager oPowerManager; PowerManager.WakeLock oWakeLock; @Override public void onReceive(Context context, Intent intent) { //Aviod the device to g

我有一个广播接收器,我需要在那里做长时间的操作。这是我的代码:

public class clsMyReceiver extends BroadcastReceiver 
{  PowerManager oPowerManager;
   PowerManager.WakeLock oWakeLock;

   @Override public void onReceive(Context context, Intent intent)
   {  //Aviod the device to go to Sleep:
      oPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
      oWakeLock = oPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelock");
      oWakeLock.acquire();

      new Thread()
      {  public void run()
         {  //......
            //Perform long operation here
            //......

            if(oWakeLock.isHeld())
              oWakeLock.release();
         }
      }.start();

   }
}
据我所知,这是不允许的,因为一旦onReceive完成,所有创建的任务都将被终止。是这样吗?即使我使用唤醒锁? 这方面的最佳解决方案是什么? 长时间操作可持续约2分钟。我想避免为这项服务提供其他服务。
谢谢

您可以创建一个AsyncTask并将oWakeLock传递给AsyncTask的构造函数

 public class MyTask extends AsyncTask<Object, Object, Object>{
    PowerManager.WakeLock oWakeLock;
    public MyTask(PowerManager.WakeLock oWakeLock){
    this.oWakeLock = oWakeLock;
    }
 // other methods of asyncktask below

}
据我所知,这是不允许的,因为一旦onReceive完成,所有创建的任务都将被终止。是这样吗

在线程的情况下不是这样。如果您的onReceive方法被激发,您将在其中执行所有操作,但由于您有一个线程,它的执行将在后台进行,因此即使您的onReceive方法完成,您的线程仍将继续运行,直到您停止它或在执行后自行完成为止

即使我使用唤醒锁?这方面的最佳解决方案是什么?长时间操作可持续约2分钟。我想避免为这项服务提供其他服务。谢谢


您可以按正在执行的方式执行,也可以声明异步任务。由您决定哪个解决方案更适合您的实现,但两者都是有效的。

我读到的是:任何需要异步操作的都不可用,因为您需要从函数返回来处理异步操作,但此时BroadcastReceiver不再处于活动状态,因此系统可以在异步操作完成之前终止其进程。我不确定这会有什么影响。我明白,不仅仅是允许这样做,它可以在你的线程执行的任何时候释放广播接收器,并且它会不安全地结束它。你测试过它了吗?一种方法是使用CountDownLatch1同步,它的工作原理类似于信号灯。就在onReceive方法的结尾}之前,您将调用CountDownLatch.await方法,线程将在完成后调用.countDown方法。通过这种方式,您可以确保在线程执行结束之前不会释放onReceive方法。但有时线程会被杀死。我还读到:一旦您从onReceive返回,BroadcastReceiver就不再处于活动状态,它的托管进程只与运行在其中的任何其他应用程序组件一样重要。这是很重要的,因为如果该进程只为广播接收器托管一个用户最近没有交互的应用程序的常见情况,那么当从接收到返回时,系统将认为它的进程是空的并且杀死它,以便资源可用于其他进程。不会花很长时间吗?我的意思是,在冰天雪地里冷冻可能需要很长时间。
class MyThread implements Runnable{


 PowerManager.WakeLock oWakeLock;
        public MyThread(PowerManager.WakeLock oWakeLock){
        this.oWakeLock = oWakeLock;
        }



 public void run(){
          // perform long running task
       }

}