我已经在我的应用程序中配置了带有 firebase 的推送通知,到目前为止一切顺利,我在应用程序打开和关闭时收到通知,当它打开并且有东西到达时,我要求主体执行某些操作,例如打开另一个活动,如下所示例子
public class MiFirebaseMessagingService extends FirebaseMessagingService {
public 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, "Notificación: " + remoteMessage.getNotification().getBody());
mostrarNotificacion(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
}
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Data: " + remoteMessage.getData());
}
}
private void mostrarNotificacion(String title, String body) {
Intent intent = null;
if(body.equals("Login")){
intent = new Intent(this, Login.class);
}
if(body.equals("AppIntro")){
intent = new Intent(this, AppIntroGalery.class);
}
if(body.equals("Menu")){
intent = new Intent(this, TabsActivity.class);
}
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setSound(soundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
} }
如果我不知道它是如何实现的,当它关闭时,这段代码似乎不起作用,它只会打开它,但它不会去不同的活动任何想法?
尝试在意图上加上标志
intent = new Intent(this, SplashInicio.class);
intent.putExtra("idScreen", 12);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
飞溅类:
@Override
protected void onNewIntent(Intent intent) {
String idScreen = getIntent().getExtras().getString("idScreen");
if(idScreen.equals("12")){
startActivity(new Intent(this, Login.class));
}
// clean intent for new Push Notification Data.
super.onNewIntent(null);
}
同样没有结果,更具体地说,我需要当应用程序关闭并收到通知时,这取决于我在消息中得到的内容来执行某个操作,最好的办法是能够打开一个活动并是否发送标志
我添加清单
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="odontosys.com.odontosys">
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/pagoexitosoxxxhdpi"
android:label="@string/app_name"
android:roundIcon="@mipmap/audi"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<service
android:name=".MiFirebaseInstanceIdService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
<service
android:name=".MiFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_launcher_round" />
<activity android:name=".SplashInicio"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Login"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ListadoClientes"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
</activity>
<activity android:name=".AppIntroGalery"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
</activity>
<activity
android:name=".TabsActivity"
android:label="@string/title_activity_tabs"
android:theme="@style/AppTheme.NoActionBar">
</activity>
</application>
Bruno,在您的类中接收扩展自
FirebaseMessagingService
并具体发生在的数据onMessageReceived()
被理解为生成通知,无论应用程序是打开还是关闭都无关紧要。至于您的方法,它可以毫无问题地工作,您不需要指定任何类型的 FLAG 或使用onNewIntent():
要使其正常工作,您必须考虑以下几点:
1) 您需要在 AndroidManifest.xml 文件中指定您的活动
2) 参数
body
必须明确包含您在比较中指明的文本:3)最重要的一点是,使用 FCM 它是在RemoteMessage而不是 Bundle 中接收的。如果出现以下情况,您将显示通知
remoteMessage.getNotification()
:但它不会打开
intent
Activity,因为 的值remoteMessage.getNotification().getBody()
不是“Login”、“AppIntro”或“Menu”,你应该检查这一点。更改通知的代码也很重要,因为如果您之前收到的通知
body
的代码与您的值为 0 的代码不同,那么这将导致它无法打开任何 Activity,我建议您创建一个方法来获取将用作代码的随机值:并在意图中定义此代码:
在这种情况下,只有第一个通知会
Activity
在应用程序中打开一个,因为正如我所提到的,条件是它body
的值是“Login”、“AppIntro”或“Menu”,如果您打开一个不符合此条件的通知条件下,它只会从头开始打开。我告诉你,如果你关闭了应用程序,它就不会那样工作,好吧,我已经尝试过了,firebase 文档推荐的内容,如果它对我有用,就是发送消息数据,我正在寻找的活动当点击通知时,当然还有背景颜色,以便图标看起来不全是白色,我以这种方式从 php 发送它们,但它适用于任何其他请求它的方式:
有问题的主题是click_action,当您单击通知时,您可以在其中指明要打开的活动。当图标保持空白时使用颜色,因为当它在后台或关闭时,它不会占用firebase监听器的配置。
当应用程序关闭或在后台时,这非常有效。
干杯
做你想做的事情的一种方法是从第一个打开的主要活动中获取数据。当应用程序完全关闭并且您点击通知时收到通知时,它已经打开了带有Extras等数据的主intent,因此必须通过以下方式在您的
onResume
现在您会问自己,例如,为什么我发送到 get
action
,以及我问您是否在自定义数据部分使用 Firebase 控制台,您可以将action
其作为键,然后值将是您想要的值审查Login
AppIntro
等 这个答案更多地基于我在 FireBase 中接收推送通知的经验,其中应用程序关闭并根据通知中收到的内容执行操作。作为我回答的附件,我向您发送了使用 FCM 时如何发送数据的链接:接收消息