このようなカスタム通知を表示するシンプルな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を返します。
これはシナリオです:
メソッドgetIntent()
は、起動アクティビティよりも最初のインテントを返します。
そのため、アクティビティが終了(終了)し、ユーザーが通知をクリックすると、アクティビティの新しいインスタンスが実行され、getIntent()
は期待どおりに動作します(Extrasはnotnull
)。
ただし、アクティビティが「スリープ中」(バックグラウンドにある)で、ユーザーが通知をクリックすると、getIntent()
は常に、通知インテントではなく、アクティビティを開始した最初のインテントを常に返します。
したがって、アプリケーションの実行中に通知インテントをキャッチするには、単にこれを使用します
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
onNewIntent(Intent newintent)
をオーバーライドします。
そのため、アプリケーションが最初に実行されるとき、getIntent()
を使用でき、アプリケーションがスリープ状態から再開されるとき、onNewIntent
は機能します。
Resume()メソッドの上にこのコードを書くだけです。これで十分です。これは意図を更新します-よくわかりませんが、うまくいきます。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
問題:保留中の強度に対して同じ要求コードを送信しています。これを変更してください。
ソリューション:グローバル変数int UNIQUE_INT_PER_CALL = 0を設定し、以下のようにpendingIntent呼び出しを作成する場合。
PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);
UNIQUE_INT_PER_CALL++; // to increment.