3

我在这里看到了许多其他问题,说如果应用程序被强制停止,它将不会收到通知。

但是,我不会强制停止此应用程序。我只是按下后退按钮。我也尝试过点击主页按钮。在这两种情况下都没有警报。

但是,如果应用程序在前台运行,则会触发 PushReceived 事件并且 AData.Message 会显示正确的文本。因此,似乎远程通知正在发送到设备,只是应用程序从未被唤醒来处理它们。

该应用程序是用 Delphi XE8 编写的,我已经在 KitKat 和 JellyBean 上进行了测试,结果相同。

我怀疑问题出在 Android Manifest 文件中。副本如下。除此之外,我不知道该去哪里。据我了解,当收到推送时,它应该在 Firemonkey 框架中运行一小段代码,在不启动完整应用程序的情况下显示推送消息。

我正在使用本教程中描述的应用程序来尝试找出它在我的实时应用程序中不起作用的原因。这曾经像我预期的那样在 XE7 中工作。

http://docwiki.embarcadero.com/RADStudio/XE8/en/Mobile_Tutorial:_Using_Remote_Notifications_%28iOS_and_Android%29

我正在使用 Kinvey 仪表板上的参与选项卡来发送测试推送,所以我假设服务器端是正确的。正如我所说,他们正在前台使用该应用程序。

加里

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.gwsystemsdns.net.pushtest"
    android:versionCode="1"
    android:versionName="1.0.0"
    android:installLocation="preferExternal">

<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="11" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<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_CALENDAR" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission android:name="net.gwsystemsdns.net.pushtest.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="net.gwsystemsdns.net.pushtest.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<uses-feature android:glEsVersion="0x00020000" android:required="True"/>
<application android:persistent="False" 
    android:restoreAnyVersion="False" 
    android:label="PushTest" 
    android:debuggable="True" 
    android:largeHeap="False"
    android:icon="@drawable/ic_launcher"
    android:theme="@style/AppTheme"
    android:hardwareAccelerated="true">


    <!-- Our activity is a subclass of the built-in NativeActivity framework class.
         This will take care of integrating with our NDK code. -->
    <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
            android:label="PushTest"
            android:configChanges="orientation|keyboard|keyboardHidden"
            android:launchMode="singleTask">
        <!-- Tell NativeActivity the name of our .so -->
        <meta-data android:name="android.app.lib_name"
            android:value="PushTest" />
        <intent-filter>  
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter> 
    </activity>

    <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />
    <receiver android:exported="true" android:name="com.embarcadero.gcm.notifications.GCMNotification" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="net.gwsystemsdns.net.pushtest" />
</intent-filter>
</receiver>

</application>
</manifest>
<!-- END_INCLUDE(manifest) -->

我的 Push Received 事件展示了前台推送的接收。

procedure TfrmMain.PushEvents1PushReceived(Sender: TObject; const AData: TPushData);
begin
  Memo1.Lines.Add('Push Received');
  Memo1.Lines.Add('Push = ' + AData.Message);
end;
4

1 回答 1

1

我发现了问题。XE8 清单模板文件中缺少此行:

    <%activity%>
    <service android:name="com.embarcadero.gcm.notifications.GCMIntentService" />
    <%receivers%>
</application>

它像这样进入 AndroidManifest.template.xml 文件(紧跟在<%receivers%>标签之后:

    <%activity%>
    <service android:name="com.embarcadero.gcm.notifications.GCMIntentService" />
    <%receivers%>
    <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />
</application>

根据Embarcadero的文档维基。

于 2015-06-30T01:59:30.807 回答