我已经编写了一些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
,但是尝试从声明为MyApplication
的{{1}}启动它生成错误。可能是一个非常愚蠢的问题,但我是否一直在解决这个问题?
谢谢,
保
答案 0 :(得分:20)
您可以使用FLAG_ACTIVITY_NEW_TASK
标志来解决此问题:
Intent intent = new Intent(this, ApplicationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
那是因为当Activity在Activity上下文之外启动时需要启动新任务。但我强烈建议您不要从应用程序的onCreate()
启动活动。
Android有4个组件:Activity,Service,ContentProvider和Broadcast。
当Android需要从您的应用程序激活其中一个组件时,它会查看您的应用程序是否已存在正在运行的进程。如果没有,那么Android启动新进程,初始化它,然后初始化您的自定义应用程序实例。然后它激活一个必需的组件。
现在,让我们考虑下一个场景:您的应用程序在AndroidManifest.xml
中声明了内容提供程序,而Android即将启动您的应用程序,以便您可以向另一个前台应用程序提供一些数据。
Application.onCreate()
被召唤。有人只想连接到您的内容提供商,但您的应用程序却启动了一个Activity。对于启动后台服务和有时广播接收器也是如此。
还要考虑其他应用程序的某个活动A是否希望从您的应用程序启动活动X.但是在onCreate()
中你启动了活动Y,然后X也是由Android启动的。然后用户按下。应该怎么办?它很棘手......
从Application
的{{1}}开始活动可能会导致非常奇怪的用户体验。所以不要这样做。
<强>更新强> 因为Android保证Application只会创建一次,而在任何其他组件之前,您可以使用下一代码来访问Application的单个实例:
onCreate
答案 1 :(得分:0)
你是否已经在你开始的这个意图的清单活动标签中设置了它(除了主要的另一个)?
</activity>
<activity android:name=".InitialActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="com.package.INITACT" /> <--- this is only name by which you activity can be called.
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>