一段时间后,使用解析功能的Android推送将停止工作

克里斯·伯格

我正在使用Parse在Android上发送定向的推送通知。跟随该教程几次(包括不眠之夜),它可以正常运行,但是在某些不可预测的事件中,该应用的android用户停止接收通知。在Google Play上上传更新几个小时后,肯定会发生这种情况。

为了在不上传到Google Play的情况下重现它,我将其范围缩小到从清单更新应用程序的版本号,然后重新运行而不删除和重新安装。但是,对清单进行简单的更改可以使其再次起作用。但是,该解决方案并不可靠,因为它将在几个小时后/上传到生产环境后再次停止工作。

我正在使用自定义的ParsePushBroadcastReceiver播放自定义的声音。我正在使用Google Play服务5进行位置更新。我订阅的是我在以后的活动中推向的频道。关于什么可能导致此类问题的任何想法?代码粘贴如下:

显现

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxx.xxx"
    android:versionCode="19"
    android:versionName="3.077" >

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>
    <!-- GCM PERMISSIONS -->
    <permission android:name="com.xxx.xxx.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="com.xxx.xxx.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="com.xxx.xxx.permission.MAPS_RECEIVE" />
    <application
        android:name="com.xxx.xxx.MyApplication"
        android:allowBackup="true"
        android:allowClearUserData="true"
        android:enabled="true"
        android:icon="@drawable/icon"
        android:logo= "@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <uses-library android:name="com.google.android.maps" />

        <service android:name="com.xxx.xxx.xxxLocationService" />

         <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="xxxxxxxxxxx"/>
        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data android:name="com.parse.push.gcm_sender_id"
                    android:value="id:xxxxx" />
        <service android:name="com.parse.PushService" />
        <receiver android:name="com.parse.ParseBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.xxx.xxx.xxxBroadcastReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="com.parse.push.intent.RECEIVE" />
                <action android:name="com.parse.push.intent.DELETE" />
                <action android:name="com.parse.push.intent.OPEN" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.parse.GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

                <!--
                  IMPORTANT: Change "com.parse.starter" to match your app's package name.
                -->
                <category android:name="com.xxx.xxx" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

应用类别

public class MyApplication extends Application {
       @Override
       public void onCreate(){
           Parse.initialize(this, "xxxxxx", "xxxxxx");
           ParseInstallation.getCurrentInstallation().saveInBackground();
       }
}

依存关系

dependencies {
    compile 'com.google.android.gms:play-services:5.+'
    compile 'com.google.code.gson:gson:2.3'
    compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
    compile 'com.android.support:support-v4:22.0.0'
    compile files('libs/PayPal_MPL.jar')
    compile files('libs/libGoogleAnalyticsServices.jar')
    compile 'com.parse.bolts:bolts-android:1.1.4'
    compile fileTree(dir: 'libs', include: 'Parse-*.jar')
    compile files('libs/Parse-1.8.3.jar')
}

ParsePushBroadcastReceiver

public class xxxBroadcastReceiver extends ParsePushBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            String jsonData = intent.getExtras().getString("com.parse.Data");
            JSONObject json = new JSONObject(jsonData);

            String title = null;
            if(json.has("title")) {
                title = json.getString("title");
            }

            String message = null;
            if(json.has("alert")) {
                message = json.getString("alert");
            }

            if(message != null) {
                generateNotification(context, title, message);
            }
        } catch(Exception e) {
            Log.e("NOTIF ERROR", e.toString());
        }
    }


    private void generateNotification(Context context, String title, String message) {
        Intent intent = new Intent(context, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);

        NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        if(title == null) {
            title = context.getResources().getString(R.string.app_name);
        }

        final NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(context)
                        .setSmallIcon(R.drawable.icon)
                        .setContentTitle(title)
                        .setContentText(message)
                        .setStyle(new NotificationCompat.BigTextStyle()
                                .bigText(message))
                        .addAction(0, "View", contentIntent)
                        .setAutoCancel(true)
                        .setDefaults(new NotificationCompat().DEFAULT_VIBRATE)
                        .setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.whistle));

        mBuilder.setContentIntent(contentIntent);

        mNotifM.notify(randInt(100000000, 999999999), mBuilder.build());
    }

    public static int randInt(int min, int max) {

        // NOTE: Usually this should be a field rather than a method
        // variable so that it is not re-seeded every call.
        Random rand = new Random();

        // nextInt is normally exclusive of the top value,
        // so add 1 to make it inclusive
        int randomNum = rand.nextInt((max - min) + 1) + min;

        return randomNum;
    }

}

订阅频道

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_jobs);

    ...

    ParsePush.subscribeInBackground("driver");
}

更新

这是我目前重现此问题的方式。我在调试模式下运行,并且可以运行,然后更改了应用程序的版本号并导出了已签名的应用程序以进行生产(不运行)。我将签名的APK安装到设备上(删除后),并且通知停止工作。好像覆盖了ParsePushBroadcastReceiver与此无关。如果删除并以相同的版本号在调试模式下重新运行,则在更改清单中的某些内容(如BroadcastReceiver)之前,该方法将无法工作。这是我设法重现它的方法,但是通知到达Google Play时无论如何都会停止工作(立即重试)。我想念什么?

