Android 处理程序删除发送消息不工作

Android handler remove send message not working

Android 处理程序从处理程序消息队列中删除先前发送的消息。 记住我不想用removeCallbacks(Runnabler);

发送广播意图
- 发送消息

      Intent i = new Intent(my_action);  
      sendBroadcast(i);  

- 取消之前的任何消息

Intent i = new Intent(my_action);  
i.putExtra("a","a"); 
sendBroadcast(i);

public class TestBroadCast extends BroadcastReceiver {

    Handler h = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            // Do my stuff
        }
    };
    Message msg = h.obtainMessage();
    @Override
    public void onReceive(Context context, Intent intent) {

        if ("a".equals(intent.getStringExtra("a"))){
            // Handle intent to cancel message
            msg.what = 1;
            h.removeMessages(1);
        } else {
            // Handle intent to do my stuff
            msg.what = 1;
            h.sendMessageDelayed(msg, 10000);
        }
    }
}

但此后 removeMessages 不起作用。

你不能重复使用 Message 我过去试过但没用,你应该买一个新的。

删除:

Message msg = h.obtainMessage();

修改:

else { 
        // Handle intent to do my stuff 
        Message msg = h.obtainMessage();
        msg.what = 1;
        h.sendMessageDelayed(msg, 10000);
    } 

您还应该使 Handler 静态化,我怀疑这就是您出现问题的原因。 BroadcastReceiver 的生命周期可能很短,会在您的处理程序触发之前创建和销毁。

您应该将处理程序移至应用程序 class,原因如下:

您的 BroadcastReceiver 在每次广播后创建多个处理程序实例,因此 Message.target 从 h.obtainMessage() 分配了不同的处理程序实例。因此,Handler.removeMessages() 将无法在检查 Message.target 后删除消息。 这是 Messagequeue.removeMessages() 和检查目标处理程序的相关源代码:

while (p != null && p.target == h && p.what == what
   && (object == null || p.obj == object)) {
   Message n = p.next;
   mMessages = n;
   p.recycleUnchecked();
   p = n;
}