在应用运行时显示来自推送通知的弹出窗口

时间:2014-09-21 04:13:37

标签: android android-activity push-notification google-cloud-messaging intentservice

我已经尝试了几个小时来完成一项看似简单的任务而在Android中没有成功。 我有一个用户可以获得成就的应用程序。计算服务器端并通过推送发送到我的Android应用程序。 当我收到推送通知时,我想做两件事之一: (1)如果我的应用程序正在运行,我想显示一个带有成就信息的弹出窗口(我在xml中有这个布局)。 (2)如果我的应用未运行,请向通知栏发布通知。

第一个问题:无论我怎么努力,我都做不到(1)。我尝试从GCM IntentService OnHandleIntent开始一个新活动,如下所示:

int achID = jo.getInt("AchievementID");
Intent newAchievementIntent = new Intent(getBaseContext(), NewAchievementActivity.class);
newAchievementIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
newAchievementIntent.putExtra("AchievementID", achID);
getApplication().startActivity(newAchievementIntent);

这根本不起作用。 然后我试着让我的所有活动继承自一个特殊的IsRunningActivity,它有一个广播监听器,然后开始一个新的活动,如下:

public class IsRunningBaseActivity extends Activity
{
    public static boolean isRunning = false;
    public static IsRunningBaseActivity currentActivity = null;

    @Override
    protected void onResume()
    {
        // TODO Auto-generated method stub
        super.onResume();

        currentActivity = this;

        isRunning = true;

        LocalBroadcastManager.getInstance(this).registerReceiver(new BroadcastReceiver()
        {

            @Override
            public void onReceive(Context context, Intent intent)
            {
                int achId = intent.getExtras().getInt("AchievementID");
                Intent newAchievementIntent = new Intent(IsRunningBaseActivity.this, NewAchievementActivity.class);
                newAchievementIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                newAchievementIntent.putExtra("AchievementID", achId);
                IsRunningBaseActivity.this.startActivity(newAchievementIntent);
            }
        }, new IntentFilter(CLServices.NOTIFICATION_NEW_ACHIEVEMENT));
    }

    @Override
    protected void onPause() 
    {
        super.onPause();

        isRunning = false;
    };
}

现在,IntentService会广播一个intent,然后由正在运行的活动选择它,然后尝试启动NewAchievementActivity。仍然没有运气。活动没有开始。

我在这里做错了什么? 在这里完成我想要的最好的方法是什么?

第二个问题:当我因为应用未运行而显示来自推送的通知时,我希望用户能够点按通知以打开我的应用并显示相同的NewAchievementActivity。问题是,该活动取决于应用程序上下文(用户需要登录并拥有LoginToken,以便我可以检索他要显示的成就数据)。那么如何在仍然通过我的应用程序的正常流程时打开该活动? (LoginActivity,HomeActivity,NewAchievementActivity)?这甚至可能吗?

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

以下代码应该回答您的第一个问题。当它进入时,它使用GCM来更新我的列表视图。 可以找到问题Refreshing activity on receiving gcm push notification 该链接将进一步解释。希望它有所帮助。

@Override
public void onResume() {
super.onResume();
context .registerReceiver(mMessageReceiver, new IntentFilter("unique_name"));
}

//Must unregister onPause()


@Override

protected void onPause() {

super.onPause();

context.unregisterReceiver(mMessageReceiver);
}


//This is the handler that will manager to process the broadcast intent
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override

public void onReceive(Context context, Intent intent) {

    // Extract data included in the Intent
    String message = intent.getStringExtra("message");

    //do other stuff here
}

};

第二个问题,如果我理解正确的话。您可以指定通知单击时发生的情况。所以只需将用户发送到您希望他们去的地方。

Intent intent= new Intent(context, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,intent, 0);

答案 1 :(得分:0)

我弄清楚问题是什么。我只是在我试图打开的活动中没有调用“setContentView”。我知道这必须是一些愚蠢的错误。