私のMainActicity
はRefreshService
をIntent
で開始し、boolean
というisNextWeek
エキストラがあります。
私のRefreshService
は、ユーザーがクリックするとNotification
を開始するMainActivity
を作成します。
これは次のようになります。
Log.d("Refresh", "RefreshService got: isNextWeek: " + String.valueOf(isNextWeek));
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.putExtra(MainActivity.IS_NEXT_WEEK, isNextWeek);
Log.d("Refresh", "RefreshService put in Intent: isNextWeek: " + String.valueOf(notificationIntent.getBooleanExtra(MainActivity.IS_NEXT_WEEK,false)));
pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
builder = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText("ContentText").setSmallIcon(R.drawable.ic_notification).setContentIntent(pendingIntent);
notification = builder.build();
// Hide the notification after its selected
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(NOTIFICATION_REFRESH, notification);
ご覧のとおり、notificationIntent
には、boolean
に配置されるisNextWeek
の値を持つPendingIntent
extra IS_NEXT_WEEK
が必要です。
今、このNotification
をクリックすると、false
の値として常にisNextWeek
を取得します
これは、MainActivity
の値を取得する方法です。
isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);
ログ:
08-04 00:19:32.500 13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity sent: isNextWeek: true
08-04 00:19:32.510 13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService got: isNextWeek: true
08-04 00:19:32.510 13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService put in Intent: isNextWeek: true
08-04 00:19:41.990 13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity.onCreate got: isNextWeek: false
MainActivity
でIntent
をstartsNextValue`で直接起動すると、次のようになります。
Intent i = new Intent(this, MainActivity.class);
i.putExtra(IS_NEXT_WEEK, isNextWeek);
finish();
startActivity(i);
すべて正常に動作し、true
がisNextWeek
である場合、true
を取得します。
常にfalse
値が存在することを間違えたのは何ですか?
これは問題を解決します: https://stackoverflow.com/a/18049676/2180161
引用:
私の疑いは、インテントで変化するのはエクストラだけなので、
PendingIntent.getActivity(...)
ファクトリーメソッドは単に最適化として古いインテントを再利用しているだけだということです。RefreshServiceで、次を試してください。
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
見る:
http://developer.Android.com/reference/Android/app/PendingIntent.html#FLAG_CANCEL_CURRENT
以下の回答PendingIntent.FLAG_UPDATE_CURRENT
を使用するほうが良い理由を参照してください。
PendingIntent.FLAG_CANCEL_CURRENTの使用は、メモリの非効率的な使用のため、適切なソリューションではありません。代わりにPendingIntent.FLAG_UPDATE_CURRENTを使用します。
また、Intent.FLAG_ACTIVITY_SINGLE_TOP(アクティビティが既に履歴スタックの最上部で実行されている場合は起動されません) 。
Intent resultIntent = new Intent(this, FragmentPagerSupportActivity.class).
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
resultIntent.putExtra(FragmentPagerSupportActivity.PAGE_NUMBER_KEY, pageNumber);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
this,
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
次に:
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
int startPageNumber;
if ( savedInstanceState != null)
{
startPageNumber = savedInstanceState.getInt(PAGE_NUMBER_KEY);
//so on
これで動作するはずです。
それでも動作が予想されない場合は、void onNewIntent(Intent intent)
イベントハンドラを実装してみてください。その方法で、アクティビティに対して呼び出された新しいインテントにアクセスできます(getIntent()を呼び出すだけではありません)。アクティビティを開始した最初のインテント。
@Override
protected void onNewIntent(Intent intent) {
int startPageNumber;
if (intent != null) {
startPageNumber = intent.getExtras().getInt(PAGE_NUMBER_KEY);
} else {
startPageNumber = 0;
}
}
アクティビティでonNewIntent(Intent)
をオーバーライドして新しいものを受け取ったら、Intent
を更新する必要があると思います。以下をアクティビティに追加します。
@Override
public void onNewIntent(Intent newIntent) {
this.setIntent(newIntent);
// Now getIntent() returns the updated Intent
isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);
}
編集:
これは、インテントを受け取ったときにアクティビティがすでに開始されている場合にのみ必要です。意図によってアクティビティが開始された(再開されただけではない)場合、問題は別の場所にあり、私の提案ではそれを修正できない可能性があります。
次のコードが動作するはずです:-
int icon = R.drawable.icon;
String message = "hello";
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);
Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.putExtra("isNexWeek", true);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, pIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);
MainActivity onCreateで:
if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("isNextWeek")) {
boolean isNextWeek = getIntent().getExtras().getBoolean("isNextWeek");
}