一旦BroadcastReceiver.onCreate()完成,线程是否关闭?

时间:2014-02-20 08:30:25

标签: android broadcastreceiver

我有一个BroadcastReceiver,我需要在那里做长时间的操作。这是我的代码:

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完成,所有创建的任务都会被杀死。这是正确的吗?即使我使用WakeLock? 什么是最好的解决方案? “长时间操作”可持续约2分钟。我想避免为此提供其他服务。 感谢

2 个答案:

答案 0 :(得分:0)

您可以创建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

}

或者使用Threads也可以这样做,但AsyncTask更易于使用。

class MyThread implements Runnable{


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



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

}

答案 1 :(得分:0)

  

据我所知,这是不允许的,因为一旦onReceive完成,所有创建的任务都会被杀死。这是对的吗?

不是Thread的情况。如果您的onReceive()方法被触发,则执行其中的所有内容,但是当您拥有Thread时,其执行将在后台执行,因此即使您的onReceive()方法完成,您的{{1}也是如此继续运行,直到你停止它或在执行后自己完成。

  

即使我使用的是WakeLock?什么是最好的解决方案? “长时间操作”可持续约2分钟。我想避免为此提供其他服务。感谢

您可以按照自己的方式进行,或宣布Thread。您可以自行决定哪种解决方案更适合您的实施,但两者都有效。