尽管我已经按照 Android Dev Site 上的教程进行操作(我使用的是较新的 GCM API),但我想确保在 GCM 设置方面我已经掌握了一切,所以我将其分解为以下内容部分:
清单文件:
1)我的应用程序包名称是:package="com.abc.xyz.demo"
<permission android:name="com.abc.xyz.demo.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.abc.xyz.demo.permission.C2D_MESSAGE" />
我的广播接收器和意图服务在清单中如下:
<receiver
android:name="com.abc.xyz.demo.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.abc.xyz.demo" />
</intent-filter>
</receiver>
<service android:name="com.abc.xyz.demo.gcm.GCMIntentService" />
com.abc.xyz.demo.gcm 包具有 GCMBroadcastReceiver 和 GCMIntentService。我现在只使用广播接收器(因为教程提到 IntentService 是可选的)如下:
public class GCMBroadcastReceiver extends BroadcastReceiver
{
public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
Context ctx;
public TWGCMBroadcastReceiver()
{
Log.i("GCMAudit", "Receiver Instaniated!");
}
@Override
public void onReceive(Context context, Intent intent)
{
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
ctx = context;
String messageType = gcm.getMessageType(intent);
if (messageType != null && messageType.length() > 0)
{
if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType))
sendNotification("Send error: " + intent.getExtras().toString());
else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType))
sendNotification("Deleted messages on server: " +intent.getExtras().toString());
else
sendNotification("Received: " + intent.getExtras().toString());
setResultCode(Activity.RESULT_OK);
}
else
{
setResultCode(Activity.RESULT_CANCELED);
}
}
// Put the GCM message into a notification and post it.
private void sendNotification(String msg)
{
mNM = (NotificationManager)ctx.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent cI = PendingIntent.getActivity(ctx, 0, new Intent(ctx, Main.class), 0);
...
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}
请注意,我可以成功注册,并将 regId 发送到我们的应用程序服务器(我现在无法直接访问服务器)
这里有一些一般查询:
1) 我们的 Web 应用程序服务器或 GCM 是否需要知道我的包名称?如果是这样,我需要明确发送吗?目前我只从 Google 项目中发送发件人 ID。
2) 如果包名称有问题,我如何将 Android 应用程序的包名称与服务器上的包名称(如果有)匹配?
3) 上述广播接收器实现是否足以用于测试目的?或者除非我也写出服务,否则不会出现任何消息?(我不希望如此)
4) 如何对广播接收器进行单元测试?由于我目前无法操作服务器(只有一个 Web UI 来发送消息)