Android:清除所有后退栈活动,然后结束当前活动。

6
我在我的应用中有各种活动,并且流程非常复杂。我想要做的是,一旦连接了USB设备,我希望清除并完成后退堆栈中的活动,然后完成当前活动并执行System.exit(0)来关闭应用程序。
我已经实现了USB设备监听器。我想知道如何清除并完成后退堆栈中的活动(如果有任何活动存在),然后完成当前活动。
此外,如果我的活动A处于顶部并且它有2个活动(B,C)在后退堆栈中。现在,如果活动A在后台运行并连接USB,只有Activity A会监听到,对吗? (我在每个活动中都实现了USB接收器。)
我该如何在不导致应用程序崩溃的情况下实现这一点?
谢谢。
2个回答

7

有一个finishAffinity()方法,它将结束当前活动和所有父活动,但仅适用于Android 4.1或更高版本

来源

finishAffinity()将完成此活动以及当前任务中位于其下方且具有相同关联性的所有活动

如果你想在所有API级别中,在你的一个活动中

Intent intent = new Intent(this, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // this will clear all the stack
intent.putExtra("Exit me", true);
startActivity(intent);
finish();

然后在YourActivity的onCreate()方法中添加以下代码以结束该Activity。
setContentView(R.layout.your_layout);
if( getIntent().getBooleanExtra("Exit me", false)){
   finish();
   return; // add this to prevent from doing unnecessary stuffs
}

@dhun 是的,请再检查一遍。 - Sai Phani
在调用finishAffinity()来结束当前活动后,需要再添加finish()吗? - dhun
另外,如果我的Activity A在最上層並且它有2個Activity(B、C)在返回堆棧中。現在,如果Activity A在後台運行並且USB已連接,那麼只有Activity A會聽取它,對吧?(我在每個Activity中都實現了USB接收器。) - dhun
不应随意向活动添加监听器。使用BroadcastReceivers接收事件。 - Sai Phani
就好像每个活动在某个时刻都可以处于顶部,一旦检测到 USB 设备,我就必须立即关闭我的应用程序。 - dhun
finishAffinity() 只会将应用程序置于后台,而不会关闭应用程序。 - Saamzzz

-1
在我制作的一个应用程序中,我放置了以下内容:
if(Globals.isExit){
  finish();
}

在每个活动的onResume()方法中。

Globals是一个在manifest.xml中声明为的类。 Global类有一个名为exit的布尔值。

在所有活动的选项菜单中,包括一个退出选项,将Globals.exit设置为true,并调用finish()

然后,所有未完成的活动都将被完成。

不确定是否需要使用意图来清除后退堆栈,或者完成是否会为您清除它。如果我在这一点上错了,请原谅。

抱歉打字有误,我正在使用手机。


你也可以用startForResult打开每一个活动,在每个活动中在onResultReturned()方法中使用finish()。 - matty357

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接