当前位置: 首页 > 知识库问答 >
问题:

在Android Studio中,当应用程序关闭时,推送通知不能正常工作

东门俊民
2023-03-14
package com.asecum.com.campussicapp;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

import org.json.JSONException;
import org.json.JSONObject;

/**
 * Created by asecum5 on 24/08/17.
 */

public class Firebase_NotificationService extends FirebaseMessagingService {

    private static final String TAG = "NOTICIAS";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        /*String from = remoteMessage.getFrom();
        Log.d(TAG, "Mensaje recibido de: " + from);

        if(remoteMessage.getNotification() != null) {
            Log.d(TAG, "Notification: " + remoteMessage.getNotification().getBody());

            showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
        }
        if(remoteMessage.getData().size()>0){
            Log.d(TAG, "Data: " + remoteMessage.getData());
        }*/
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Data: " + remoteMessage.getData());
            try {
                JSONObject data = new JSONObject(remoteMessage.getData());
                String jsonMessage = data.getString("extra_information");
                Log.d(TAG, "onMessageReceived: \n" + "Extra information: " + jsonMessage);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        if (remoteMessage.getNotification() != null) {
            String title = remoteMessage.getNotification().getTitle();
            String message = remoteMessage.getNotification().getBody();
            showNotification(title, message);
        }
    }
    private void showNotification(String title, String body) {
        Intent intent = new Intent(this, NotificationActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_home_black_24dp)
                .setContentTitle(title)
                .setContentText(body)
                .setAutoCancel(true)
                .setVibrate(new long[]{100, 250, 100, 250, 100, 250})
                .setSound(soundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, notificationBuilder.build());
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.asecum.com.campussicapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">


        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="MAINACTIVITY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        <activity
            android:name=".SplashScreen"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>


        <activity
            android:name=".NotificationActivity">
            <intent-filter>
                <action android:name="NOTIFICATIONACTIVITY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>


        <service
            android:name=".Firebase_InstanceIdService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>

        <service
            android:name=".Firebase_NotificationService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/colorAccent" />
    </application>

</manifest>
dependencies {
   ...

    compile 'com.google.firebase:firebase-core:10.2.6'
    compile 'com.google.firebase:firebase-messaging:10.2.6'
    testCompile 'junit:junit:4.12'
}

apply plugin: `com.google.gms.google-services`

项目建造。gradle

dependencies {
   ...
classpath 'com.google.gms:google-services:3.1.0'
}

共有1个答案

卞轶
2023-03-14

我认为这是由于Firebase中“数据”风格的云消息和“通知”风格的云消息之间的差异造成的。

对于通知样式的消息:

FCM代表客户端应用程序自动将消息显示给最终用户设备。

在Mac命令行中,您可以使用如下所示的a脚本通过Google的服务器向特定的应用实例ID发送数据样式消息:

curl -X POST \
--Header "Authorization: key=<get authorization key from Firebase console - Project Settings - Web API Key>” \
--Header "Content-Type: application/json" https://fcm.googleapis.com/fcm/send  \
-d " \
    { \
        \"to\”:\”<get id for your particular android device app instance from Firebase Instance ID service in your app>\”, \
        \"data\": \
        { \
            \"title\":\" test title here \", \
            \"body\":\" test body here \"
        }, \
        \"priority\": \"normal\" \
    }"

请注意,JSON中没有“通知”块。

又见这和这

 类似资料:
  • 我想用Xamarin格式的C#创建一个基于文本的Android游戏。 在故事中,我想设置角色任务,这需要一些时间,例如“我去挖这个洞,完成后给你打电话。” 如何将通知设置为在设置的时间之后显示?例如,上述声明可能需要10分钟,然后用户收到继续游戏的通知? 我一周前才开始做C#,所以如果这是noobish,或者已经被问到了,我道歉。我到处都找过,但有几种类型的通知,当我试图理解它时,似乎我在读法语。

  • 当应用程序完全关闭时,如何以编程方式发送通知? 示例:用户关闭应用程序,也在Android Taskmanager中,然后等待。应用程序应在X秒后或应用程序检查更新时发送通知。 我试图使用这些代码示例,但是: 应用程序关闭时推送通知-活动太多/无法工作 我如何让我的应用程序在关闭时发送通知很多信息,但我不知道如何处理 当android应用程序关闭时,如何发送本地通知?-很多信息,但我不知道如何处理

  • 我目前正在开发Android(Cordova)应用程序,我正在使用Oneignal推送通知。首先,如果我关闭应用程序,推送通知不会被传递,所以我不得不添加一个Cordova插件来保持我的应用程序在后台运行: 我在deviceready之后的代码: 谢了。

  • 如果应用程序关闭,我将如何使其发送通知?我正在制作一个从web服务器读取数据的应用程序,只有当该应用程序关闭且web服务器上的值更改时,我才需要向用户发送通知。

  • Firebase push在某些设备上不起作用,当应用程序关闭时只有数据负载。请参阅以下线程:https://github.com/firebase/quickstart-android/issues/41 我知道当应用程序被swipe杀死时,一些OEM会杀死应用程序的所有服务,这些服务直接影响FirebbaseMessagingService并且由于这个onMessageReceived()方法

  • 我的应用程序有推送通知(FCM)。当应用程序在前台运行时,我可以在onMessageReceived()函数中获取数据负载。当应用程序在后台运行或应用程序完全关闭时,不会调用onMessageReceived()函数。我的问题是,当app在后台或关闭时,是否可能获得数据有效载荷? 提前道谢!