我已经编写了一些 Android 应用程序,并且总是将起始 Activity
声明为:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
如果我可以使用 Application
启动我的应用程序,然后从它调用第一个 Activity
onCreate()
在设置 prefs 等之后,但我还没有找到这种设计模式的任何例子......当我在代码中尝试这个时,我得到一个 ClassCastException
:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// do stuff (prefs, etc)
// start the initial Activity
Intent i = new Intent(this, InitialActivity.class);
startActivity(i);
}
}
InitialActivity.class
确实是一个 Activity
,如果我将它设置为 MAIN
,它可以正常工作,但试图从 启动它声明为
会生成错误。可能是一个非常愚蠢的问题,但我是不是处理错了?MAIN
的 >MyApplication
谢谢,
保罗
最佳答案
您可以通过使用 FLAG_ACTIVITY_NEW_TASK
标记来解决此问题:
Intent intent = new Intent(this, ApplicationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
那是因为当 Activity 在 Activity 上下文之外启动时,您需要启动新任务。但我强烈建议不要从应用程序的 onCreate()
启动 Activity。
Android 有 4 个组件:Activity、Service、ContentProvider 和 Broadcast。
当 Android 需要从您的应用程序激活其中一个组件时,它会查看您的应用程序是否已经存在正在运行的进程。如果没有,那么 Android 会启动新进程,对其进行初始化,然后它会初始化您的自定义 Application 实例。然后它激活所需的组件之一。
现在,让我们考虑下一个场景:您的应用程序在 AndroidManifest.xml
中声明了内容提供程序,Android 正准备启动您的应用程序,以便您可以向另一个前台应用程序提供一些数据。
- Content Provider 请求已发送
- 您的应用程序未运行,Android 为其启动新进程。
- 您的自定义应用程序实例已创建
Application.onCreate()
被调用。- 您开始一项 Activity
- 您的内容提供商收到请求
有人只是想连接到您的内容提供者,但您的应用程序却启动了一个 Activity 。启动后台服务和有时广播接收器也是如此。
还要考虑其他应用程序的 Activity A 是否想从您的应用程序启动 Activity X。但是在 onCreate()
中你启动了 Activity Y,然后 X 也被 Android 启动了。然后用户按回。应该发生什么?这很棘手...
从 Application
的 onCreate
开始 Activity 可能会导致非常奇怪的用户体验。所以不要这样做。
更新: 因为 Android 保证应用程序只会在任何其他组件之前创建一次,所以您可以使用下一个代码来访问您的应用程序的单个实例:
public class MyApplication extends Application
{
private static MyApplication s_instance;
public MyApplication()
{
s_instance = this;
}
public static MyApplication getApplication()
{
return s_instance;
}
}
关于Android 应用程序与 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6775346/