4

通知から起動するアクティビティがあります。ユーザーがホーム ボタン (アクション バーのタイトル ボタン) を押すか、戻るキーを使用すると、アプリケーションに戻るように、TaskStackBuilder を使用してバックスタックを含めます。ただし、そのようには機能していません。代わりに、戻るか、アクションバーのタイトルボタンを押すと、常にアプリが閉じます。

価値のあることとして、私のプロジェクト構造は、すべての UI コンポーネントが Android ライブラリ (com.be.commotion) にあり、外部の「ラッパー」プロジェクトがそのライブラリを使用するように編成されています。

通知を作成する方法は次のとおりです。

// This is the activity that will be launched when tapping the notification
Intent intentNotification = new Intent(this, NowPlaying.class);
intentNotification.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

// Create the back stack so the user can get back to the main activity when pressing the back button
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(NowPlaying.class);
stackBuilder.addNextIntent(intentNotification);
PendingIntent pendingNowPlayingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

// Setup the custom notification view
RemoteViews notificationContent = new RemoteViews(getPackageName(), R.layout.notification_now_playing);
....

// Setup the intent that will play/stop music when the stop button is tapped
Intent musicControlIntent = new Intent(this, CommotionMediaPlayer.class);

PendingIntent musicPendingIntent = PendingIntent.getService(this, 0, musicControlIntent, PendingIntent.FLAG_UPDATE_CURRENT);

notificationContent.setOnClickPendingIntent(R.id.ibMediaControl, musicPendingIntent);

// Update the notification with this info
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle(song.text)
                    .setContentText(song.artist)
                    .setContentIntent(pendingNowPlayingIntent)
                    .setLargeIcon(artwork)
                    .setContent(notificationContent)
                    .setOngoing(true);

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

// Using the nowPlayingNotificationId allows the notification to be updated with later calls instead of causing a new notification to show up
mNotificationManager.notify(nowPlayingNotificationId, builder.build());

私の AndroidManifest.xml に適用可能な定義は次のとおりです (ラッパー プロジェクト用)。

    <activity android:name="com.be.commotion.ui.StartupActivity"
            android:label="@string/app_name"
            android:noHistory="true"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Holo.NoActionBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity android:name="com.be.commotion.ui.NowPlaying"
              android:label="Now Playing"
              android:parentActivityName="com.be.commotion.ui.StartupActivity"
              android:screenOrientation="portrait">

        <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.be.commotion.ui.StartupActivity" />

    </activity>
4

3 に答える 3

3

TaskStackBuilder
Intent に 1/ set Flag を使用せずに 2 ステップで実行できます

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);

2/PendingIntent のフラグを設定します

pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);

それは私のために働きます、頑張ってください

于 2013-12-18T19:23:12.043 に答える
1

目的のアクティビティ (通知がクリックされたときに直接呼び出されるアクティビティ) を追加する前に、メイン アクティビティをスタックに追加します。例えば:

stackBuilder.addNextIntent(new Intent(this,MainActivity.class));
stackBuilder.addNextIntent(new Intent(this,DesiredActivity.class));
于 2016-12-25T07:51:50.853 に答える
0

少し異なる問題を解決しているのかもしれませんが、同じ問題に要約されます。私たちにとっての解決策は、次のものを使用することでした。

startActivityForResult(intent, 0);

やりたかったことは、アクティビティ B に移動する通知を作成し、戻るボタンがクリックされたときにアクティビティ A に移動することです。

これを行うには、次の 2 つの方法があります。

B から A を開始: すべてのアクティビティがアプリ内にある場合に機能します

  1. 通知バンドルでパラメータを送信して、アクティビティが通知から開始されたことを定義します
  2. アクティビティ B の OnBack をオーバーライドし、CLEAR_TOP フラグを付けてアクティビティ A を開始するようにします (バックが B に戻らないようにするため)。

A から B を開始: さまざまなアプリでのアクティビティに使用できます (例: メール クライアントを開く)

  1. アクティビティ A に通知する (アクティビティが通知から開始されたことを知るために必要なパラメーターを渡す)
  2. startActivityForResult でアクティビティ B (電子メール クライアントなど) を開始します。通常の startActivity を使用すると、「戻る」ボタンは機能しません。
于 2021-01-07T16:00:47.277 に答える