2

私のアプリには、2 つのアクティビティ、1 つのウィジェット、およびブロードキャスト レシーバーが含まれています。

最初のアクティビティは、ホーム ランチャーによって呼び出されるデフォルトのアクティビティです。2 番目のアクティビティは、MP3 を再生し、閉じるボタンを持つリマインダー ダイアログ アクティビティです。ホーム画面に表示されます。

私のウィジェットは、クロックを更新する責任があるブロードキャストレシーバーを毎分呼び出すようにアラームを設定するカスタムクロックです。ブロードキャスト レシーバーがリマインダー アクティビティを呼び出す特定の時間にリマインダーがいくつかあります。

アプリが完全に機能するようになりましたが、小さな問題があります。アプリがバックグラウンドで開いているとき (画面上に表示されていない)、ブロードキャスト レシーバーがリマインダー アクティビティを開始すると、デフォルトのアクティビティが最初に表示され、その上にリマインダー アクティビティが表示されます。しかし、アプリを閉じると、リマインダー アクティビティがホーム画面に表示され、問題はありません。

これは、レシーバーからの startActivity に使用するコードです。

context.startActivity(new Intent(context, ActivityReminder.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP));

そして、これはアンドロイドマニフェストです:

    <activity android:name=".MyActivity"
        android:theme="@android:style/Theme.Black.NoTitleBar"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <activity android:name=".ActivityReminder" android:label="@string/reminder" android:screenOrientation="portrait" android:theme="@style/Theme.CustomDialog"  />

    <receiver android:name=".widget"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/widget" />
    </receiver>

    <receiver android:name=".UpdaterReceiver" />

今のところ、デフォルトのアクティビティでこの回避策を使用して問題を解決します。アプリを閉じるのと同じように機能します。

@Override
protected void onPause()
{
    super.onPause();
    finish();
}

もっと厄介なものを見つけました。メイン アクティビティが閉じられていない場合は、ブロードキャスト レシーバーからのすべての呼び出しで、アクティビティが既に開いていても再び開かれます。ただし、メイン アクティビティが閉じられている場合、後続の呼び出しは何もしません。

4

1 に答える 1

3

あなたの問題はtaskAffinityです。を起動するActivityReminderと、Android はこれを起動する適切なタスクを見つけようとします。アプリが実行されていない場合、適切なタスクが見つからないため、新しいタスクが開始され、アクティビティがタスクに単独で表示されます。ただし、アプリが既にバックグラウンドで実行されている場合、Android は既存のタスクをフォアグラウンドに持ってきて、ActivityReminderそのタスクを起動します。

<activity>この問題を解決するには、 の定義に次を追加しますActivityReminder

android:taskAffinity=""

これは、起動する「一致する」タスクを探すべきではないことを Android に伝えますActivityReminder

于 2015-03-04T19:37:55.963 に答える