我以为我所有的应用程序都通过了初始测试,因此我已经完成了从GCM到FCM的转换。但是,随后的beta测试表明它们都有相同的问题。我将以消息传递应用程序为例。 。
消息传递应用程序使用数据消息。在列表服务中接收到消息后,如果该应用程序正在运行,则会将其发布到对话线程中。如果该应用未运行,则接收电话上会发布一条通知,并将传入消息添加到对话数据存储中。
问题在于应用程序关闭后,myFCMListenerService一两个小时后停止工作。我们在GCM上使用的旧的GcmBroadcastReciver始终可以永远工作-几天,几个月。
退出工作后,将发生以下情况。 。
项目中唯一的getPackageName()方法位于LicenseValidator.java和iabHelper.java中。毫无意义。
这是确切的错误,通常在关闭应用程序后约一个小时出现,并且通常在fcmlistener收到第6条消息左右。确实会在收到消息时发生,但是逐步调试显示侦听器服务从未收到引起异常的消息。
12-09 18:18:12.323 13569-13591 / com.deanblakely.SafeTalk.debug E / AndroidRuntime:严重例外:Firebase-MyFcmListenerService 进程:com.deanblakely.SafeTalk.debug,PID:13569 java.lang.NullPointerException:尝试在null上调用虚拟方法'java.lang.String android.content.Context.getPackageName()' 对象参考 在android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:537) 在android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:526) 在com.deanblakely.SafeTalk.SPHelper.getSharedPreferences(SPHelper.java:14) 在com.deanblakely.SafeTalk.SPHelper.getTempString(SPHelper.java:32) 在com.deanblakely.SafeTalk.GlobalStuff.storeMessage(GlobalStuff.java:203) 在com.deanblakely.SafeTalk.MyFcmListenerService.handleNow(MyFcmListenerService.java:98) 在com.deanblakely.SafeTalk.MyFcmListenerService.onMessageReceived(MyFcmListenerService.java:38) 在com.google.firebase.messaging.FirebaseMessagingService.zzd(未知 来源:402) 在com.google.firebase.iid.zzg.run上(未知来源:26) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:636) 在com.google.android.gms.common.util.concurrent.zza.run(未知 资料来源:7) 在java.lang.Thread.run(Thread.java:764)
该应用程序使用的唯一权限是:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.vending.BILLING" />
以下是我们的侦听器服务中的代码,该代码在应用程序处于活动状态时以及关闭应用程序后大约一个小时内均可正常工作。
public class MyFcmListenerService extends FirebaseMessagingService {
private static final String TAG = "MyFcmListenerService";
private Map<String, String> data;
@Override
public void onMessageReceived(RemoteMessage message)
{
String from = message.getFrom();
data = message.getData();
String debug = "what is in data?";
if (message.getNotification() != null) //is this a notification?
{
Log.d(TAG, "Message Notification Body: " + message.getNotification().getBody());
}
else
{
if (message.getData().size() > 0)
{
Log.d(TAG, "Message data payload: " + message.getData());
handleNow(message); //out methods that processes the message
}
else
{
Log.d(TAG," Got empty data message");
}
}
}
当然,我们的清单文件中包含以下内容。 。
<service
android:name=".MyFcmListenerService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>