Android 从“开始”时,弹出式活动再次开始;最近的应用程序“;

Android 从“开始”时,弹出式活动再次开始;最近的应用程序“;,android,broadcastreceiver,alarmmanager,Android,Broadcastreceiver,Alarmmanager,我有一个弹出式活动,当AlarmManager收到警报时开始 AlarmReceiver扩展了WakefulBroadcastReceiver: @Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context, AlarmService.class); service.putExtras(intent); // Start the

我有一个弹出式活动,当AlarmManager收到警报时开始

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);
}
AlarmService扩展了IntentService:

@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,并且用户按下“确定”按钮,则活动将消失。到目前为止,这里没有什么不对的问题是,如果用户打开“最近使用的应用”屏幕并选择该活动,则会再次启动新的弹出式活动。如何解决此问题?

在您的清单中的
活动部分下,尝试以下操作:

<activity>            
     android:launchMode="singleTask"
</activity>

希望这有帮助。

当用户按下
Ok
按钮时,将调用
Activity.finish()
方法。这将导致
活动
被销毁。因此,当用户从最近的应用程序部分选择应用程序时,将再次创建
活动

如果您不想销毁
活动,但想将其置于后台,请将Activity.finish()方法替换为

您需要处理这样的场景:
活动
在由于内存不足和配置更改而被终止后重新启动


您可以在
Activity
launch
Intent
标志中进行设置,以确保如果新实例已经在历史堆栈的顶部运行,则不会创建该实例。

当您按下OK按钮时,您
finish()
该活动并从历史中再次选择它显然会重新创建它

您应该使用
android:excludeFromRecents=“true”


并使用
launchMode=“singleInstance”
,这样android就不能同时创建该活动的另外两个实例。

当您在清单中声明您的PopupActivity时,请确保包含
android:noHistory=“true”
。这将意味着,一旦你打开“最近”,弹出的活动将被遗忘,当你重新打开应用程序时,你将返回到以前的位置

只需在启动活动的意图中添加标志,指示不在最近的任务中显示,即可避免此问题:

Intent i = new Intent();
i.setClass(this, PopUpActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(i);

设置将使您的PopupActivity在最近的任务中不可见。

我希望我的应用显示在最近的应用列表中。launchMode=“singleTask”无效。您能否提供更多详细信息。当用户从最近的应用程序屏幕中选择时,您的要求是什么。很抱歉,我当时无法奖励您的奖金,我没有问题。很高兴知道答案对你有帮助。
findViewById(R.id.dialog_ok_button).setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        stopRinging();
        moveTaskToBack(true);
    }
});
Intent i = new Intent();
i.setClass(this, PopUpActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(i);