android-Android,在两个线程里发送notification,第二个notification弹出两次

问题描述

Android,在两个线程里发送notification,第二个notification弹出两次

下面是我写的demo,可以完全显示问题。
我的app是发送一个地址到PC,先通知“正在发送。。”,在另一个线程中执行发送,完成后先cancel掉之前的“正在发送”,再notify一个“发送成功”通知。可结果,“发送成功”通知在状态栏弹出了两次。这个问题想了3天,求大神帮忙。

package com.teana.teanatest;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

private NotificationManager mNotificationManager;
private Handler mhHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mhHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
        }
    };
    mNotificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void click(View view) {
    sendNotificationMessage("正在发送....");
    System.out.println("正在发送....");

    new Thread() {
        public void run() {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("cancel 正在发送....");
            mNotificationManager.cancel(1);

            sendNotificationMessage("发送成功");
            System.out.println("发送成功");

            try {
                Thread.sleep(2500);
                mNotificationManager.cancel(1);
                System.out.println("cancel 发送成功");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };
    }.start();

}

private void sendNotificationMessage(String text) {
    Notification notification = new Notification();
    notification.tickerText = text;
    notification.icon = R.drawable.ic_launcher;
    notification.when = System.currentTimeMillis();
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.setLatestEventInfo(this, text, text, null);
    mNotificationManager.notify(1, notification);
}

}

解决方案

还是得看click哪触发的,看日志是不是都打印了两次,可能是双击了两次。
可以调试一下,看click是不是进入了2次还是click进入了一次,thread运行了2次。

解决方案二:

这click一次,你可以建个工程,点一次,效果特特明显。

解决方案三:

notification有个flag叫update_current类似这样的。你试试

解决方案四:

你可以设置一个共享变量,标记下“发送成功”是否已经发送到通知栏

时间: 2024-09-17 02:59:28

android-Android,在两个线程里发送notification,第二个notification弹出两次的相关文章

ios-使用afnetworking 请求网络超时后,为什么弹出两个提示“请求超时”的alertview?

问题描述 使用afnetworking 请求网络超时后,为什么弹出两个提示"请求超时"的alertview? afnetworking 是在哪调用 alertview 的show方法的? 我在它的代码里没找到,而且为什么会调用两次? 解决方案 afnetworking 应该不会自动弹警告窗的,不过2.0版本我没有用过,你可以搜索一下工程中有使用 UIAlertView 或者 UIAlertController 的地方,然后看看它在哪被调用了 解决方案二: 设置 AFNetworking

c# 窗体closing事件-窗体的Closing事件,里面如果使用Application.Exit(),会弹出两次对话框询问

问题描述 窗体的Closing事件,里面如果使用Application.Exit(),会弹出两次对话框询问 代码如下, private void StartForm_FormClosing(object sender, FormClosingEventArgs e) { if (DialogResult.OK == MessageBox.Show("确认退出?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.In

代码-GridView里点击编辑按钮,弹出窗口进行编辑,怎么传值

问题描述 GridView里点击编辑按钮,弹出窗口进行编辑,怎么传值 GridView里点击编辑按钮,弹出窗口进行编辑,怎么获得每一行的值传到编辑窗口去啊?求各位大神指教!!! 这是弹出窗口的代码: 解决方案 当前行都可以找到.行里的数据当然可以获取了. 解决方案二: 你点击编辑的时候就可以获取到 当前行的数据,和你绑定当前行的数据一样的方法啊. 解决方案三: 你点击编辑的时候就可以获取到 当前行的数据,和你绑定当前行的数据一样的方法啊. 解决方案四: <a href=""edi

Android AndBase框架内部封装实现进度框、Toast框、弹出框、确认框(二)_Android

本文是针对AndBase框架学习整理的第二篇笔记,想要了解AndBase框架的朋友可以阅读本文,大家共同学习. 使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框 AndBase中AbActivity封装好了许多方法提供我们去使用,使得在使用的时候更加的方便,只需要传递相关参数即可..省去了我们自己使用基础的函数进行构造... 就好比进度框,Toast框,弹出框,确认框...这些基本的东西都在AndBase的AbActivity封装好了...我们只需要传递参数调用其中

Android UI设计与开发之PopupWindow仿腾讯新闻底部弹出菜单

前一篇文章中有用到 PopupWindow 来实现弹窗的功能.简单介绍以下吧. 官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图.出现的弹出窗口是一个浮动容器的当前活动. 1.首先来个简单的栗子,效果如下: 只有两个布局文件,一个是弹窗布局(只有一张图片),一个是主界面布局(只有一个按钮). 然后在主界面代码中实例 PopupWindow ,指定弹出的界面,在按钮点击事件中显示或隐藏弹窗就可以了,代码如下: package com.yanis.demo; import andr

Android实现类似于PC中的右键弹出菜单效果_Android

 Android系统中的ContextMenu(上下文菜单)类似于PC中的右键弹出菜单,当一个视图注册到一个上下文菜单时,执行一个在该对象上的"长按"动作,将出现一个提供相关功能的浮动菜单.上下文菜单可以被注册到任何视图对象中,不过,最常见的是用于列表视图ListView的item,在按中列表项时,会转换其背景色而提示将呈现上下文菜单. 注意:上下文菜单不支持图标和快捷键. 为了创建一个上下文菜单,你必须重写这个活动的上下文菜单回调函数:onCreateContextMenu() 和

Android实现类似于PC中的右键弹出菜单效果

Android系统中的ContextMenu(上下文菜单)类似于PC中的右键弹出菜单,当一个视图注册到一个上下文菜单时,执行一个在该对象上的"长按"动作,将出现一个提供相关功能的浮动菜单.上下文菜单可以被注册到任何视图对象中,不过,最常见的是用于列表视图ListView的item,在按中列表项时,会转换其背景色而提示将呈现上下文菜单.  注意:上下文菜单不支持图标和快捷键. 为了创建一个上下文菜单,你必须重写这个活动的上下文菜单回调函数:onCreateContextMenu() 和

Android 从底部弹出Dialog(横向满屏)的实例代码_Android

项目中经常需要底部弹出框,这里我整理一下其中我用的比较顺手的一个方式(底部弹出一个横向满屏的dialog). 效果图如下所示(只显示关键部分): 步骤如下所示: 1.定义一个dialog的布局(lay_share.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi

Android 从底部弹出Dialog(横向满屏)的实例代码

项目中经常需要底部弹出框,这里我整理一下其中我用的比较顺手的一个方式(底部弹出一个横向满屏的dialog). 效果图如下所示(只显示关键部分): 步骤如下所示: 1.定义一个dialog的布局(lay_share.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi