Android应用程序与活动

时间:2011-07-21 11:33:06

标签: android android-manifest

我已经编写了一些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}}启动它生成错误。可能是一个非常愚蠢的问题,但我是否一直在解决这个问题?

谢谢,

2 个答案:

答案 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即将启动您的应用程序,以便您可以向另一个前台应用程序提供一些数据。

  1. 发送内容提供商请求
  2. 您的应用程序未运行,Android会为其启动新进程。
  3. 您的自定义应用程序实例已创建
  4. Application.onCreate()被召唤。
  5. 您开始活动
  6. 您的内容提供商收到请求
  7. 有人只想连接到您的内容提供商,但您的应用程序却启动了一个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>