我已经尝试了几个小时来完成一项看似简单的任务而在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)?这甚至可能吗?
非常感谢您的帮助。
答案 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”。我知道这必须是一些愚蠢的错误。