在Android应用程序接收器,Sender Web服务中推送通知

时间:2015-08-04 10:33:35

标签: android asp.net google-cloud-messaging

我正在尝试在Android应用中仅接收推送通知的示例应用。

我有一个Broacast Receiver和一个服务:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {

public class GcmIntentService extends IntentService

我使用以下代码获得了注册:

regid = gcm.register(SENDER_ID); 

1。如何验证收到的regID是否可以?

2。从我的应用程序收到通知是否足够?我问这个是因为我见过的大多数例子都是在Android应用程序中实现了Sender

第3。我已经有一个广播接收器,为什么我需要服务?

4。我打算实现一个可以与GCM通信的Web服务器。为此,我的应用程序需要将redId发送到Web服务器。我了解Web服务需求 注册ID,API密钥,要发送到GCM的消息文本。什么是JSON格式?如果是,那么URL和方法类型是GET还是POST。或ASP .net

中的任何示例

5。有没有开放的软件,我可以测试我的应用程序通知接收器行为,而无需自己实现服务器?

由于

2 个答案:

答案 0 :(得分:1)

我试着回答 1)如果gcm无法注册,你可以在logcat上看到。 2)我不明白。 3)BroadcastReceiver不是觉醒的。此外,如果您想要后台任务,则无法执行此操作。所以你可以使用WakefulBroadcastReceiver和startWakefullService。所以你可以做什么。 4)您可以在那里获得更多信息https://developers.google.com/cloud-messaging/ 5)我发现它https://github.com/uniqush,但是没有尝试。如果你没有足够的时间,你可以使用Parse :)

答案 1 :(得分:1)

1)有效的GCM注册ID以“APA ..”开头。所以打印并检查这个值;

2)旧文档建议使用一个名为 GcmManager 的类来处理设备注册,它是这样的:

public class GcmManager {

    private static final String PROPERTY_REG_ID = "registration_id";
    private static final String PROPERTY_APP_VERSION = "appVersion";
    private static final String TAG = GcmManager.class.getSimpleName();
    private GoogleCloudMessaging gcm;
    private Context mContext;

    public GcmManager(Context context) {
        this.mContext = context.getApplicationContext();
    }

    public void registerIfNeeded() {
        final String regId = getRegistrationId();
        Log.d(TAG, "regId: " + regId);
        if (regId.isEmpty()) {
            registerInBackground();
        }
        else {
            new Thread(new Runnable() {
                public void run() {
                    sendRegistrationIdToBackend(regId);
                }
            }).run();
        }
    }

    private void storeRegistrationId(Context context, String regId) {
        final SharedPreferences prefs = getGcmPreferences(context);
        int appVersion = getAppVersion(context);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(PROPERTY_REG_ID, regId);
        editor.putInt(PROPERTY_APP_VERSION, appVersion);
        editor.apply();
    }

    public String getRegistrationId() {
        final SharedPreferences prefs = getGcmPreferences(mContext);
        String registrationId = prefs.getString(PROPERTY_REG_ID, "");
        if (registrationId.isEmpty()) {
            Log.i(TAG, "Registration not found.");
            return "";
        }

        int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
        int currentVersion = getAppVersion(mContext);
        if (registeredVersion != currentVersion) {
            Log.i(TAG, "App version changed.");
            return "";
        }
        return registrationId;
    }

    private void registerInBackground() {
        new AsyncTask<Void, Void, String>() {
            @Override
            protected String doInBackground(Void... params) {
                String msg = "";
                try {
                    if (gcm == null) {
                        gcm = GoogleCloudMessaging.getInstance(mContext);
                    }
                    String regId = gcm.register(Constants.GCM_SENDER_ID);
                    storeRegistrationId(mContext, regId);
                } catch (IOException ex) {
                    msg = "Error :" + ex.getMessage();
                }
                return msg;
            }

            @Override
            protected void onPostExecute(String msg) {
                final String regId = getRegistrationId();
                if (!regId.isEmpty()) {
                    sendRegistrationIdToBackend(regId);
                }
            }

        }.execute(null, null, null);
    }

    private static int getAppVersion(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager()
                    .getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException("Could not get package name: " + e);
        }
    }

    private SharedPreferences getGcmPreferences(Context context) {
        return context.getSharedPreferences(GcmManager.class.getSimpleName(),
                Context.MODE_PRIVATE);
    }

    private void sendRegistrationIdToBackend(String regId) {
        // Send registration Id to your API
    }
}

然后你应该调用方法registerIfNeeded来检查设备是否已经注册,顾名思义;

3)WakefulBroadcastReceiver州的官方文件:

  

帮助实现接收设备唤醒事件的BroadcastReceiver的通用模式,然后将工作传递给服务,同时确保设备在转换期间不会重新进入休眠状态。

4和5)This answer显示了如何使用Postman轻松地直接向GCM发出请求。这是一种很好的测试方法,您可以将请求作为自己API的示例