PopUp Activity从"最近的应用程序"

时间:2014-04-04 13:42:18

标签: android broadcastreceiver alarmmanager

我有一个在AlarmManager收到警报时启动的PopUp活动。

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);
}

PopUpActivity:

@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 。我怎样摆脱这个问题?

5 个答案:

答案 0 :(得分:4)

在清单中声明PopupActivity时,请确保包含android:noHistory="true"。这意味着只要您打开" recents",弹出活动就会被忘记,您将在重新打开应用程序时返回到之前的位置。

答案 1 :(得分:3)

当用户按下Ok按钮时,正在调用Activity.finish()方法。这导致Activity被破坏。因此,当用户从最近的应用部分中选择应用时,会再次创建Activity

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

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,以确保如果新实例已在历史堆栈顶部运行,则不会创建新实例。

答案 2 :(得分:0)

在您的清单中,在Activity的部分下,试试这个:

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

如果您希望Activity 不显示在最近的应用列表中,请尝试

<activity>            
    android:excludeFromRecents="true"
</activity>

希望这有帮助。

答案 3 :(得分:0)

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

您应该执行的操作是使用android:excludeFromRecents="true"

隐藏历史记录活动中的此警报活动

并使用launchMode = "singleInstance",以便android永远不会同时为此活动另外创建两个实例。

答案 4 :(得分:0)

你可以简单地通过向开始活动的意图添加标志来避免这个问题,这意味着不会在最近的任务中显示:

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会使您的PopupActivity在最近的任务中不可见。