当应用未运行时,Android设备未响应远程推送通知而显示警报

时间:2015-06-28 19:28:01

标签: android delphi android-intent google-cloud-messaging delphi-xe8

我在这里看到很多其他问题,如果一个应用程序被强制停止,它就不会收到通知。

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

但是,如果应用程序在前台运行,则会触发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仪表板上的Engagement选项卡发送测试推送,因此我认为服务器端是正确的。正如我所说,他们正在使用前台的应用程序。

加里

<?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;

1 个答案:

答案 0 :(得分: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的docwiki。