`

[Android]接收Push Notification及弹出Dialog

阅读更多

1、使用一个service接收gcm

public class MyGcmListenerService extends GcmListenerService {

    private static final String TAG = "MyGcmListenerService";


    /**
     * Called when message is received.
     *
     * @param from SenderID of the sender.
     * @param data Data bundle containing message data as key/value pairs.
     *             For Set of keys use data.keySet().
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(String from, Bundle data) {
        String message = data.getString("message");
        Log.d(TAG, "From: " + from);
        Log.d(TAG, "Message: " + message);

        for (String key : data.keySet() ) {
            Log.d(TAG, "key : " + key);
        }

        String messageId = data.getString("google.message_id");
        String messageKey = data.getString("message");
        String collapse_key = data.getString("collapse_key");
        String score = data.getString("score");

        String payload = data.getString("data.payload");
        String extraMap = data.getString("data.extraMap");

        Log.d(TAG, "Message id : " + messageId);
        Log.d(TAG, "message_key : " + messageKey + ",collapse_key : " + collapse_key + ",payload : " + payload
                + ",extraMap : " + extraMap);

        if (message == null || message.equals("")) {
            Log.d(TAG, "Received message from GCM not success...");
        } else {

            Log.d(TAG, "success received from GCM : " + message);


        }

        if (from.startsWith("/topics/")) {
            // message received from some topic.
            Log.d(TAG, "message received from some topic.");
        } else {
            // normal downstream message.
            Log.d(TAG, "normal downstream message.");

        }

        // [START_EXCLUDE]
        /**
         * Production applications would usually process the message here.
         * Eg: - Syncing with server.
         *     - Store message in local database.
         *     - Update UI.
         */

        /**
         * In some cases it may be useful to show a notification indicating to the user
         * that a message was received.
         */
        sendNotification(message,score);

        // [END_EXCLUDE]

    }

。。。。。。

 

2.建立推送(两个功能部分:1.点击Notification跳转AlertDialog 2.在MainActivity中弹框(使用LocalBroadcast)

private void sendNotification(String title,String content) {
        Intent intent = new Intent(this, AlertActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("title",title);
        bundle.putString("content",content);
        intent.putExtra("alert_gcm", bundle);

        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//PendingIntent 是点击推送后打开的Activity,第三个参数Intent可以设定跳转
//这里是跳转到一个自定义的AlertActivity中,里面打开AlertDialog(可以把Activity底色设为透明)
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_stat_ic_notification)
                .setContentTitle(title)
                .setContentText(content)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());

        //MainActivity to received gcm notification
        Intent gcmComplete = new Intent(QuickstartPreferences.GCM_COMPLETE);

        Log.d(TAG, "title : " + title + " content : " + content);

        gcmComplete.putExtra("gcmBundle", bundle);
        LocalBroadcastManager.getInstance(this).sendBroadcast(gcmComplete);

    }
若点击Notification传值失败,一般调节一个flag的值:
flags有四个取值:
int FLAG_CANCEL_CURRENT:如果该PendingIntent已经存在,则在生成新的之前取消当前的。
int FLAG_NO_CREATE:如果该PendingIntent不存在,直接返回null而不是创建一个PendingIntent.
int FLAG_ONE_SHOT:该PendingIntent只能用一次,在send()方法执行后,自动取消。
int FLAG_UPDATE_CURRENT:如果该PendingIntent已经存在,则用新传入的Intent更新当前的数据。

我们需要把最后一个参数改为PendingIntent.FLAG_UPDATE_CURRENT,这样在启动的Activity里就可以用接收Intent传送数据的方法正常接收。

 

3.MainActivity建立接收器:

mGcmNotificationBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Bundle bundle = intent.getBundleExtra("gcmBundle");
                String title = bundle.getString("title");
                String content = bundle.getString("content");
                Log.d(TAG, "title : " + title + " content : " + content);
                //Dialog to show content
                new AlertDialog.Builder(MainActivity.this,R.style.dialogTheme)
                        .setTitle(title)
                        .setMessage(content)
                        .setNegativeButton("OK", null)
                        .show();
            }
        };

 

注册接收器:

private void registerReceiver(){
 
        if (!isReceiverGcm){
            LocalBroadcastManager.getInstance(this).registerReceiver(mGcmNotificationBroadcastReceiver,
                    new IntentFilter(QuickstartPreferences.GCM_COMPLETE));
            isReceiverGcm = true;
        }
    }

 

@Override
    protected void onResume() {
        super.onResume();
        registerReceiver();

    }

    @Override
    protected void onPause() {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mGcmNotificationBroadcastReceiver);
        isReceiverGcm = false;
        super.onPause();
    }

 

4.AlertActivity:

Intent intent = getIntent();
        Bundle bundle = intent.getBundleExtra("alert_gcm");
        String title = bundle.getString("title");
        String content = bundle.getString("content");
        Log.d(TAG, "title : " + title + " content : " + content);
        //Dialog to show content
        new AlertDialog.Builder(this,R.style.dialogTheme)
                .setTitle(title)
                .setMessage(content)
                .setNegativeButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent i = new Intent(AlertActivity.this, MainActivity.class);
                        startActivity(i);
                    }
                })
                .show();

 

分享到:
评论

相关推荐

    使用android push notification service 实现即时通知

    在Android平台上,实现即时通知通常会借助Google的云消息推送服务(Google Cloud Messaging,简称GCM),但在iOS系统中,对应的则是Apple Push Notification service(APNs)。然而,这里提到的"android apns"可能是...

    android push notification 下载即可运行

    在Android平台上,推送通知(Push Notification)是一种高效且节省资源的方式,用于向用户发送应用程序相关的实时信息,即使应用并未在前台运行。这个“android push notification 下载即可运行”项目表明,它提供了...

    Android Push Notification实现信息推送完整包

    本文将详细介绍如何实现Android Push Notification,包括服务器端(Server)和客户端(Client)的设置以及操作配置流程。 1. 服务器端(Server)实现 服务器端负责发送推送通知到Google的云消息服务(GCM,现在...

    Android Studio Service安卓在服务中如何弹出Dialog

    总之,要在`Android Studio`的`Service`中弹出Dialog,你需要创建Dialog布局、自定义Dialog类、在`Service`中实例化并显示Dialog,同时处理Dialog的关闭和`Service`的生命周期。通过这些步骤,你可以确保即使在后台...

    Android push notification方案比较

    【Android Push Notification 方案比较】 在开发Android应用时,向用户实时推送通知是必不可少的功能,Android提供了多种推送通知方案,包括C2DM(Cloud to Device Messaging)、MQTT(Message Queuing Telemetry ...

    android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动

    在Android开发中,创建一个能够实现闹钟提醒并在锁屏状态下弹出Dialog对话框、播放铃声和振动的功能,涉及到多个关键知识点。以下是对这些知识点的详细解释: 1. **AlarmManager**: 这是Android系统服务,用于调度...

    Android push notification 服务端源代码

    Android Push Notification服务是Android应用程序与用户交互的一种重要方式,它允许应用在后台向用户发送消息,即使应用没有在运行。AndroidPN(Android Push Notification)是一个开源项目,专注于提供服务端的解决...

    android push notification service Demo

    首先,我们需要明白APNS(Apache Push Notification Service)并不是Android系统的官方服务,而是通常指苹果的Push Notification Service。然而,在这里,“apns”标签可能是开发者为了表示类似功能的一个简称,或者...

    Android Push Notification客户端源码包

    在Android开发中,Push Notification是一种重要的技术,它允许应用程序在后台接收来自服务器的消息,并在用户的通知栏中显示这些消息,即使应用并未运行。这个"Android Push Notification客户端源码包"显然是一个...

    Android Push Notification

    An open source project to provide push notification support for Android -- a xmpp based notification server and a client tool kit.

    Laravel开发-laravel-push-notification Push Notification 服务端支持

    在本文中,我们将深入探讨如何使用 Laravel 框架中的 "laravel-push-notification" 扩展包来实现 Push Notification 的服务端支持。Push Notification 是移动应用中常见的功能,用于向用户实时发送消息、提醒或者...

    android push notification XPMM源码

    Android Push Notification XPMM源码详解 在Android应用开发中,推送通知是一项至关重要的功能,它能让用户即使在不打开应用的情况下也能接收到重要的信息。XPMM(可能代表eXtended Push Message Management)是一...

    Apple Push Notification Service简介

    - **警报**:在屏幕顶部显示一个弹出窗口,显示一条简短的消息。 - **图标徽标**:在应用图标的右上角显示一个数字,表示未读消息的数量。 - **声音播放**:播放预设的声音,提醒用户有新通知。 2. **服务质量 ...

    Android的各种通知Notification、Dialog、Toast、Snackbar

    通知(Notification)、对话框(Dialog)、吐司(Toast)和Snackbar是Android系统提供的一些关键组件,用于向用户展示各种信息和提示。下面将详细介绍这些组件的功能、用法以及它们在不同场景下的适用性。 **1. ...

    Android代码-react-native-push-notification

    npm install --save react-native-push-notification react-native link NOTE: For Android, you will still have to manually update the AndroidManifest.xml (as below) in order to use Scheduled Notifications...

    iOS push notification 文档

    iOS Push Notification文档 iOS Push Notification是Apple提供的一种服务,允许开发者向用户推送信息,从而提高用户体验和应用程序的粘性。本文档将详细介绍如何在iOS应用程序中使用Push Notification,包括工程的...

    Android 中Notification弹出通知实现代码

    Android 中Notification弹出通知实现代码 Notification 是 Android 中的一种机制,用于向用户显示重要信息,例如新的电子邮件、短信、软件更新等。NotificationManager 是状态栏通知的管理类,负责发通知、清除通知...

    Laravel开发-laravel-push-notification

    尽管如此,Laravel Push Notification包仍然支持GCM接口,使得向Android设备发送推送变得简单。 **5. WPN(Windows Push Notification)** WPN是微软为Windows Phone和Windows 8及以上版本的桌面应用提供的通知服务...

Global site tag (gtag.js) - Google Analytics