我有一个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分钟。我想避免为此提供其他服务。 感谢
答案 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
。您可以自行决定哪种解决方案更适合您的实施,但两者都有效。