如何在没有UI的情况下启动一个Activity?

86

在没有UI的情况下,是否有可能从主函数启动一个活动?即是否有一种方法可以创建另一个活动的“包装器”,例如通过启动主活动,它会自动带您进入另一个活动。

如果不可能实现上述功能,那么是否有一种方法可以从堆栈中删除主活动,使点击返回按钮时不会进入空白UI?以下是我尝试做的事情的示例:

public class WrapperActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:555-1212"));
        startActivity(intent);
    }
}
11个回答

137

Android还提供了一个专门针对此问题的主题:

android:theme="@android:style/Theme.NoDisplay"

6
这很有效,但也会导致应用程序抽屉中的图标消失。为了使图标出现,您需要使用Brian515的答案。 - Learn OpenGL ES
1
我也发现这个方法可行,但如果我显示一个进度对话框,它会默认使用Holo.Dark主题,这与我的应用程序的风格不匹配。 - Andy Johnson
1
@LearnOpenGLES 我正在使用这个主题,但我仍然在应用程序抽屉中看到图标。我认为这是更好的选择,因为它将一堆值设置为NULL,让我认为它更有效率。https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/themes.xml/refs/heads/master/core/res/res/values/themes.xml - givanse
4
为了使其工作,您的活动必须继承自Activity而不是AppCompactActivity。 - Kof
4
@Kof:你也可以将“Theme.NoDisplay”(仅6个属性)的内容复制到任何“Theme.AppCompat.*”的扩展中,以创建适用于“AppCompatActivity”的自己的“Theme.AppCompat.NoDisplay”。 - MH.
显示剩余5条评论

55

在您的清单文件中声明活动时,使用主题 "@android:style/Theme.Translucent.NoTitleBar"

例如:

<activity android:name="yourActivityName" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar">

3
如果您还希望该应用程序出现在应用程序抽屉中,那么这就是正确的答案。 - Learn OpenGL ES
4
这仍然会打开一个看不见的用户界面,在继续使用手机之前你需要按返回键。 - Jemshit Iskenderov

39

你需要添加Intent标志,

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

或者

在触发意图后调用 "finish();"。


7
我不确定FLAG_ACTIVITY_CLEAR_TOP的技巧在这里是否有效,因为启动的Activity将来自另一个应用程序。不过, finish()肯定会起作用。 - CommonsWare
1
在清单文件中添加了 finish(); 和 Translucent.NoTitleBar。很完美地工作了。 - fjmustak
@Vishwanath Intent基本上不支持finish()。你可以详细解释一下,在哪里可以调用finish以及如何调用吗? - user170317
2
在Activity的onCreate()方法结束之前,您需要调用finish()方法。 - intrepidis

15

如果您正在使用Android 6.0+或目标SDK为23+,并且主题android:theme = "@android:style/Theme.NoDisplay"将导致错误未在onResume()完成之前调用finish()。实际上,这是Google开发人员认可的一个错误(在此)

因此,建议使用以下主题的活动作为解决方法。

android:theme = "@android:style/Theme.Translucent.NoTitleBar"


你可以在onCreate方法中启动一个线程、Runnable或Service等,然后调用finish方法。 - SAIR

8
我认为这会对你很有帮助:
<activity  android:name = "MyActivity" 
          android:label = "@string/app_name" 
          android:theme = "@android:style/Theme.NoDisplay" >

欢迎来到 Stack Overflow!Stack Overflow 通常使用英语,为了让您的帖子对其他人更有用,请确保进行翻译。 - Nathan Tuggy
使用此方法时,请务必注意arunwithasmile的评论。 - marchinram
我应该把这个放在哪里? - d51

8

使用

<activity android:name="yourActivityName" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar">

Brian515提到的方法非常好用。这种方法对于创建一个入口Activity非常有用,该Activity可以决定调用、启动、服务等,而无需向用户显示UI界面。在启动你的意图后,记得使用finish()


5

我正在使用 AppCompatActivity,但是这里提供的解决方案没有解决我的问题。以下是适合我的方法。

我在我的 styles.xml 中添加了以下内容。

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
</style>

<style name="AppTheme.NoDisplay">
    <item name="android:windowBackground">@null</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@null</item>
    <item name="android:windowDisablePreview">true</item>
    <item name="android:windowNoDisplay">true</item>
</style>

然后,对于我想要禁用显示的任何活动,我进行了如下修改:

<activity 
    android:name=".NoDisplayActivity"
    android:theme="@style/AppTheme.NoDisplay">

干杯!


你是指AndroidManifest.xaml文件吗?我无法编辑那个文件。 - d51
很奇怪。能否发一个新问题? - user1506104
我找到了另一种方法,但也许以后我会问一个相关的问题。 - d51

4
在您的清单中添加@android:style/Theme.Translucent.NoTitleBar,如上面某些答案中所提到的。
同时从您的activity.java文件中删除setContentView(R.layout.your_activity);行。

3

我曾在onResume()中使用moveTaskToBack(true)将整个活动堆栈放入后台。


1
我必须使用这种方法,因为我希望该活动有时显示,而有时不显示。 - Randy

2
看起来与这里提出的问题类似:从历史堆栈中删除活动 如果是的话,您可以使用以下代码:

FLAG_ACTIVITY_NO_HISTORY

这应该可以用于清除活动栈中的活动。
如果您需要从最近的应用程序中排除(长按主键),则可以使用此标志:

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS


这与从历史堆栈中删除活动无关。 - Justin
@Justin 我非常确定这个问题有这部分内容:“如果不可能,是否有一种方法可以从堆栈中删除主活动,以便单击返回按钮不会带您到空白的UI?”我相信这与历史堆栈密切相关,但我可能错了。 - Sreedevi J
抱歉,我没有注意到问题中的最后两个句子。无论如何,我认为这并不能解决问题。我可能错了,但我认为这两个标志都不会将活动从后堆栈中移除(例如,按下返回按钮仍会将用户带到空白UI)。 - Justin
@Justin,不会将用户带回空白的UI界面。这个标志或者清单等效项不会将活动添加到堆栈中,因此没有任何可以返回的内容。 - Sreedevi J

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