контекст для функции onReceive не работает должным образом, когда приложение не запущено - PullRequest
0 голосов
/ 08 августа 2011

Я разрабатываю приложение, которое будет отображать сообщения push-уведомлений.Когда я пытаюсь отобразить сообщения с помощью сообщения «Тост», он работает правильно в любых ситуациях.Но я хочу использовать StatusBarNotifications для этих push-уведомлений.Он работает нормально, когда приложение работает.Если я перезагрузил устройство после выключения, уведомление в строке состояния не отображается.Это тот же случай, когда приложение принудительно закрывается.

Как я могу решить эту проблему?

Ниже приведен код:

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);
}

Ранее я использовал сконтекст, но он не работал для других виджетов, других тостов.поэтому я планировал использовать context.getApplicationContext().

1 Ответ

1 голос
/ 02 марта 2012

TL; DR: используйте getBaseContext() вместо getApplicationContext()

(полу) Подробный ответ:

Я нашел ответ на вашу проблему, поскольку у меня была та же проблема сегодня.проблема в том, что когда ваше приложение принудительно закрывается / после перезапуска и не находится в диспетчере задач, getApplicationContext() не инициализируется должным образом.Его использование даст вам неправильные ссылки при попытке получить диспетчер уведомлений для генерации уведомления.

Есть большая вероятность, что Context, который передается в ваш метод handleMessage, также задан getApplicationContext().

Контекст, который доступен вам, когда ваше приложение еще не запущено, можно получить с помощью getBaseContext()

. Я бы посоветовал проследить, насколько это возможно, с помощью методов до места.где получено намерение push-уведомления, и измените все, что Context будет передано в метод handleMessage, и замените его на Context context = getBaseContext();, а затем вы можете использовать параметр контекста внутри метода.

...