<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
如果我可以使用应用程序启动我的应用程序,然后在设置prefs等之后从其onCreate()调用第一个Activity,但是我还没有能够启动我的应用程序,这将是非常好的范围一些全局方法,静态,共享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,则可以正常运行,但尝试从MyApplication启动它,该对象被声明为MAIN生成错误.可能是一个非常愚蠢的问题,但我是否正在处理这一切?
谢谢,
保罗
解决方法
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将启动新进程,初始化它,然后初始化您的自定义应用程序实例.然后它激活所需的组件之一.
现在,让我们考虑下一个场景:您的应用程序在AndroidManifest.xml中声明内容提供程序,Android即将启动应用程序,以便您可以向另一个前台应用程序提供一些数据.
>发送内容提供者请求
>您的应用程序未运行,Android启动新的进程.
>您的自定义应用程序实例已创建
> Application.onCreate()被调用.
>你开始一个活动
>您的内容提供商接收请求
有人只想连接到您的内容提供商,但您的应用程序开始了一个活动.启动后台服务和有时广播接收器也是如此.
并且还要考虑一下其他应用程序的活动A是否想要从你的应用程序开始活动X.但是在onCreate()中,您开始活动Y,然后X也由Android启动.然后用户按下.应该怎么办这很棘手…
从应用程序的onCreate开始的活动可能会导致相当奇怪的用户体验.所以不要这样做
更新:
因为Android保证应用程序只能在任何其他组件之前创建一次,您可以使用下一个代码来访问应用程序的单个实例:
public class MyApplication extends Application { private static MyApplication s_instance; public MyApplication() { s_instance = this; } public static MyApplication getApplication() { return s_instance; } }