ki

示例实现中,此注释为:

// Check if app was updated; if so, it must clear the registration ID
// since the existing registration ID is not guaranteed to work with
// the new app version.

我敢肯定你碰到了这个。因此,解决方案是在更新后注册您的应用。我想对于您而言,最好的选择是查看PACKAGE_REPLACED事件,在那里您应该再次注册您的应用。还要检查此问题以查看其工作原理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

一段时间后SignalR停止工作

来自分类Dev

使用 MediaCapture 的相机流会在一段时间后停止工作吗?

来自分类Dev

Android在应用小部件中获取位置信息-locationManager似乎在一段时间后停止工作

来自分类Dev

PHPStorm:XDebug会在一段时间后停止工作

来自分类Dev

AutoHotkey-脚本在一段时间后停止工作

来自分类Dev

SSL请求在一段时间后停止工作

来自分类Dev

图腾运行了一段时间后,notify-osd停止工作

来自分类Dev

Firebase Storage文件下载在一段时间后停止工作

来自分类Dev

Docker容器中的热重载在一段时间后停止工作

来自分类Dev

D3js碰撞在一段时间后停止工作

来自分类Dev

SMS接收器在一段时间后停止工作

来自分类Dev

图腾运行了一段时间后,notify-osd停止工作

来自分类Dev

SSL请求在一段时间后停止工作

来自分类Dev

为什么桌面锁定会在一段时间后停止工作?

来自分类Dev

一段时间后Wi-Fi停止工作

来自分类Dev

X11转发在一段时间后停止工作

来自分类Dev

Google身份验证会在一段时间后停止工作

来自分类Dev

PHP foreach在一段时间后停止工作

来自分类Dev

Jhipster:异步 sendemail() 在一段时间后停止工作

来自分类Dev

在 ubuntu 18.04 中连接一段时间后,wifi 停止工作

来自分类Dev

为什么 setState 在一段时间后停止工作?

来自分类Dev

声音在 ubuntu 12.10 一段时间后停止工作

来自分类Dev

在Ubuntu 17.04上使用Internet一段时间后,Wifi(RTL8821AE)停止工作

来自分类Dev

Android小部件过一段时间后会停止工作吗?

来自分类Dev

一段时间后停止功能

来自分类Dev

在一段时间后和/或行为异常后,Cyborg RAT 3游戏鼠标停止工作

来自分类Dev

在一段时间后和/或行为异常后,Cyborg RAT 3游戏鼠标停止工作

来自分类Dev

一段时间后停止Android服务?

来自分类Dev

VirtualBox双向剪贴板共享在Linux来宾OS上一段时间后停止工作

Related 相关文章

  1. 1

    一段时间后SignalR停止工作

  2. 2

    使用 MediaCapture 的相机流会在一段时间后停止工作吗?

  3. 3

    Android在应用小部件中获取位置信息-locationManager似乎在一段时间后停止工作

  4. 4

    PHPStorm:XDebug会在一段时间后停止工作

  5. 5

    AutoHotkey-脚本在一段时间后停止工作

  6. 6

    SSL请求在一段时间后停止工作

  7. 7

    图腾运行了一段时间后,notify-osd停止工作

  8. 8

    Firebase Storage文件下载在一段时间后停止工作

  9. 9

    Docker容器中的热重载在一段时间后停止工作

  10. 10

    D3js碰撞在一段时间后停止工作

  11. 11

    SMS接收器在一段时间后停止工作

  12. 12

    图腾运行了一段时间后,notify-osd停止工作

  13. 13

    SSL请求在一段时间后停止工作

  14. 14

    为什么桌面锁定会在一段时间后停止工作?

  15. 15

    一段时间后Wi-Fi停止工作

  16. 16

    X11转发在一段时间后停止工作

  17. 17

    Google身份验证会在一段时间后停止工作

  18. 18

    PHP foreach在一段时间后停止工作

  19. 19

    Jhipster:异步 sendemail() 在一段时间后停止工作

  20. 20

    在 ubuntu 18.04 中连接一段时间后,wifi 停止工作

  21. 21

    为什么 setState 在一段时间后停止工作?

  22. 22

    声音在 ubuntu 12.10 一段时间后停止工作

  23. 23

    在Ubuntu 17.04上使用Internet一段时间后,Wifi(RTL8821AE)停止工作

  24. 24

    Android小部件过一段时间后会停止工作吗?

  25. 25

    一段时间后停止功能

  26. 26

    在一段时间后和/或行为异常后,Cyborg RAT 3游戏鼠标停止工作

  27. 27

    在一段时间后和/或行为异常后,Cyborg RAT 3游戏鼠标停止工作

  28. 28

    一段时间后停止Android服务?

  29. 29

    VirtualBox双向剪贴板共享在Linux来宾OS上一段时间后停止工作

热门标签

归档