2011-08-08 17 views
0

プッシュ通知メッセージを表示するアプリケーションを開発しています。 Toastメッセージを使ってメッセージを表示しようとすると、どのような状況でも正常に動作しています。しかし、これらのプッシュ通知にはStatusBarNotificationsを使用します。アプリが実行されているときに正常に動作しています。シャットダウン後にデバイスを再起動すると、ステータスバーの通知が表示されません。これは、アプリが強制終了された場合と同じです。アプリケーションが実行されていないときにonReceive関数のコンテキストが正常に動作しない

どうすればこの問題を解決できますか?

次のコードです:

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()を使うつもりだった。

+0

参照http://stackoverflow.com/questions/6921464/android-context-has-some-problem-when-displaying-push-notification-using-c2dm/8974369#8974369 –

答えて

1

TL; DR:getBaseContext()の代わりgetApplicationContext()

(セミ)の詳細な回答を使用します。今日は同じ問題を抱えていたよう

を私はあなたの問題への答えを考え出しました。 問題は、アプリケーションが強制終了/再起動後にタスクマネージャに座っていないときに、getApplicationContext()が正しく初期化されていないことです。これを使用すると、通知マネージャーを取得して通知を生成しようとするときに間違った参照が返されます。

handleMessageメソッドに渡されたContextgetApplicationContext()でも与えられる可能性があります。

アプリケーションが生きていないときに利用することができますコンテキストは、私がお勧めします何getBaseContext()

で取得することができますは、プッシュ通知の意図が取得する場所に可能な限りメソッドを介してバックトレースすることです受け取り、ContextがhandleMessageメソッドに渡されたものを変更し、Context context = getBaseContext();に置き換え、メソッド内でcontextパラメータを使用できます。

関連する問題