如何在没有UI的情况下启动活动?


75

是否可以在没有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);
    }
}

Answers:


33

您需要添加Intent标志,

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

要么

发出finish();意图后,请拨打“ ”。


6
我不确定该FLAG_ACTIVITY_CLEAR_TOP技巧是否会在这里起作用,因为Activity被启动将来自另一个应用程序。finish()当然应该可以。
CommonsWare 2010年

1
添加了finish(); 和Translucent.NoTitleBar来体现。奇迹般有效。
fjmustak

@Vishwanath Intent基本上不支持finish()。您能详细说一下,我可以在哪里打电话?如何?
user170317 2012年

2
finish()在活动onCreate()方法的结尾处调用,就在它返回之前。
intrepidis 2015年

128

Android还为此提供了一个主题:

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

5
这样效果很好,但也会导致图标从应用程序抽屉中消失。要显示该图标,您需要使用Brian515的答案。
学习OpenGL ES

1
我还发现这可行,但是如果我显示进度对话框,则默认为Holo.Dark,它与我的其他应用程序的样式不匹配。
安迪·约翰逊

1
@LearnOpenGLES我正在使用此主题,但仍在应用程序抽屉中看到该图标。我还发现它是一个更好的选择,因为它将一堆值设置为NULL,这使我认为它效率更高。android.googlesource.com/platform/frameworks/base/+/refs/heads/…–
givanse

4
为此,您的活动必须继承自Activity,而不是AppCompactActivity。
Kof

4
@Kof:您也可以仅将Theme.NoDisplay(仅6个属性)的内容复制到的任何扩展名,Theme.AppCompat.*以创建Theme.AppCompat.NoDisplay与一起使用的扩展名AppCompatActivity
MH。

53

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

例如:

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

3
如果您还需要将应用程序显示在应用程序抽屉中,则这是正确的答案。
学习OpenGL ES

3
这仍然会打开不可见的UI,您必须先按回去才能继续使用电话
Jemshit Iskenderov 2015年

11

以防万一,如果您使用的是Android 6.0+或Target SDK是23+,那么使用主题android:theme = "@android:style/Theme.NoDisplay"将导致error崩溃did not call finish() prior to onResume() completing。实际上,这是Google开发人员在此处识别的错误。

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

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


您可以启动线程或可运行或服务或其他任何东西,然后在onCreate中调用完成
SAIR,2017年

8

使用

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

Brian515提到的效果很好。此方法对于创建入口点Activity很有用,该入口点决定在不向用户显示UI的情况下调用,启动,服务等活动。切记finish()在开始意图后使用。


7

我认为这对您有很大帮助:

<activity  android:name = "MyActivity" 
          android:label = "@string/app_name" 
          android:theme = "@android:style/Theme.NoDisplay" >

欢迎使用Stack Overflow!堆栈溢出通常以英语运行;请通过翻译确保您的信息对其他人尽可能有用。
内森·塔吉

使用这种方法时,请务必注意arunwithasmile的评论
marchinram

我该放在哪里?
dan51

4

在清单中添加@android:style/Theme.Translucent.NoTitleBar"上述某些答案中提到的内容。

还要setContentView(R.layout.your_activity);从您的activity.java文件中删除该行。


4

我正在使用AppCompatActivity,因此SO中提供的解决方案无法解决我的问题。这对我有用。

我在中添加了以下内容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文件?我无法编辑该文件
dan51 '20

那真是怪了。愿意发布新问题吗?
user1506104

我发现了另一种方法,但是也许以后我会问一个问题
dan51 '20

2

看起来类似于这里的问题: 从历史记录堆栈中删除活动

如果是这样,则可以使用:

FLAG_ACTIVITY_NO_HISTORY

这应该可以清除堆栈中的活动。

如果您需要从最近的应用程序中排除(长按主页键),可以使用以下标志:

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS


这与从历史记录堆栈中删除活动无关。
贾斯汀

@Justin我非常确定这个问题包含以下部分:“如果不可能,是否有办法从堆栈中删除主要活动,以便单击后退按钮不会将您带到空白UI?” 我相信,它与历史记录栈紧密相关,但我可能会误会。
Sreedevi J 2013年

抱歉...我没注意到问题中的最后两句话。无论如何,我认为这不能解决问题。我可能会弄错了,但我认为这两个标志都不会将活动从后退堆栈中移除(例如,按下后退按钮仍会将用户带到空白UI)
Justin

@Justin,不,它不会将用户带回到空白UI。此标志或清单等效项不会将活动添加到堆栈中,因此没有任何可回溯的内容。
Sreedevi J

2

如果您不与UI进行交互,那么您尝试做的事情听起来更像是android服务。


3
在某些情况下是...。但并非在所有情况下都如此。似乎经常会出现这种情况,足以使Android框架工程师为没有UI的活动创建特定主题。
贾斯汀

例如,如果我使用第三方库来选择字体或颜色,则通常将其设计为要求启动它的Activity来实现一些回调接口。但是我可能正在从弹出窗口中启动颜色选择器。如果我想将整个流程封装在弹出窗口的代码中,而不是污染我的主Activity界面,那么我需要一个临时(不可见)活动充当颜色选择器的侦听器
Stevey

2

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


1
我必须使用此方法,因为我希望活动显示某些时间而不显示其他时间。
兰迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.