我有一个应用程序,它使用启动画面和选择屏幕,如下面的清单所示:
<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
的原因开始。但是,暂时搁置这些东西,如果用户执行以下操作:
然后,当Thread
完成(即到达finally
块并创建Intent
)时,会创建新的ChoiceActivity
,但它也会带来应用到前台。我想禁用此行为。也就是说,我希望加载活动,但应用程序保留在后台。如果那是不可能的,那么我希望应用程序延迟加载新的Activity
(//任何//新Activity
),直到应用程序恢复之后。
我怎样才能做到这一点?
答案 0 :(得分:1)
活动意味着在前台运行。有一个给定的生命周期,它基于用户与应用程序的交互方式。因此,你实际上不应该试图“在后台开始你的活动”,因为它没有意义。你能做什么却以某种方式改变了活动对来自外部事件的反应。 例如,您可以在活动中创建一个新的布尔字段,并在onPause()中将其设置为false,并在onResume()中将其设置为true ...
然后您可以在启动新活动时检查它,实际上只在启动时才启动它。否则只需将该字段设置为true,然后在onResume()中启动该字段为true时的活动..
此外,您应该考虑到,系统可能随时杀死后台活动。 Activity应该释放所有系统资源,并在它进入后台时停止它的工作。只有这样你才能确定你的应用程序不会进入不可预测的状态。 对于后台任务,您应该使用服务,这些服务基本上是“没有UI的活动”(我不相信我已经说过) - 您的应用程序的一部分在后台运行。