C2DM-检测应用程序的启动方式

时间:2013-03-11 18:28:45

标签: android android-c2dm

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

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

1 个答案:

答案 0 :(得分:0)

您可以在GCMIntentService intent类中的onMessage侦听器的SharedPreferences中保存一些数据。毕竟GCM监听器属于你的包应用程序。 您保存的内容取决于您的应用程序和消息有效负载,但它可能是您想要的任何内容。 然后在单击通知时启动的Activity的onCreate函数上,您阅读共享首选项以查看您是否来自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);     

    }

}