如何在android中实现推送通知

时间:2010-08-31 04:48:04

标签: android push-notification

我正在做很多关于推送通知的研究,但我不明白如何在Android 1.6中实现。我想问一下这个要求是什么?我们从服务器端获得的信息类型是标签形式还是信息?关于this的输入或输出是什么。我给服务器的哪个输入以及来自服务器的输出。 是否有任何设备ID需要这个?请建议我谢谢。

3 个答案:

答案 0 :(得分:1)

这是Google提供的文档link。他们将PushNotification的概念命名为C2DM(云到设备消息传递)

您可以访问指定的链接获得明确的说明。我会给你一些简短的回答你的问题。

  • 您无法在Android 1.6中实现此功能。你需要2.2或更高 版本
  • 作为PushNotification,我们只收到提醒,而不是完整的详细信息。
  • 作为第三方服务器的输入,应该具有C2DM的设备注册ID。
  • 是的,应该有一个设备ID来标识要激活服务的设备。您可以在Android应用尝试与C2DM连接的初始阶段获取它

答案 1 :(得分:0)

答案 2 :(得分:0)

在 Firebase 中,我们可以将带有多条信息的通知推送到特定或多个设备,为此我们需要从 android 端实现一些代码,首先,我们需要在您的应用中设置 firebase 配置,我将介绍如何将推送通知重定向到移动应用程序中的特定或默认屏幕。 两种打开应用屏幕的方式

  1. 默认情况下,您只需要打开应用程序(如启动画面)。
  2. 重定向到应用程序中的特定屏幕。

默认情况下,您只需要打开应用程序(如启动画面) 创建一个名为“FirebaseMessagingService”的类并扩展“FirebaseMessagingService”

实现代码

        public class FirebaseMessagingService extends FirebaseMessagingService
        {
            @Override
            public void onNewToken(String token)
            {
                sendRegistrationToServer(token);
            }

            public void onMessageReceived(RemoteMessage remoteMessage)
            {
                String title = remoteMessage.getNotification().getTitle();
                String body = remoteMessage.getNotification().getBody();
                Uri imageUrl = remoteMessage.getNotification().getImageUrl();
                String actionItem = remoteMessage.getNotification().getClickAction();

                if (imageUrl == null)
                {
                    MyNotificationManager.getmInstance(getApplicationContext()).displayNotificationAction(title, body,actionItem);
                } 
                else
                {
                    MyNotificationManager.getmInstance(getApplicationContext()).displayImageNotification(title, body, imageUrl);
                }
            }

            private void sendRegistrationToServer(String token)
            {
                // TODO: Implement this method to send a token to your app server.
            }

        }

创建通知管理器类来管理不同参数的显示方法

        public class MyNotificationManager
        {
            private Context mCtx;
            private static MyNotificationManager mInstance;

            private MyNotificationManager(Context context)
            {
                createNotificationChannel();
                mCtx = context;
            }

            public static synchronized MyNotificationManager getmInstance(Context context)
            {

                if (mInstance == null)
                {
                    mInstance = new MyNotificationManager(context);
                }
                return mInstance;
            }

            public void createNotificationChannel()
            {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
                {
                    int importance = NotificationManager.IMPORTANCE_DEFAULT;
                    NotificationChannel channel = new NotificationChannel("1", "Testing the Notification", importance);
                    channel.setDescription("We are testing the notification");
                }
            }

            public void displayNotification(String title, String body)
            {
                NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mCtx, Constant.CHANNEL_ID)
                        .setSmallIcon(R.mipmap.ic_notification)
                        .setColor(ContextCompat.getColor(mCtx, R.color.colorPrimary))
                        .setContentTitle(title)
                        .setContentText(body);

                Intent intent = new Intent(mCtx, SplashActivity.class);
                PendingIntent pendingIntent = PendingIntent.getActivity(mCtx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
               
                mBuilder.setContentIntent(pendingIntent);
                NotificationManager mNotificationManager = (NotificationManager) mCtx.getSystemService(Context.NOTIFICATION_SERVICE);


                if (mNotificationManager != null)
                {
                    mNotificationManager.notify(1, mBuilder.build());
                }

            }

            
            public void displayImageNotification(String title, String body, Uri imageUrl)
            {

                NotificationCompat.Builder notification = null;
                NotificationManager mNotificationManager = null;
                try
                {
                    notification = new NotificationCompat.Builder(mCtx, Constant.CHANNEL_ID)
                            .setSmallIcon(R.mipmap.ic_notification)
                            .setContentTitle(title)
                            .setAutoCancel(true)
                            .setColor(ContextCompat.getColor(mCtx, R.color.colorPrimary))
                            .setLargeIcon(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? Picasso.with(mCtx).load(imageUrl).get() : Picasso.with(mCtx).load(R.mipmap.ic_notification).get())
                            .setContentText(body)
                            .setStyle(new NotificationCompat.BigPictureStyle()
                                    .bigPicture(Picasso.with(mCtx).load(imageUrl).get())
                                    .bigLargeIcon(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? Picasso.with(mCtx).load(imageUrl).get() : Picasso.with(mCtx).load(R.mipmap.ic_notification).get()));

                   
                    Intent intent = new Intent(mCtx, SplashActivity.class);
                    PendingIntent pendingIntent = PendingIntent.getActivity(mCtx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

                    notification.setContentIntent(pendingIntent);
                    mNotificationManager = (NotificationManager) mCtx.getSystemService(Context.NOTIFICATION_SERVICE);


                    if (mNotificationManager != null)
                    {
                        notification.getNotification().flags |= Notification.FLAG_AUTO_CANCEL;
                        mNotificationManager.notify(1, notification.build());
                    }
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }

现在只需通过 Firebase 控制台触发通知或通过 API 发送,例如:-

        {
           "to": "device_token",
            "priority": "high",
           "notification": {
            "body": "Happy Coding",
            "title": "All things are difficult before they are easy.",
            "image":""
           },
           "data": {
            "image":""
           }
        }

2.重定向到应用程序中的特定屏幕。 打开 AndroidManifest.xml 并在您需要定义的活动标签中...

        ....
                <activity
                    android:name=".activity.SpedificActivity"
                    android:screenOrientation="portrait"
                    android:theme="@style/AppTheme.NoActionBar" >
                    <intent-filter>
                        <action android:name="SpedificActivityNotification" />
                        <category android:name="android.intent.category.DEFAULT" />
                    </intent-filter>

                </activity>
        ....

现在调用 API

        {
           "to": "device_token",
            "priority": "high",
           "notification": {
            "body": "Happy Coding",
            "title": "All things are difficult before they are easy.",
            "click_action": "SpedificActivityNotification",
            "image":""
           },
           "data": {
            "image":""
           }
        }