web-dev-qa-db-ja.com

新しい意図なしに通知からアクティビティに戻るにはどうすればよいですか

from Android開発、サンプルコードによる簡単な通知を実装しますが、私のアプリでは、新しいインテントを作成してアクティビティを再度作成する必要はありません。最後に戻りたいだけです。アクティビティ(メディアプレーヤーUIです)。サンプルコードを使用すると、次の方法で新しいアクティビティが作成されます。

Intent resultIntent = new Intent(this, ResultActivity.class);

新しいインテントに関する相対コードにコメントして通知を受け取りましたが、最後のアクティビティに戻る方法がわかりませんでした...

ホームキーを長押ししてアプリに戻り、アプリをタッチしても問題ありません。私が欲しいのはこの振る舞いのようなものです。

bleowはAndroid開発からのサンプルコードです、私は新しいインテント部分にコメントします。

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.notification_icon)
    .setContentTitle("My notification")
    .setContentText("Hello World!");
/*Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ResultActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
    stackBuilder.getPendingIntent(
        0,
        PendingIntent.FLAG_UPDATE_CURRENT
    );
mBuilder.setContentIntent(resultPendingIntent);*/
NotificationManager mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(mId, mBuilder.build());

[更新]

私は活動の意図と適切さのために旗を立てる必要があると思いました。したがって、私が設定したアクティビティに戻りたい

Android:launchMode="singleInstance"

そして、私は意図から新しいアクティビティを望んでいないので、最後のアクティビティが欲しいだけなので、追加します

Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

ドキュメントから、Pendingintent.contentIntentを使用すると、FLAG_ACTIVITY_NEW_TASKフラグが含まれている必要があります。このフラグを使用するときに、現在開始しているアクティビティに対してタスクがすでに実行されている場合は、新しいアクティビティは開始されません。代わりに、現在のタスクが最後の状態で画面の前面に表示されるだけなので、追加します

Intent.FLAG_ACTIVITY_NEW_TASK

しかし、logCatから、アクティビティに戻るための通知をタッチすると、pendingintentがまだ「生きている」最後のアクティビティを表示するのではなく、onCreate()関数を呼び出していることがわかりました。

21
Hsin-Hsiang

バックグラウンドからアクティビティを呼び出したい場合は、次のことを試してください。

    Intent intent = new Intent(this, YourLauncherActivity.class);
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            intent, 0);
    mBuilder.setContentIntent(pendingIntent);

ホーム画面で通知をクリックすると、アプリの最後に表示されたアクティビティが、新しく開始せずにフォアグラウンドに表示されます。アクティビティがシステムによって強制終了された場合、新しいアクティビティを取得します。

45
Steve Benett

GetActivityの代わりにPendingIntent.getActivitiesを使用しました。これは私のプロジェクトではうまく機能しています。

Intent backIntent = new Intent(this, HomeActivity.class);
                backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent notificationIntent = new Intent(this, NextActivity.class);

                final PendingIntent pendingIntent = PendingIntent.getActivities(this, 1,
                        new Intent[] {backIntent, notificationIntent}, PendingIntent.FLAG_ONE_SHOT);
3

SingleTopモードでは、ルートアクティビティクラスを明示的に定義せずにこのメソッドを使用します。

Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)
.setComponent(getPackageManager().getLaunchIntentForPackage(getPackageName()).getComponent());

通知から最後のアクティビティを再開するには、次のようにします。

builder.setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));

または、サービスから最後のアクティビティを再開するには、次のようにします。

try {
    PendingIntent.getActivity(this, 0, intent, 0).send();
} catch (CanceledException e) {
    e.printStackTrace();
}
1
alex

私にとって、これはうまくいきました:

.setContentIntent(
     PendingIntent.getActivity(
     context,
     0,
     new Intent(context, YOUR_MAIN.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP ),PendingIntent.FLAG_ONE_SHOT))   

FLAG_ONE_SHOT:2回作成しないでください(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPに関連付けられています)

1
Jeffreez