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

fjm*_*tak 66 android

是否可以在没有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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*tin 123

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

android:theme="@android:style/Theme.NoDisplay"
Run Code Online (Sandbox Code Playgroud)

  • 这很好用,但也会导致图标从应用程序抽屉中消失.要显示图标,您需要使用Brian515的答案. (5认同)
  • @Kof:您也可以将`Theme.NoDisplay`(只有6个属性)的内容复制到`Theme.AppCompat.*`的任何扩展名,以便创建自己的`Theme.AppCompat.NoDisplay`,它与`AppCompatActivity一起使用`. (4认同)
  • 为此,您的活动必须继承自Activity,而不是AppCompactActivity. (3认同)

str*_*ark 50

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

例如:

<activity android:name="yourActivityName" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar">
Run Code Online (Sandbox Code Playgroud)

  • 如果您还需要应用程序显示在应用程序抽屉中,这是正确的答案. (3认同)
  • 这仍然会打开隐形UI,您必须在继续使用手机之前按下该UI (3认同)

Vis*_*ath 28

你需要添加Intent标志,

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Run Code Online (Sandbox Code Playgroud)

要么

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

  • 我不确定`FLAG_ACTIVITY_CLEAR_TOP`技巧是否可行,因为正在启动的`Activity`将来自另一个应用程序.但是,完成()`肯定会起作用. (6认同)
  • 您在 Activity 的 `onCreate()` 方法结束时调用 `finish()`,就在它返回之前。 (2认同)

Tma*_*mac 8

运用

<activity android:name="yourActivityName" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar">
Run Code Online (Sandbox Code Playgroud)

Brian515提到的很棒.此方法对于创建入口点Activity非常有用,该入口点决定要调用哪些活动,启动,服务等,而无需向用户显示UI.记住finish()在你开始意图后使用.


aru*_*ile 8

如果你使用Android 6.0+或Target SDK是23+,有一个主题android:theme = "@android:style/Theme.NoDisplay"将导致崩溃与错误did not call finish() prior to onResume() completing.这实际上是Google开发人员在此认可的错误.

因此,建议使用具有以下主题的活动作为变通方法.

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


小智 7

我想这对你有很大的帮助:

<activity  android:name = "MyActivity" 
          android:label = "@string/app_name" 
          android:theme = "@android:style/Theme.NoDisplay" >
Run Code Online (Sandbox Code Playgroud)


use*_*104 5

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

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

<activity 
    android:name=".NoDisplayActivity"
    android:theme="@style/AppTheme.NoDisplay">
Run Code Online (Sandbox Code Playgroud)

干杯!