web-dev-qa-db-ja.com

getIntent()Extrasは常にNULL

このようなカスタム通知を表示するシンプルなAndroidアプリを作成しました:

Context context = getApplicationContext();          
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification( R.drawable.icon, title, System.currentTimeMillis());  
Intent notificationIntent = new Intent( context,  this.getClass()); 
notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE"); 
PendingIntent pendingIntent = PendingIntent.getActivity( context , 0, notificationIntent, 0);               
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
notification.contentView = new RemoteViews(context.getPackageName(), R.layout.notifypbar);
notification.contentIntent = pendingIntent;

notification.contentView.setTextViewText(R.id.notifypb_status_text, text);
notification.contentView.setProgressBar(R.id.notifypb_status_progress, 100, (int)(100*progress), false);

manager.notify(104, notification);

このコードは、アプリケーションで1回だけ呼び出され、進行状況バーに通知を表示します(すべて正しく)。

これで、ユーザーがこの通知をクリックすると、アプリケーションがonResumeイベントを処理します。

public void onResume()
{
    super.onResume();
    // TODO: Extras è SEMPRE NULL!!! impossibile!
    Intent callingintent = getIntent(); 
    Bundle extras = callingintent.getExtras();

しかし、エキストラは常にNULLです!

私は次の組み合わせを試しました:

notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE");

または

Bundle extra = new Bundle();
extra.putString(key, value);
notificationIntent.putExtra(extra);

ただし、getIntent()。getExtras()は常にNULLを返します。

74
Magius

これはシナリオです:
メソッドgetIntent()は、起動アクティビティよりも最初のインテントを返します。

そのため、アクティビティが終了(終了)し、ユーザーが通知をクリックすると、アクティビティの新しいインスタンスが実行され、getIntent()は期待どおりに動作します(Extrasはnotnull)。

ただし、アクティビティが「スリープ中」(バックグラウンドにある)で、ユーザーが通知をクリックすると、getIntent()は常に、通知インテントではなく、アクティビティを開始した最初のインテントを常に返します。

したがって、アプリケーションの実行中に通知インテントをキャッチするには、単にこれを使用します

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

onNewIntent(Intent newintent)をオーバーライドします。

そのため、アプリケーションが最初に実行されるとき、getIntent()を使用でき、アプリケーションがスリープ状態から再開されるとき、onNewIntentは機能します。

113
Magius

Resume()メソッドの上にこのコードを書くだけです。これで十分です。これは意図を更新します-よくわかりませんが、うまくいきます。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
90
coolcool1994

問題:保留中の強度に対して同じ要求コードを送信しています。これを変更してください。

ソリューション:グローバル変数int UNIQUE_INT_PER_CALL = 0を設定し、以下のようにpendingIntent呼び出しを作成する場合。

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);
UNIQUE_INT_PER_CALL++; // to increment.
15