3

ランチャーでアプリ アイコンをクリックしてアクティビティを起動すると、履歴から選択するのと同じように、アクティビティが前面に表示されます。したがって、onCreate 呼び出しは存在しないはずです。

ただし、通知をクリックしてアクティビティを開始した後にこれを実行しようとすると、ランチャーはアクティビティの別のインスタンスを開始するだけです。

ランチャーが期待どおりに動作し続ける (バックグラウンドからアプリの正確な状態を再開する) には、どのフラグを追加する必要がありますか?

本質的なコードを投稿します。

これにより、通知が開始されます。

Intent resumeIntent = new Intent(this, MainActivity.class);
PendingIntent resumePendingIntent = PendingIntent.getActivity(this, 2,
        resumeIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Notification resumeNotification = new Notification.Builder(this).setContentTitle(
        "Resume style")
        .setSmallIcon(R.drawable.ic_launcher)
        .setContentIntent(resumePendingIntent)
        .build();

NotificationManager notificationManager = (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
notificationManager.notify(1, launcherNotification);

マニフェスト アクティビティは次のようになります。

    <activity
        android:name="com.example.ihatenotifiicationsapp.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

この resumeIntent は、Android によって FLAG_ACTIVITY_NEW_TASK に自動的に追加されます。このフラグは、存在する場合、バックグラウンドからのアプリケーションの再開を許可します。

ここまでは順調ですが、この通知をクリックしてアプリを再開した後、ランチャーからアプリをクリックすると、Android は MainActivity の別のインスタンスを起動します。

これにより、アプリケーションとバックスタックが壊れます (スタックに 2 つの MainActivity があり、ユーザーにとっては奇妙です)。

おかしなことに、これは、通知をクリックした後にのみ発生します (ランチャーの動作をクリックして別のインスタンスを起動します)。

4

2 に答える 2

1

この動作が必要な場合android:launchMode="singleTask"は、タグでフラグを使用できます。activityこれにより、現在アクティブなインスタンスが 1 つある場合、OS は他のインスタンスを起動できなくなります。launchbehaviors の詳細については、SDK Doku を参照してください

以下の Emanuel Moecklin Comment に対応するこの Answer を編集しました。lauchModes をミックスしました。

ドクからの抜粋:

システムは、新しいタスクのルートにアクティビティを作成し、インテントをそこにルーティングします。ただし、アクティビティのインスタンスが既に存在する場合、システムは、新しいインスタンスを作成するのではなく、その onNewIntent() メソッドを呼び出すことによって、インテントを既存のインスタンスにルーティングします。

于 2013-10-22T12:54:25.343 に答える