即使启动了新活动,也可让应用留在后台

时间:2014-02-21 21:09:48

标签: java android multithreading android-activity background-process

我有一个应用程序,它使用启动画面和选择屏幕,如下面的清单所示:

<application
    android:name="com.example.CoolApp"
    android:label="@string/app_name"
    android:icon="@drawable/app_icon_debug"
    android:theme="@style/Theme.NoBackground">
    <activity
        android:name="com.example.Splash"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:noHistory="true"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <data android:scheme="coolappscheme"/>
        </intent-filter>

    </activity>
    <activity
        android:name="com.example.ChoiceActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateHidden"/>
</application>

启动画面显示约2秒钟,然后通过以下代码导航至ChoiceActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  ... some stuff for showing the Splash screen ...

  Thread mythread = new Thread() {
    @Override
    public void run() {
      try {
        .. animation stuff for fading in ...

        while (splashActive && ms < splashTime) {
          if(!paused)
            ms=ms+100;
          sleep(100);
        }
      } catch(Exception e) {
      } finally {
        Intent intent = new Intent(Splash.this, ChoiceActivity.class);
        startActivity(intent);
      }
    }
  };

现在,很明显这段代码有很多问题(从作者决定使用单独的Thread而不是AsyncTask的原因开始。但是,暂时搁置这些东西,如果用户执行以下操作:

  1. 启动应用程序&amp;看到闪屏。
  2. 强制应用程序进入后台(例如,用户接到电话,或者只是点击'主页'按钮)。
  3. 然后,当Thread完成(即到达finally块并创建Intent)时,会创建新的ChoiceActivity,但它也会带来应用到前台。我想禁用此行为。也就是说,我希望加载活动,但应用程序保留在后台。如果那是不可能的,那么我希望应用程序延迟加载新的Activity(//任何//新Activity),直到应用程序恢复之后。

    我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

活动意味着在前台运行。有一个给定的生命周期,它基于用户与应用程序的交互方式。因此,你实际上不应该试图“在后台开始你的活动”,因为它没有意义。你能做什么却以某种方式改变了活动对来自外部事件的反应。 例如,您可以在活动中创建一个新的布尔字段,并在onPause()中将其设置为false,并在onResume()中将其设置为true ...

然后您可以在启动新活动时检查它,实际上只在启动时才启动它。否则只需将该字段设置为true,然后在onResume()中启动该字段为true时的活动..

此外,您应该考虑到,系统可能随时杀死后台活动。 Activity应该释放所有系统资源,并在它进入后台时停止它的工作。只有这样你才能确定你的应用程序不会进入不可预测的状态。 对于后台任务,您应该使用服务,这些服务基本上是“没有UI的活动”(我不相信我已经说过) - 您的应用程序的一部分在后台运行。