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