0

私は愚かな問題で数時間立ち往生しています。

私のアプリケーションは、A(マスター)とBの2つのアクティビティで構成されています。サービスSも1つあります。「通常の」タスクスタックはABで、Sはバックグラウンドで実行されています。

私の問題は、通知を使用してアクティビティBに直接到達したいときに表示されます。戻るボタンのデフォルトの動作を維持するために、ABを取得するためにタスクスタックを構築する必要があります。(ユーザーがAに戻ることができるようにしたい)。

API 7を使用しているため、Androidデベロッパーチュートリアルhttp://developer.android.com/guide/topics/ui/notifiers/notifications.htmlに示されているようにインテント配列を使用できません。そこで、アクティビティAのonCreate()でこのケースを区別するために、通知によって送信されるインテントにカスタムアクション(S.ACTION_CUSTOM)を追加することにしました。

サービスSで宣言された通知に関連付けられたインテント:

Intent notificationIntent = new Intent(this, A.class);
       notificationIntent.setAction(ACTION_CUSTOM);

Aで、onCreate()メソッドの最後に次を追加します。

if (S.ACTION_CUSTOM.equals(getIntent().getAction())) {
        Intent intent = new Intent(this, B.class);
        intent.setAction(S.ACTION_CUSTOM);
        startActivity(intent); 
 }

このコードは、通知からBに直接移動するように機能し、Aへの戻りを承認します。ただし、通知「ショートカット」を使用すると、ホームメニューからでも、アプリケーションの起動時にBに直接到達します。何が起こるかを理解するために多くのことを試みましたが、Aのifステートメントの最後にgetIntent()。setAction(ANYTHING)を追加しても、動作は同じです。

誰かが私のコードで何が起こっているのか教えてもらえますか?モーバー私は自分の願いをかなえるために他の方法で心を開いています。

ありがとう。

編集:

XMLマニフェストの一部:

<activity
        android:name=".A"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>
<activity
        android:name=".B"
        android:label="@string/app_name" >
</activity>

しかし、インテントフィルターは私の問題とは何の関係もないと思います。

4

1 に答える 1

1

より多くのテストで、私は原因と解決策を見つけました。

実際、ホームメニューからアプリケーションを再起動したと言ったとき、それは真実ではありませんでした。私は「最近の活動」(家での長押し)からそれを呼び戻しました。ただし、この場合、androidは、アプリケーションを実行した最後のインテントでアプリケーションを起動するようです。したがって、自宅からは正常に機能しますが(Intent.ACTION_MAINの新しいインテントが発生するため)、以前と同じアクションのインテント(私の場合はACTION_CUSTOM)が何度も発生するため、最近のアクティビティからは機能しません。

「最近の活動」や「通知」と意図を区別するために、フラグを使用しました。最近のアクティビティの場合、インテントにはフラグIntent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORYがあります。

そこで、ifステートメントに条件を追加してコードを修正します。

if (S.ACTION_CUSTOM.equals(getIntent().getAction()) && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
        startActivity(getIntent().setClass(this, B.class));  
}

私の実際のコードは、2つではなく4つのアクティビティで少し複雑ですが、すべて正常に機能し、各アクティビティはインテントを次のアクティビティに送信します。スタックは適切に構築されており、ユーザーが通知以外の場所からアプリケーションを起動すると、デフォルトの動作が維持されます。

これが、意図が狂っているように見える理由を理解するために時間を失うことを避けるのに役立つことを願っています。

于 2012-06-15T22:26:27.053 に答える