Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 应用程序未运行时,onReceive函数的上下文无法正常工作_Android_Push Notification_Android Context_Android C2dm - Fatal编程技术网

Android 应用程序未运行时,onReceive函数的上下文无法正常工作

Android 应用程序未运行时,onReceive函数的上下文无法正常工作,android,push-notification,android-context,android-c2dm,Android,Push Notification,Android Context,Android C2dm,我正在开发一个显示推送通知消息的应用程序。当我尝试使用Toast消息显示消息时,它在任何情况下都能正常工作。但是我想对这些推送通知使用StatusBarNotifications。当应用程序运行时,它工作正常。如果在关机后重新启动设备,则不会显示状态栏通知。当应用程序被强制关闭时,情况也是如此 我如何解决这个问题 代码如下: public void onReceive(Context context, Intent intent) { if (intent.getAction().equa

我正在开发一个显示推送通知消息的应用程序。当我尝试使用Toast消息显示消息时,它在任何情况下都能正常工作。但是我想对这些推送通知使用
StatusBarNotifications
。当应用程序运行时,它工作正常。如果在关机后重新启动设备,则不会显示状态栏通知。当应用程序被强制关闭时,情况也是如此

我如何解决这个问题

代码如下:

public void onReceive(Context context, Intent intent)
{ 
  if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE"))
  {
    handleMessage(context, intent);
  }
}
private void handleMessage(Context context, Intent intent)
{
    String message= intent.getStringExtra("msg");
     Toast.makeText(context.getApplicationContext(),"\n message : "+message,1).show();
     NotificationManager objNotfManager=(NotificationManager)  context.getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    int icon = R.drawable.logo;
    CharSequence tickerMessage = message;
    long when= System.currentTimeMillis();
    Notification objNotf = new Notification(icon,tickerMessage,when);
     CharSequence title = "New message from "+message;
    CharSequence mesage = "You have "+number+" unread messages";
    Intent NotifIntent  = new Intent( context.getApplicationContext(),TabContainer.class);
    NotifIntent.putExtra("message",message);
    PendingIntent contentIntent  = PendingIntent.getActivity(  context.getApplicationContext(), 0, NotifIntent, 0);
    objNotf.setLatestEventInfo(  context.getApplicationContext(), title, mesage, contentIntent);
            objNotfManager.notify(1,objNotf);
}

以前我使用的是上下文,但它不适用于其他小部件,也不适用于Toast。所以我计划使用
context.getApplicationContext()

TL;DR:使用
getBaseContext()
而不是
getApplicationContext()

(半)详细答覆:

我找到了你问题的答案,因为我今天也遇到了同样的问题。 问题在于,当您的应用程序在重新启动后被强制关闭,并且不在任务管理器中时,
getApplicationContext()
没有正确初始化。在尝试检索通知管理器以生成通知时,使用它将给您错误的引用

传递给handleMessage方法的
上下文也很可能由
getApplicationContext()
给出

当应用程序处于非活动状态时,可以使用
getBaseContext()

我建议通过这些方法尽可能追溯到接收推送通知意图的位置,并更改传递给handleMessage方法的任何
Context
,并将其替换为
Context=getBaseContext()
然后可以在方法中使用上下文参数。

请参阅