2

所以我们有一个 iOS 应用程序和一个 Android 应用程序,每个应用程序都使用各自的通知方法框架......iOS 有推送,Android 有 C2DM(直到我们把它带到 GCM)......在 iOS 上一切都很好,但我寻找一种方法来检测应用程序是否通过单击 C2DM 消息启动(类似于 iOS 上的 didFinishLaunchingWithOptions 功能)。

目前,当在 Android 上收到推送消息时,我会根据消息有效负载中包含的数据执行我需要执行的任何处理......因此,当用户启动应用程序时,他们的体验取决于该推送消息中的内容. 无论他们是通过按主屏幕/历史记录上的图标还是推送消息来启动,情况都是如此。理想情况下,我们希望只有当他们选择该消息时才会发生这种情况,并且如果他们从主/历史屏幕中选择应用程序,那么它应该正常启动。

4

1 回答 1

0

您可以在 GCMIntentService 意图类的 onMessage 侦听器上的 SharedPreferences 中保存一些数据。GCM 监听器毕竟属于你的包应用程序。您保存的内容取决于您的应用程序和消息负载,但它可能是您想要的任何内容。然后在单击通知时启动的 Activity 的 onCreate 函数上,您阅读 Shared Preferences 以查看您是否来自 GCM 通知。请记住清除您保存在 SharedPreferences 中的变量,以便下次用户打开应用程序时,它可以正确显示内容。

你在这里有一个例子。不幸的是,我现在无法尝试,但看到这个想法很有用。它与 G2DM 非常相似,因此您必须在您的情况下寻找等价物。

public class GCMIntentService extends GCMBaseIntentService {

    /*... other functions of the class */

    /**
     * Method called on Receiving a new message
     * */
    @Override
    protected void onMessage(Context context, Intent intent) {
        Log.i(TAG, "Received message");
        String message = intent.getExtras().getString("your_message");

        // notifies user
        generateNotification(context, message);
    }

    /**
     * Issues a notification to inform the user that server has sent a message.
     */
    private static void generateNotification(Context context, String message) {
        int icon = R.drawable.ic_launcher;
        long when = System.currentTimeMillis();
        NotificationManager notificationManager = (NotificationManager)
            context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = new Notification(icon, message, when);

        // Save your data in the shared preferences
        SharedPreferences prefs = getSharedPreferences("YourPrefs", MODE_PRIVATE);  
        SharedPreferences.Editor prefEditor = prefs.edit();  
        prefEditor.putBoolean("comesFromGCMNotification", true);  
        prefEditor.commit(); 

        String title = context.getString(R.string.app_name);

        Intent notificationIntent = new Intent(context, MainActivity.class);
        // set intent so it does not start a new activity
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
            Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent intent =
            PendingIntent.getActivity(context, 0, notificationIntent, 0);
        notification.setLatestEventInfo(context, title, message, intent);
        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        // Play default notification sound
        notification.defaults |= Notification.DEFAULT_SOUND;

        // Vibrate if vibrate is enabled
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notificationManager.notify(0, notification);     

    }

}
于 2013-03-11T20:48:19.580 回答