当前位置: 首页 > 知识库问答 >
问题:

如何检查app.oncreate()是通过推送通知调用的还是在用户打开app的过程中调用的

楚意
2023-03-14

我有一个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)
        );

    }
}

共有1个答案

云宾鸿
2023-03-14

即使这是可能的,你也不应该这么做。

当最后一个活动结束时,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通知令牌更新用户文档。 然后,我在我的云函数中读取。非常有效,但我错误地认为如果用户关闭了通知(例如,空或空),令牌将无效。确定是否为我的云应用程序功能启用通知的最佳方法是什么?我在我的搜索中发现了一些命中率,但很多已经过时,或者是针对不同的开发环境。