应用程序启动时的Android Firebase通知

时间:2017-12-22 16:16:37

标签: android firebase firebase-cloud-messaging

我是android的新手。我编写了一个使用Firebase获取推送通知的应用。如果我从Firebase界面发送通知,则设备仅在应用程序运行时才会收到通知。有没有办法在应用程序未运行时获取通知,或者至少在应用程序启动时获取所有看不见的通知?

提前谢谢!

我添加了我的代码......

这是扩展FirebaseMessagingService的类:

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    public MyFirebaseMessagingService() {
    }

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

        sendNotification(remoteMessage.getNotification().getBody());
    }

    private void sendNotification(String messageBody)
    {
        //Intent intent = new Intent (this, MainActivity.class);
        //intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

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

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

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
        notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
        notificationBuilder.setContentTitle("My app");
        notificationBuilder.setContentText(messageBody);
        notificationBuilder.setAutoCancel(true);
        notificationBuilder.setSound(defaultSoundUri);
        //notificationBuilder.setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0,notificationBuilder.build());
    }
}

这是扩展FirebaseInstanceIdService的类:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService{

    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        // If you want to send messages to this application instance or
        // manage this apps subscriptions on the server side, send the
        // Instance ID token to your app server.
        sendRegistrationToServer(refreshedToken);
    }

    private void sendRegistrationToServer(String token)
    {

    }

}

最后,这是清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="user.pushnotificationexample">

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

    <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">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name=".MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>
        <service
            android:name=".MyFirebaseMessagingService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
    </application>

</manifest>

1 个答案:

答案 0 :(得分:0)

这是Xamarin Android解决方案,但它应该使您更接近本机。

尝试测试从在线测试仪(如“ pushwatch”)发送“数据”推送通知。确保单击json复选框,并添加包含密钥“ data”的json负载:

{“ data”:{“ title”:“这是标题!”,“ body”:“这是正文!”}}

OnMessageReceived(RemoteMessage message)方法的message参数具有字典属性“ Data”:即message.Data。您会在该字典中找到json负载键值对(标题和正文)。

请注意,如果该应用程序已停止,则用户将打开通知,而Android将打开该应用程序,其目标是在创建并用于构建本地通知的未决意图中使用的活动(请参见下文)。您将需要通过目标Activity的OnCreate方法处理通知意图(否则,如果应用程序正在运行,则将通过覆盖OnNewIntent处理该意图)。

public class MainActivity....
{

    protected override void OnCreate(Bundle bundle)
    {
        ...
        var pushExtra = Intent.GetStringExtra("your.pushextra.key");

        if(pushExtra != null)
        {
          MyType myType = JsonConvert.Deserialize<MyType>(pushExtra);
          //if you have a framework like MVVM or startup process 
          //and your type
          //is used for app navigation, you may need to store
          //the string value in shared preferences and deserialize
          //and use it later
          //after the app has completely finished starting
        }
    }
}

节省一些精力,如果这里需要类型或字典,请确保在放入多余的对象时(创建本地通知时)序列化对象,然后将pushExtra反序列化为具体类型以使用它的实例以上。您可能会发现大多数示例都将字符串,键值对的int或字典放入。

void ConfigureLocalNotification(MyType typeInstance)
{
     ...
     var intent = new Intent(context, typeof(MainActivity));
     var jsonData = JsonConvert.SerializeObject(typeInstance);
     Log.Info(TAG, $"Adding IntentExtra: {jsonData}");
     intent.PutExtra("your.pushextra.key", jsonData);

     intent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop |
     ActivityFlags.IncludeStoppedPackages); //| ActivityFlags.NewTask);

     var pendingIntent = PendingIntent.GetActivity(context, 0, intent,
     PendingIntentFlags.OneShot);

     ....
     NotificationCompat.Builder builder = null;
     builder = new NotificationCompat.Builder(context ...); 
     builder.SetContentIntent(pendingIntent) ....
}

希望这会有所帮助