我正在为我的工作制作一个管理应用程序,但问题是我需要让设备保持全天候醒来,以便服务可以将小型UDP数据包发送到我的服务器。
我的阿尔卡特One Touch与Android 4.2.2无论如何都会睡着。
我为我的活动添加了一个唤醒锁并且它有效,但是在8个小时左右之后它似乎冻结了活动,手机就睡着了。
我将唤醒锁移动到服务但没有任何反应,Wakelock探测器检测不到唤醒锁。
我尝试使用startwakefulservice,但同样的情况发生,没有检测到唤醒锁,它就睡着了。
它总是在20-30分钟后睡着了。
我尝试过使用第三方程序,但都没有。
可能是什么原因?
我根植了我的手机,有没有办法更改设置,以便CPU永远不会入睡?我能改变什么吗?可以改变破坏政策的活动吗?
我尝试使用Android 4.1.2的第三方程序摩托罗拉XT914并检测到它,所以我想它的手机......
手机将永远被插上,没有人会使用它,所以完成任务的所有内容都是有效的。
完整的唤醒锁似乎完美无缺,但如果无法关闭,我需要将屏幕锁定...
答案 0 :(得分:0)
使用此技术可在private PowerManager.WakeLock wakeLock;
...
@Override
public void onCreate() {
super.onCreate();
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();
}
@Override
public void onDestroy() {
wakeLock.release();
super.onDestroy();
}
启动时保持CPU运行:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
不要忘记在清单中添加此权限:
public void insert(T data){
AVLNode<T> newNode = new AVLNode<T>(data);
if(isEmpty()){
root = newNode;
}
else{
insert(root, newNode);
}
}
private void insert(AVLNode<T> root, AVLNode<T> newNode){
if(newNode.getData().compareTo(root.getData())<0){
if(root.getLeftChild()!=null){
AVLNode<T> leftNodes = root.getLeftChild();
insert(leftNodes, newNode);
root.setLeftChild(rebalance(leftNodes));
}
else{
root.setLeftChild(newNode);
}
}
else if(newNode.getData().compareTo(root.getData())>0){
if(root.getRightChild()!=null){
AVLNode<T> rightNodes = root.getRightChild();
insert(rightNodes, newNode);
root.setRightChild(rebalance(rightNodes));
}
else{
root.setRightChild(newNode);
}
}
else{
root.setData(newNode.getData());
}
updateHeight(root);
}
//re-balances the tree.
private AVLNode<T> rebalance(AVLNode<T> root){
int difference = balance(root);
if (difference > 1){
if(balance(root.getLeftChild())>0){
root = rotateRight(root);
}
else{
root = rotateLeftRight(root);
}
}
else if(difference < -1){
if(balance(root.getRightChild())<0){
root = rotateLeft(root);
}
else{
root = rotateRightLeft(root);
}
}
return root;
}
//updates the height of the tree.
public void updateHeight(AVLNode<T> root){
if((root.getLeftChild()==null) && (root.getRightChild()!=null)){
root.setHeight(root.getRightChild().getHeight()+1);
}
else if((root.getLeftChild() !=null)&&(root.getRightChild()==null)){
root.setHeight(root.getLeftChild().getHeight()+1);
}
else
root.setHeight(Math.max(getHeight(root.getLeftChild()), getHeight(root.getRightChild()))+1);
}
private int balance(AVLNode<T> root) {
return getHeight(root.getLeftChild())-getHeight(root.getRightChild());
}
//single left left rotation of the tree
private AVLNode<T> rotateLeft(AVLNode<T> root){
AVLNode<T> NodeA = root.getRightChild();
root.setRightChild(NodeA.getLeftChild());
NodeA.setLeftChild(root);
root.setHeight(Math.max(getHeight(root.getLeftChild()), getHeight(root.getRightChild()))+1); //updates the height
NodeA.setHeight(Math.max(getHeight(NodeA.getLeftChild()), getHeight(NodeA.getRightChild()))+1);
return NodeA;
}
//single right right rotation of the tree
private AVLNode<T> rotateRight(AVLNode<T> root){
AVLNode<T> NodeA = root.getLeftChild();
root.setLeftChild(NodeA.getRightChild());
NodeA.setRightChild(root);
root.setHeight(Math.max(getHeight(root.getLeftChild()), getHeight(root.getRightChild()))+1); //updates the height of the AVL tree
NodeA.setHeight(Math.max(getHeight(NodeA.getLeftChild()), getHeight(NodeA.getRightChild()))+1);
return NodeA;
}
//a double rotation. Left right rotation
private AVLNode<T> rotateLeftRight(AVLNode<T> root){
AVLNode<T> nodeA = root.getLeftChild();
root.setLeftChild(rotateLeft(nodeA));
return rotateRight(root);
}
//a right left rotation
private AVLNode<T> rotateRightLeft(AVLNode<T> root){
AVLNode<T> nodeA = root.getRightChild();
root.setRightChild(rotateRight(nodeA));
return rotateLeft(root);
}
答案 1 :(得分:0)
您的问题可能是系统正在销毁该服务,以使资源可用于其他应用程序。 Wakelock确保设备不会进入休眠状态,而不是系统不会在需要时终止进程。如果是这种情况,唤醒锁也会被释放,你可以做的唯一事情(缺少自定义Android构建)是让你的服务作为(开始(未绑定))前台服务运行 - 使其更不可能系统将收回您的服务。
另外,请确保服务“粘滞”,并尽可能由系统重新创建。
您还可以将一些广播接收器注册到重新触发服务的常规事件(如果已关闭)。