web-dev-qa-db-ja.com

通知からの意図には追加機能はありません

これは一般的な問題のようであり、私はすでに見つけることができるすべての関連する質問を経験しました: アクティビティは新しい意図を認識していませんなぜ余分なデータ(整数)が送信されないAndroid通知インテント?通知は古いインテントエクストラを渡しますインテントのエクストラを通知に入れられません 、- Androidの保留中のインテント通知の問題 ;しかし、これを理解することはできません。

問題は同じです。いくつかの追加情報を伝えるPendingIntentを使用して通知を設定しましたが、反対側では通知を受け取りません。

通知を生成するコードは次のとおりです。

Notification notification = new Notification(R.drawable.icon, getResources().getString(R.string.notification_ticker), System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;

Intent start_test = new Intent(this, MyActivity.class);
start_test.putExtra("start_test", true);
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent pi = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), start_test, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(this, getResources().getString(R.string.notification_title), getResources().getString(R.string.notification_content, expired), pi);
nm.notify(NOTIFICATION_ID, notification);

そして反対側で:

boolean start_test=getIntent().getBooleanExtra("start_test", false);

バンドルは実際にはありません(getExtras()はnullを返します)。

PendingIntent.getActivityFLAG_UPDATE_CURRENTFLAG_CANCEL_CURRENTFLAG_ONE_SHOT)のさまざまなフラグを試しましたが、いずれも役に立たなかった。

コードに示すように、getCurrentMillisを使用してrequestIDが変更されていることを確認します。

また、MyActivityでは、onCreateonNewIntentが呼び出されないことがわかりました。 onResumeのみです。 FLAG_ACTIVITY_NEW_TASKが設定されていても... ...

非常に単純なものが欠けていますか?

42
Matthieu

通知インテントにFLAG_ACTIVITY_NEW_TASKを設定すると、以下が発生します。

  • アクティビティがnotで既に実行されている場合、新しいタスクが開始され、onCreate()のアクティビティにインテントが配信されます

  • ただし、アクティビティが既にタスクで実行されている場合、そのタスクはフォアグラウンドになります。それで全部です。インテントはnot配信され、onNewIntent()は呼び出されません。

Intentを実際に配信したい場合を指定する必要があります:

start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);

アクティビティのlaunchModesingleTopであるかどうかに関係なく、違いはありません。それでも、Intent.FLAG_ACTIVITY_SINGLE_TOPを指定する必要があります意図。

注:アクティビティがすでにタスクで実行されており、アクティビティがnotそのタスクのアクティビティスタックの一番上で、タスクがフォアグラウンドに移動します。それで全部です。インテントは配信されませんnot。これを実現する唯一の方法は、他の2つのフラグにIntent.FLAG_ACTIVITY_CLEAR_TOPを追加することですが、これはあなたが望むものではないかもしれません(特定のシナリオによって異なります)。

http://code.google.com/p/Android/issues/detail?id=17137 のGoogleコードで未解決の問題を参照してください

48
David Wasser

PendingIntent.FLAG_UPDATE_CURRENTフラグを保留中のインテントに追加したところ、動作し始めました(インテントのすべてのフラグをスキップしました)。

サンプルコード:

PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
38
codingjeremy
  1. 不要な場合は、avoidマニフェスト内のアクティビティを単一のタスクとして設定します。可能であれば、この行を省略するか、singleTopに変更します。

      Android:launchMode="singleTask”
    
  2. 単一のタスクが必要な場合、保留中のインテントでフラグをインテントに設定します。FLAG_ACTIVITY_NEW_TASK | Intent .FLAG_ACTIVITY_CLEAR_TASK And PendingIntent .FLAG_CANCEL_CURRENT.

    resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK);
    pIntent = PendingIntent.getActivity(context, 0, resultIntent,    PendingIntent.FLAG_CANCEL_CURRENT );
    
  3. タスクが1つしかない場合-on-NewIntent()内のアクティビティのエクストラをsetIntent(intent);でリセットします

    protected void onNewIntent(Intent intent) {
           setIntent(intent);
           ... 
     }
    
4
Udi Reshef

より簡単なアプローチ:実際の問題は、同じターゲットに向けられているインテントが置き換えられることです。 「NotificationDismissalService」という新しいサービスを作成することでこれを解決しました。そのサービスへの唯一のインテントはsetDeleteIntentアイテムです。これは一意のサービスであるため、パラメーターは置き換えられません。 NotificationDismissalServiceの本体(実際には、一意のインテントタイプごとにそのような解雇サービスになります)は、優先サービスにインテントを送信する(正しいパラメーターの読み取り/書き込み)「onStartCommand」の単純な実装です。これは実際のサービスの送信であり、その間に保留中の意図がないため、正常に機能します。

0
user1676075

私はこのようなものを使用しました

Intent myIntent = new Intent(context, DoSomething.class);
 PendingIntent pendingIntent = PendingIntent.getActivity(
        context, 
        0, 
        myIntent, 
        Intent.FLAG_ACTIVITY_NEW_TASK);

完全な例を確認してください here

0

次の方法で意図的にエキストラを送信できます

PendingIntent contentIntent ;
Intent intent = new Intent(this,TestActivity.class);
intent.putExtra("extra","Test");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);

stackBuilder.addParentStack(ArticleDetailedActivity.class);

contentIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

Test ActivityクラスでIntentの余分な値を取得するには、次のコードを記述する必要があります。

Intent intent = getIntent();
 String extra = intent.getStringExtra("extra") ;
0
mohit