我们可以在不使用firebase的情况下全局发送通知

时间:2017-07-06 07:30:59

标签: android rest firebase android-notifications

我们是否可以创建休息服务,以便在不使用Firebase云消息传递/ Google云消息传递或其他云信使工具的情况下向Android应用发送通知?如果是的话,怎么可能呢?我搜索过相同但无法获得适当的结果。我在REST服务中得到的结果与云信使工具相结合,但我想创建服务,通过这些服务我可以轻松地发送通知,而无需打开Cloud Messenger控制台。

处理来自php的数据的代码

    private void handleNotification(String message) {
    Log.e(TAG, "===========================messaging 4=======" );

    if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) {

        Intent intent= new Intent(this,MainActivity.class);
        intent.putExtra("message",message);
        intent.putExtra("imageUrl",imageUrl);
        intent.putExtra("time_stamp",timeStamp);

        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

        final PendingIntent pendingIntent = PendingIntent.getActivity(
                this, 0, intent, PendingIntent.FLAG_ONE_SHOT);


        Uri notificationSound= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notifiBuilder=new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("NOTIFICATION !!")
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(notificationSound)
                .setContentIntent(pendingIntent) ;

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

        notificationManager.notify(0,notifiBuilder.build());


        Intent pushNotification = new Intent(Config.PUSH_NOTIFICATION);
        pushNotification.putExtra("message", message);
        LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);

        // play notification sound
       /* NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext());

       notificationUtils.playNotificationSound();*/


    }
}

private void handleDataMessage(JSONObject json) {
    Log.e(TAG, "===========================messaging 4=======" );
    Log.e(TAG, "push json: " + json.toString());


    try {
        JSONObject data = json.getJSONObject("data");

        String title = data.getString("title");
        String message = data.getString("message");
       boolean isBackground = data.getBoolean("is_background");
        String imageUrl = data.getString("image");
       String timestamp = data.getString("timestamp");
      JSONObject payload = data.getJSONObject("payload");

        Log.e(TAG, "title: " + title);
        Log.e(TAG, "message: " + message);
       Log.e(TAG, "isBackground: " + isBackground);
        Log.e(TAG, "payload: " + payload.toString());
        Log.e(TAG, "imageUrl: " + imageUrl);
        Log.e(TAG, "timestamp: " + timestamp);


        if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) {
            // app is in foreground, broadcast the push message

            Intent intent= new Intent(this,MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
            final PendingIntent pendingIntent = PendingIntent.getActivity(
                    this, 0, intent, PendingIntent.FLAG_ONE_SHOT);


            Uri notificationSound= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

            NotificationCompat.Builder notifiBuilder=new NotificationCompat.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("NOTIFICATION data message!!")
                    .setContentText(message)
                    .addAction(R.mipmap.ic_accept,"ACCEPT",pendingIntent)
                    .addAction(R.mipmap.ic_decline,"DECLINE",pendingIntent)
                    .setAutoCancel(true)
                    .setSound(notificationSound)
                    .setContentIntent(pendingIntent) ;

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

            notificationManager.notify(0,notifiBuilder.build());


            Intent pushNotification = new Intent(Config.PUSH_NOTIFICATION);
            pushNotification.putExtra("message", message);
            LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);

            // play notification sound

        } else {
            // app is in background, show the notification in notification tray

            Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
            resultIntent.putExtra("message", message);

            // check for image attachment
            if (TextUtils.isEmpty(imageUrl)) {
                showNotificationMessage(getApplicationContext(), title, message, resultIntent);
            } else {
                // image is present, show notification with image
                showNotificationMessageWithBigImage(getApplicationContext(), title, message, resultIntent, imageUrl);
            }
        }
    } catch (JSONException e) {
        Log.e(TAG, "Json Exception: " + e.getMessage());
    } catch (Exception e) {
        Log.e(TAG, "Exception: " + e.getMessage());
    }
}

2 个答案:

答案 0 :(得分:0)

由于GCM使用简单的TCP连接,您可以自己动手。

您需要的只是您需要的每台设备上的单个TCP服务器和TCP客户端。

几乎相同,但会消耗更多电池。

答案 1 :(得分:0)

这可能是一个更长而艰难的过程

  1. 在您的应用中创建后台服务,该服务会在每隔一定时间间隔(可能是秒或分钟)后检查您的网络服务器是否有新消息。
  2. 此操作可能会被Android操作系统杀死或清除。因此,您可能需要注册一个AlarmManager,它会定期调用服务。
  3. 后台服务,将调用网络服务器API以及唯一ID(可能是设备ID或某些访问令牌)
  4. 在您的网络服务器上,您可以创建一个API,在接收到来自设备的请求时,使用传递的UniqueID检查是否有任何消息。如果有消息,它会回复数据。
  5. 在应用程序上,从网络服务器接收数据后,您可以做到这一点。
  6. FCM / GCM使用类似的过程。但它保证了通知,因为GooglePlayServices始终在Android中运行。

    这个程序可以让你在某种程度上做你想做的事情,但是,如上所述,可能是困难和具有挑战性的。