如何在android上的c2dm消息后唤醒已经运行的应用程序

时间:2011-03-09 01:23:03

标签: android android-c2dm

有没有办法在c2dm消息后从通知栏中唤醒已经运行的应用程序? 我有这个在c2dm服务器上注册的应用程序,它从我的服务器接收推送通知进行一些处理。因此,当我从服务器收到c2dm消息后,它会向用户显示状态栏通知,用户会扩展通知并点击我的应用程序,然后启动它。

一切都很好,但如果此应用程序之前已经在运行(从图标开始),这会将我的应用程序的另一个实例加载到内存中。还有一些东西正在崩溃。我已经更改了android:launchMode="singleTop"我的所有活动,我尝试在通知中使用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)而没有运气。我总是最终运行2个应用程序。

感谢任何帮助

这里是我用来在收到c2dm消息后创建通知的静态函数:

public static void notifyStart(Context context, String notificationText) {      
        //notification
        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);

        int icon = R.drawable.icon_notify;
        CharSequence tickerText = notificationText;
        long when = System.currentTimeMillis();

        Notification notification = new Notification(icon, tickerText, when);              
        notification.ledARGB = 0xff00ff00;
        notification.ledOnMS = 400;
        notification.ledOffMS = 400;
        notification.flags |= Notification.FLAG_SHOW_LIGHTS;        
        notification.defaults |= Notification.DEFAULT_SOUND;   

        CharSequence contentTitle = "App Name";
        CharSequence contentText = notificationText;

        Intent notificationIntent = new Intent(context, home.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);   

        mNotificationManager.notify(1350, notification);          
    }

这是我的家庭活动:

    <activity android:name=".home"
              android:label="@string/app_name"
              android:theme="@android:style/Theme.NoTitleBar"
              android:launchMode="singleTop" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

2 个答案:

答案 0 :(得分:1)

伙计们,我很抱歉,但这是我的错:|几天前我决定更改我的应用程序包的名称,忘了从手机中删除旧的应用程序。我没有意识到它会在我的手机上导致两个单独的安装,任务管理器只显示应用程序名称,所以看起来好像有两个同一个应用程序的实例,实际上每个都有一个实例;)对不起麻烦并感谢您愿意提供帮助:)

答案 1 :(得分:0)

Android文档说:

  

如下表所示,模式分为两大类,一方是“standard”和“singleTop”活动,另一方面是“singleTask”和“singleInstance”活动。具有“标准”或“singleTop”启动模式的活动可以多次实例化。实例可以属于任何任务,并且可以位于活动堆栈中的任何位置。通常,它们被启动到调用startActivity()的任务中(除非Intent对象包含FLAG_ACTIVITY_NEW_TASK指令,在这种情况下,选择了不同的任务 - 请参阅taskAffinity属性)。   相比之下,“singleTask”和“singleInstance”活动只能开始一项任务。它们始终位于活动堆栈的根部。此外,设备一次只能保存一个活动实例 - 只有一个这样的任务。

所以看起来(虽然我没有检查过)singleInstance就是你要找的东西。

请参阅:http://bit.ly/gH8SBb