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

时间:2010-04-24 10:23:23

标签: 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);
    }
}

11 个答案:

答案 0 :(得分:116)

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

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

答案 1 :(得分:50)

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

例如:

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

答案 2 :(得分:26)

您需要添加Intent标志

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

或者

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

答案 3 :(得分:8)

Just in case you are using Android 6.0+ or Target SDK is 23+, having a theme android:theme = "@android:style/Theme.NoDisplay" will lead to a crash with error did not call finish() prior to onResume() completing. This in fact is a bug recognised by Google developers here.

So it is recommended to use an activity with following theme as a workaround.

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

答案 4 :(得分:7)

使用

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

效果很好。此方法对于创建入口点Activity非常有用,该入口点决定要调用哪些活动,启动,服务等,而无需向用户显示UI。在开始意图后,请务必使用finish()

答案 5 :(得分:7)

我认为这会对你有所帮助:

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

答案 6 :(得分:2)

与此处提出的问题类似:Removing an activity from the history stack

如果是,则可以使用:

  

FLAG_ACTIVITY_NO_HISTORY

这应该可以用来擦除堆栈中的活动。

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

  

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

答案 7 :(得分:2)

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

答案 8 :(得分:2)

在您的清单中添加@android:style/Theme.Translucent.NoTitleBar",如上面的一些答案所述。

同时从activity.java文件中删除setContentView(R.layout.your_activity);行。

答案 9 :(得分:1)

如果您没有与UI交互,那么您尝试做的事情听起来更像是一个Android服务。

答案 10 :(得分:0)

我正在使用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">

干杯!