我有一个弹出活动,当警报管理器收到警报时启动。
AlarmReceiver 扩展了 WakefulBroadcastReceiver:
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, AlarmService.class);
service.putExtras(intent);
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, service);
}
警报服务扩展意图服务:
@Override
protected void onHandleIntent(Intent intent) {
Intent i = new Intent();
i.setClass(this, PopUpActivity.class);
startActivity(i);
AlarmReceiver.completeWakefulIntent(intent);
}
弹出活动:
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);
getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
setContentView(R.layout.layout_dialog);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ClientConstants.WAKE_LOCK_NOTIFICATION);
// Acquire the lock
wl.acquire();
if (canVibrate){
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(new long[]{ 0, 200, 500 },0);
}
if (canRing){
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(this, getAlarmUri());
final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
mediaPlayer.prepare();
mediaPlayer.start();
}
} catch (IOException e) {
}
}
findViewById(R.id.dialog_ok_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopRinging();
finish();
}
});
// Release the lock
wl.release();
}
private void stopRinging(){
if (canRing && mediaPlayer.isPlaying())
mediaPlayer.stop();
if (canVibrate){
vibrator.cancel();
}
}
PopUpActivity 是从警报管理器启动的。如果在应用程序不是活动应用程序时启动 PopUpActivity,并且如果用户按"确定按钮",则活动将消失。到目前为止,这里没有任何问题。问题是,如果用户打开最近的应用程序屏幕并选择活动,则会再次启动新的 PopUpActivity。我怎样才能摆脱这个问题?
当您在清单中声明 PopupActivity 时,请确保包含 android:noHistory="true"
。这意味着一旦您打开"最近",弹出活动就会被遗忘,当您重新打开应用程序时,您将返回到之前的位置。
当用户按下Ok
按钮时,正在调用Activity.finish()
方法。这会导致Activity
被销毁。因此,当用户从最近的应用程序部分选择应用程序时,将再次创建Activity
。
如果您不想销毁Activity
但想将其置于后台,请将 Activity.finish() 方法替换为 Activity.moveTaskToBack(布尔值)。
findViewById(R.id.dialog_ok_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopRinging();
moveTaskToBack(true);
}
});
您需要处理由于内存不足和配置更改而Activity
在被终止后重新启动的情况。
您可以在Activity
启动Intent
标志中设置FLAG_ACTIVITY_SINGLE_TOP,以确保如果新实例已在历史记录堆栈的顶部运行,则不会创建新实例。
在您的清单中,在 Activity
部分下,请尝试以下操作:
<activity>
android:launchMode="singleTask"
</activity>
如果您希望Activity
不显示在最近的应用列表中,请尝试
<activity>
android:excludeFromRecents="true"
</activity>
希望这有帮助。
当您按"确定"按钮时,您将finish()
活动,然后从历史记录中再次选择它显然会重新创建它。
您应该做的是使用android:excludeFromRecents="true"
从历史记录/最近隐藏此警报活动
并为此使用launchMode = "singleInstance"
,以便 Android 永远无法同时创建此活动的另外两个实例。
标志添加到启动活动的意图中,指示在最近的任务中不显示即可避免此问题:
Intent i = new Intent();
i.setClass(this, PopUpActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(i);
设置Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
将使您的弹出窗动在最近的任务中不可见。