使用Receiver或Service从后台运行弹出通知

时间:2012-08-17 16:35:33

标签: android notifications popup broadcastreceiver

我正在尝试在短信通知中实现一个相当常见的问题。

我想在屏幕上创建一个通知(自定义视图/文本/等),但我想让最小分散给用户。我不想创建一个额外的步骤来拖动通知栏并单击它,这是大多数股票消息应用程序所做的事情。

我最初的实现是通过接收器调出AlertDialog,它可以正常工作,但当然可以控制用户,这不是我最终想要的。

我的第二个实现是通过“隐形”活动调出PopupWindow。但是,正如您可能知道的那样,提出任何活动都会关注当前活动,因此它会导致(至少)1次点击分散给用户,即使他可以看到仍在后台的内容。

我的第三个实现是一个自定义Toast - 这个工作正常,除了它不可点击并且它的生命周期没有得到很好的控制。

所以,知道我已经实现了什么,我想问一下是否有人知道或有线索我们如何在顶部附近弹出弹出窗口而不会导致任何分心。我知道有几个通知经理可以做到这一点。

以下是Pops Notification的示例。 http://imageshack.us/photo/my-images/849/screenshot2012081618583.png/

1 个答案:

答案 0 :(得分:1)

为什么不直接使用常规通知?

您可以对其进行配置,使其可以使手机振动,发出声音甚至更改LED颜色(如果支持)。

这是一个我一直用来提供通知的简单方法:

注意:为了使振动起作用,您必须添加到清单中:

<uses-permission android:name="android.permission.VIBRATE" >

方法:

public static void sendNotification(Context caller, Class<?> activityToLaunch, String title, String msg, int numberOfEvents,boolean sound, boolean flashLed, boolean vibrate,int iconID) {
    NotificationManager notifier = (NotificationManager) caller.getSystemService(Context.NOTIFICATION_SERVICE);

    final Notification notify = new Notification(iconID, "", System.currentTimeMillis());

    notify.icon = iconID;
    notify.tickerText = title;
    notify.when = System.currentTimeMillis();
    notify.number = numberOfEvents;
    notify.flags |= Notification.FLAG_AUTO_CANCEL;
    if (sound) notify.defaults |= Notification.DEFAULT_SOUND;

    if (flashLed) {
    // add lights
        notify.flags |= Notification.FLAG_SHOW_LIGHTS;
        notify.ledARGB = Color.CYAN;
        notify.ledOnMS = 500;
        notify.ledOffMS = 500;
    }

    if (vibrate) {
        notify.vibrate = new long[] {100, 200, 300};
    }

    Intent toLaunch = new Intent(caller, activityToLaunch);
    toLaunch.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
    toLaunch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent intentBack = PendingIntent.getActivity(caller, number, toLaunch, 0);

    notify.setLatestEventInfo(caller, title, msg, intentBack);   
    notifier.notify(number, notify);
    number = number+1;
}