如何在按下Home键时完成一个Activity

9

由于某些复杂的原因,当用户按下HOME键时,我需要能够finish()我的活动。

这里的情况是,我有一个主屏幕小部件,它启动了我的应用程序的不同部分,该部分具有完全透明的活动(因此即使我的活动正在运行,主屏幕仍然保持显示)。如果以前的活动是通过Home按钮终止的,则它们将被带到前台并遮挡主屏幕。

或者作为替代方案,新活动是否可以以某种方式强制完成()以前的活动?


我建议摆脱透明活动,这样人们就不会把你的应用程序称为间谍软件。 - CommonsWare
谢谢Mark;这个透明活动有一个很好的理由。我在我的主屏幕小部件上展示动画,持续时间很短的透明活动(6秒后自毁),我不希望用户打开其他应用程序,因此这也可以“锁定”主屏幕;它还必须是一个活动,因为我必须进行一些仅在UI线程上可用的调用。 - Yossi
1
“我不想让用户打开其他应用程序”--这对用户有什么好处呢?“这也必须是一个活动,因为我必须进行一些只能在UI线程上使用的调用。” --例如?我唯一能想到的这样的调用与活动和小部件本身有关。 - CommonsWare
我的小部件会触发设备无线电和一些屏幕设置(如亮度)的重新配置,这需要几秒钟的时间。我希望在此更改正在进行时,用户不要启动其他任何操作。亮度更改(以及其他更改)必须在UI线程上进行。 - Yossi
5个回答

12

那怎么办呢?

android:launchMode="singleTask"

或者

android:launchMode="singleInstance"

你的清单文件中需要添加什么?我认为singleTask是你想要的,但我并没有完全明白你在做什么。

“系统会在一个新任务的根部创建该活动,并通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建一个新的实例,但如果活动的实例已经存在,则系统会将意图路由到现有实例。” singleTask

@Override
void onPause() {
   super.onPause();
   finish();
}

开发文档:Activity生命周期结束


谢谢 - 但是当我生成一个子活动时,这也会结束我的活动 - 所以我需要维护一个标志来记录每当我生成子活动的情况 - 比较麻烦。 - Yossi
2
搞定了!这个答案最接近,所以我会接受它。我在 onUserLeaveHint 中添加了一个 finish(),并确保从此活动调用的所有 startActivity 都包括标志 Intent.FLAG_ACTIVITY_NO_USER_ACTION,以便 onUserLeaveHint() 仅在用户真正离开我的活动时才被调用。这些 Android 平台的家伙想到了一切! - Yossi

3

在从主屏幕启动的活动中设置android:clearTaskOnlaunch="true"。 示例:

<activity
            android:name="MainActivity"
            android:exported="true"
            android:clearTaskOnLaunch="true"
            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>


2
请不要在网站上发送与内容无关的Youtube链接,谢谢合作。 - laalto

0

对于主页按钮按下后的finish()我不确定,但我认为你可以使用以下方法完成前一个活动:

Intent i = new Intent(MainActivity.this, SecondActivity.class);
startActivity(i);
finish();

虽然这可能不是最好的方法。我认为你也可以调用子活动的父活动并以这种方式结束它,但不确定。


这将结束你编写了代码行 finish(); 的活动。@Yossi,也许发送一个意图,你可以解释为是时候调用finish了。只是随口一想。 - eternalmatt
发送一个意图让我思考了一下!如果我的小部件使用的pendingIntent包含链接中提到的标志,那么可能会清除所有挂起的活动。我会试试看。 - Yossi
无法工作 - 因为链接中的标志需要API 11 - 这使得它对今天市场上99%的设备无用... - Yossi

0

我遇到了一个问题,当按下主页按钮时无法关闭声音。我写了下面的代码。希望能帮到你。 重写onPause()方法。

 @Override
 public void onPause(){
      System.exit(0);
      super.onPause(); 
 }

1
谢谢...我会担心使用非Android框架调用。如果它清除了一些仍然需要我的应用程序关闭的东西(例如文件指针),那该怎么办? - Yossi

-1
@Override
public void onStop() {
    super.onDestroy();
}

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