我有一个App extends application
类,它有一个onCreate()
函数,在Android应用程序开始时执行
我如何在app.oncreate()中检查函数是在push通知接收期间调用的(通过下面的IntentService)还是通过其他方式调用的(即通过用户按下应用图标实际打开应用)?
public class GCMNotificationIntentService extends IntentService {
public static final int NOTIFICATION_ID = 1;
public static final String EXTRA_MESSAGE = "message";
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
public GCMNotificationIntentService() {
super("GcmIntentService");
}
public static final String TAG = "GCMNotificationIntentService";
@Override
protected void onHandleIntent(Intent intent) {
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)) {
// sendNotification("Send error: " + extras.toString());
} else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
// sendNotification("Deleted messages on server: " + extras.toString());
}
// If it's a regular GCM message, process it
else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
// if this is a normal message from Earthmiles backend
if (extras.containsKey(EXTRA_MESSAGE)){
sendNotification("" + extras.get(EXTRA_MESSAGE));
Log.i(TAG, "Received Server Push Notif: " + extras.toString());
} else if(extras.containsKey("mp_message")) {
String mp_message = intent.getExtras().getString("mp_message");
sendNotification(mp_message);
Log.i(TAG, "Received Mixpanel Push Notif: " + mp_message);
}
}
}
GcmBroadcastReceiver.completeWakefulIntent(intent);
}
private void sendNotification(String msg) {
Log.d(TAG, "Preparing to send notification...: " + msg);
mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
this).setSmallIcon(R.drawable.earthmiles_logo_green)
.setContentTitle("Earthmiles")
.setSmallIcon(R.drawable.earthmiles_logo_green)
.setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
.setContentText(msg);
mBuilder.setContentIntent(contentIntent);
mBuilder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL;
mBuilder.setAutoCancel(true);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
Log.d(TAG, "Notification sent successfully.");
App.getAnalytics().track(Emanalytics.RECIEVED_PUSH_NOTIF, new Properties()
.putValue("Message Text", msg)
);
}
}
即使这是可能的,你也不应该这么做。
当最后一个活动结束时,Android可能会也可能不会让VM留在身边。如果它没有杀死VM,那么下一次启动应用程序时(不管用什么方法),Android将(或至少可能)重用相同的application
实例,而不需要再调用oncreate()
。因此,如果您正在根据调用oncreate()
时确定的某些条件更改应用程序的行为,那么下次启动它时它可能会做错误的事情。
是否可以知道应用程序是否从消息推送中启动/打开? 我想发射活动可以在这里捕捉到: 然而,当应用程序处于后台时,如何从推送通知中检测到它被打开?
问题内容: 如何检测是否使用SH:或JS:调用了Node.JS文件? 问题答案: if (require.main === module) { console.log(‘called directly’); } else { console.log(‘required as a module’); } 请在此处查看有关此文档的文档:https : //nodejs.org/docs/latest/
问题内容: 我有一个页面可以通过Ajax加载其他页面(请考虑使用框架,除非没有框架)。 显然,这些页面都可以独立调用,因此我想检测是否通过Ajax调用了它们,如果不是,则重定向到主Ajax页面。 这些页面是php页面,因此我也可以访问它。 指数: 问题答案: 使用该对象进行请求时,现代浏览器会添加以下请求标头: 在PHP中,使用以下命令检查此标头的存在:
当应用程序关闭时,我在使用FCM的聊天中收到有关新消息的通知。当我点击它时,我想打开聊天活动,但主活动会打开。 点击推送通知将打开主活动。在其中,我可以从intent获得一种类型的通知,并打开另一个活动: 在我看来,这种方法既肮脏又不方便。是否可以指定单击推送通知时将打开的活动? 编辑:解决问题的步骤: > 为要打开的活动添加意图过滤器: 向FCM消息添加click_action="you-act
在我的应用程序中,我使用了消息推送服务,但我的问题是,当我关闭应用程序时,通知会出现,但当我打开应用程序然后发送通知时,通知不会出现。请帮帮我。
我在我的Dart/Flatter应用程序中使用Firebase云消息。下面的代码使用检索到的android通知令牌更新用户文档。 然后,我在我的云函数中读取。非常有效,但我错误地认为如果用户关闭了通知(例如,空或空),令牌将无效。确定是否为我的云应用程序功能启用通知的最佳方法是什么?我在我的搜索中发现了一些命中率,但很多已经过时,或者是针对不同的开发环境。