繁体   English   中英

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

[英]How to launch an Activity without a UI?

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

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

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

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

前任:

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

您需要添加 Intent 标志,

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

或者

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

以防万一您使用的是 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"

我认为这会对你有很大帮助:

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

使用

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

Brian515 提到的效果很好。 此方法对于创建一个入口点 Activity 很有用,该入口点 Activity 决定要调用、启动、服务等的 Activity,而无需向用户显示 UI。 请记住在开始意图后使用finish()

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

干杯!

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

同时删除setContentView(R.layout.your_activity); 来自您的 activity.java 文件的行。

我在onResume()使用了moveTaskToBack(true)将整个活动堆栈置于后台。

看起来类似于这里提出的问题: Removing an activity from the history stack

如果是,那么您可以使用:

FLAG_ACTIVITY_NO_HISTORY

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

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

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM