- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用 GCM 在发布图片时收到通知,然后我下载并处理它:
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
DataUtils.log("In GcmBroadcastReceiver! threadname is " + Thread.currentThread().getName());
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
这是我的 GcmIntentService 的开始:
public class GcmIntentService extends IntentService
{
public static final int NOTIFICATION_ID = 1;
public GcmIntentService()
{
super("GcmIntentService");
}
@Override
protected void onHandleIntent(Intent intent)
{
DataUtils.log("In GcmIntentService onHandleIntent(), threadname is " + Thread.currentThread().getName());
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
// The getMessageType() intent parameter must be the intent you received in your BroadcastReceiver.
String messageType = gcm.getMessageType(intent);
if (!extras.isEmpty()) // has effect of unparcelling Bundle
{
/*
* Filter messages based on message type. Since it is likely that GCM will be
* extended in the future with new message types, just ignore any message types you're
* not interested in, or that you don't recognize.
*/
if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType))
{
DataUtils.log("In GcmIntentService - Send error: " + extras.toString());
} else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType))
{
DataUtils.log("In GcmIntentService - Deleted messages on server: " + extras.toString());
// If it's a regular GCM message, do some work.
} else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType))
{
String notificationType = extras.getString(MyAppApi.GCM_MSG_TYPE_KEY);
if(DataUtils.isEmpty(notificationType)) {
DataUtils.log("In GcmIntentService - notificationType is empty!");
} else if(notificationType.equalsIgnoreCase(MyAppApi.GCM_IS_NEW_WALLPAPER)) {
//We're about to receive a new image!
DataUtils.log("In GcmIntentService - Receiving a new image!");
processNewWallpaper();
} else if(notificationType.equalsIgnoreCase(MyAppApi.GCM_IS_FRIEND_NOTIFICATION)) {
//We're about to receive a friend notification
DataUtils.log("In GcmIntentService - Receiving a friend notification!");
processFriendNotification();
} else {
//Unknown
DataUtils.log("In GcmIntentService - Receiving unknown message type! " + notificationType);
}
} else {
DataUtils.log("In GcmIntentService - Unknown GCM message: " + extras.toString());
}
}
//Release the wake lock provided by the WakefulBroadcastReceiver.
GcmBroadcastReceiver.completeWakefulIntent(intent);
}
}
似乎服务会随机死亡。来自日志:
01-13 20:00:44.436: I/ActivityManager(375): Process com.grakk.android (pid 23227) has died.
01-13 20:00:44.444: W/ActivityManager(375): Scheduling restart of crashed service com.grakk.android/.GcmIntentService in 11426ms
代码在收到 GCM 消息时所做的是下载图像,然后向用户显示通知(这类似于普通的聊天应用)。
一位测试人员告诉我,一旦他收到一张图片但没有收到通知,这意味着服务本身已经启动并完成了部分工作,但没有完成。
通知代码与图像的下载和处理一起在 processNewWallpaper() 中运行。这是代码:
...
if(senderContact == null) {
sendNotification(null, message, true);
} else {
sendNotification(senderContact.getName(), message.trim(), false);
}
...
通知方式:
...
// Put the message into a notification and post it. This is just one simple example
// of what you might choose to do with a GCM message.
@SuppressWarnings("deprecation")
@TargetApi(16)
private void sendNotification(String name, String message, boolean isAnonymous)
{
Context context = GcmIntentService.this;
NotificationManager mNotificationManager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, ContactsActivity.class), 0);
Notification.Builder mBuilder = new Notification.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle(context.getString(R.string.app_name));
String textToShow = null;
if(DataUtils.isEmpty(message))
{
if(isAnonymous) {
textToShow = context.getString(R.string.notification_text_anonymous);
} else {
textToShow = String.format(getResources().getString(R.string.notification_text_friend), name);
}
} else {
textToShow = message;
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mBuilder.setStyle(new Notification.BigTextStyle().bigText(textToShow));
}
mBuilder.setContentText(textToShow);
mBuilder.setAutoCancel(true);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mBuilder.setSound(alarmSound);
mBuilder.setContentIntent(contentIntent);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
} else {
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.getNotification());
}
}
我可以通过给自己发送一张图片来重现这一点,然后反复按 Android 后退按钮,直到我不再在应用程序中。我可以按照显示图像已下载的日志消息进行操作,但是它在显示通知之前就死了。
这并不总是会发生。有时显示通知,有时不显示。
我不确定可能的原因是什么,也不知道如何调试它。有什么建议吗?
最佳答案
你在GcmIntentService
类中调用了OnCreate()
吗?
下面是一些示例代码:
public class GcmIntentService extends IntentService {
String mes;
private Handler mHandler;
public GcmIntentService() {
super("GcmIntentService");
}
@Override
public void onCreate() {
super.onCreate();
mHandler = new Handler();
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
String messageType = gcm.getMessageType(intent);
mes = extras.getString("title");
showToast();
Log.i("GCM", "Recevied: (" + messageType + ") " + extras.getString("title"));
GcmReceiver.completeWakefulIntent(intent);
}
public void showToast() {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), mes, Toast.LENGTH_LONG).show();
}
});
}
}
编辑:为 GCM
添加有用的 youtube 教程 here .
关于android - GcmBroadcastReceiver/GcmIntentService 死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27934779/
我的应用程序运行正常,但我遇到了以下错误: 10-04 14:04:38.182: W/MessageQueue(8625): Handler (android.media.MediaPlayer$E
我想将 GCMIntentService 放在包根目录以外的目录中。 GCM documentation指出 By default, it must be named .GCMIntent
在我的应用程序中,我使用了 GCM 服务。我想在 onMessage 函数中发出哔哔声或播放一个小的 mp3 文件。 我的 GCMIntentService 是从 GCMBaseIntentServi
我已经阅读了在这里找到的关于 WakeLock 的各种解决方案,例如在 AndroidManifest.xml 中添加 Permission 以及确保将 GCMIntentService 的 Cons
我正在尝试在我的 android 应用程序中实现 GCMIntentService。 当我尝试将注册 ID 保存在我的数据库中时,asynhttp 显示以下错误 "sending message to
我正尝试在我的 Android 应用中实现 GCM。服务器端和客户端设置似乎是正确的,因为当我从服务器端“推送”一个字符串时调用了 onMessage 方法。我可以从 Intent 中读取额外内容,但
我使用 GCM 在发布图片时收到通知,然后我下载并处理它: public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
我在拥有多个自定义类型的帐户时遇到了问题。 我用GCM (Google Cloud Messaging)从我们的应用程序服务器接收消息。现在,由于您需要自己实现 GCMIntentService ex
这个问题在这里已经有了答案: 关闭9年前。 Possible Duplicate: Android RuntimeException: Unable to instantiate the servic
所以我遇到了一些问题。我试图让我的应用程序根据通过 GCM 收到的消息执行操作。在本例中,应该使用 TextToSpeech 类来发出声音。它有点有效,但不是我第一次发送消息。我意识到这可能是因为 T
未调用 GCMIntentService 的 onRegisterd() 方法。 在日志中显示如下:onReceive:com.google.android.c2dm.intent.REGISTRAT
我正在关注来自 Android 开发人员的 GCM 演示。遇到以下情况。我在 GCMIntentService 中的 OnHandleIntent 没有被调用。有人可以帮忙吗? package com
我正在尝试在 GCM 上注册我的应用程序,但我不知道为什么我的应用程序从未注册过。 GCMRegistrar.register(this, SENDER_ID); 被调用,但我的 GCMIntentS
使用 Google 的 GCM 服务构建 Android 应用程序。 我已经在 GCMIntentService 类中实现了 onRegistered 方法。 问题是我想将主要 Activity 中的
我正在我的应用程序中实现 GCM。我已按照 developer.android.com 的 GCM 教程中给出的所有步骤进行操作 我的应用程序的构建目标指向 Goolge API 8(Android
我的应用程序过去运行得非常好。最近我更新了 eclipse(插件),现在我收到了这个错误。我没有更改我的代码,所以我知道它应该继续工作。但事实并非如此。我正在使用 google eclipse 插件,
您好,我想从 GCMIntentService 发送数据到我的主要 Activity ,我想在那里接收它?我该如何实现? 我非常坚持这一点在我的主要 Activity 中,我有一个列表,我想根据收到的
我正在尝试从 GCMBaseIntentService 运行 AsyncTask,但是当我这样做时应用程序崩溃了。令人感动的是,我想使用 MainActivity 中的上下文来让我的 AsyncTas
我想在收到 GCM 通知时获取用户在 Android 中的位置。 所以在我的 GCMIntentService extends GCMBaseIntentService 中,我这样做了: @Ov
我已经在我的 android 应用程序中成功实现了用于推送通知的 GCM 框架。但是我对 Google 在 GcmIntentService 类中覆盖的功能有点困惑。 @Override protec
我是一名优秀的程序员,十分优秀!