Android 使用接收方或服务从后台运行弹出式通知

Android 使用接收方或服务从后台运行弹出式通知,android,notifications,popup,broadcastreceiver,Android,Notifications,Popup,Broadcastreceiver,我正在尝试在SMS通知中实现一个相当常见的问题 我想在屏幕上创建一个通知(它是一个自定义视图/文本/等),但我想尽量减少对用户的干扰。我不想创建一个额外的步骤来拖动通知栏并单击它,这是大多数股票消息应用程序所做的 我最初的实现是通过一个接收器打开一个AlertDialog,它可以正常工作,但当然会从用户手中夺走控制权,这不是我最终想要的 我的第二个实现是通过一个“看不见的”活动打开一个弹出窗口。然而,正如您可能知道的那样,启动任何活动都会关注当前活动,因此,即使用户可以看到仍在后台的内容,也会(

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

我想在屏幕上创建一个通知(它是一个自定义视图/文本/等),但我想尽量减少对用户的干扰。我不想创建一个额外的步骤来拖动通知栏并单击它,这是大多数股票消息应用程序所做的

我最初的实现是通过一个接收器打开一个AlertDialog,它可以正常工作,但当然会从用户手中夺走控制权,这不是我最终想要的

我的第二个实现是通过一个“看不见的”活动打开一个弹出窗口。然而,正如您可能知道的那样,启动任何活动都会关注当前活动,因此,即使用户可以看到仍在后台的内容,也会(至少)导致用户分心

我的第三个实现是一个定制的Toast——它工作得很好,只是它不可点击,并且它的生命周期没有得到很好的控制

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

下面是一个Pops通知的示例。
为什么不使用常规通知

您可以对其进行配置,使其能够使手机振动、发出声音,甚至更改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;
}
public static void sendNotification(上下文调用方、类activityToLaunch、字符串标题、字符串消息、int numberOfEvents、布尔声音、布尔闪烁、布尔振动、int iconID){
NotificationManager通知程序=(NotificationManager)caller.getSystemService(Context.NOTIFICATION\u服务);
最终通知notify=新通知(iconID,“,System.currentTimeMillis());
notify.icon=iconID;
notify.tickerText=标题;
notify.when=System.currentTimeMillis();
notify.number=numberOfEvents;
notify.flags |=notify.FLAG_AUTO_CANCEL;
如果(声音)notify.defaults |=Notification.DEFAULT_声音;
如果(闪光灯){
//加灯
notify.flags |=notify.FLAG_显示_灯光;
notify.ledARGB=Color.CYAN;
notify.ledOnMS=500;
notify.ledOffMS=500;
}
如果(振动){
notify.vibrate=新长[]{100200300};
}
Intent toLaunch=新的Intent(调用者,activityToLaunch);
toLaunch.addFlags(意图、标志、活动、多任务);
toLaunch.addFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK);
PendingEvent intentBack=PendingEvent.getActivity(调用者,号码,toLaunch,0);
notify.setLatestEventInfo(呼叫者、标题、消息、意图返回);
通知者。通知(编号,通知);
数字=数字+1;
}

使用我已经熟悉标准通知。这不是我所要求的,当你可以使用一个可以显示在一切之上的窗口时。现在查看一下--看起来很有希望,谢谢如果我想放一个自定义图像和消息并通知用户,在后台弹出这个弹出窗口会方便得多,而不仅仅是向他们的通知管理器添加另一个通知(那有什么意义,这不是股票短信应用程序已经做的吗?)。在询问之前,我已经研究了足够多的选项。我已经熟悉notification manager。哦,我不知道你想要一个应用程序来取代股票短信应用程序。。。