2011-07-21 66 views
10

我已经写了一些Android应用,并一直宣称起始Activity为:Android应用程序VS活动

<intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 

这将是伟大的作用域一些全局方法,静态,共享的首选项,等等,如果我可以使用Application启动我的应用程序,然后在设置首选项等后调用onCreate()中的第一个Activity,但我一直无法找到此设计模式的任何示例......当我在代码中尝试此操作时, a 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生成错误,该工作正常。可能是一个非常愚蠢的问题,但我解决这一切都是错误的?

感谢,

保罗

+3

你的意思是你将MyApplication定义为Activity?这确实会导致ClassCastException。 令人高兴的是,如果我正确理解你想要做什么,Android已经为你做了你想做的事情。您只需将您的应用程序的名称设置为该MyApplication的路径和名称即可。它将在您的活动开始之前创建,并将供所有人使用。像这样:

+0

有趣 - 我将如何从其中一个活动访问应用程序的自定义方法? –

+1

从你的Activity中你可以得到一个对应用程序的句柄:getApplicationContext(),如果它在你的清单中被配置成如上所示的结果,将会转换为MyApplication。 –

回答

19

您可以通过使用FLAG_ACTIVITY_NEW_TASK标志解决这个问题:

Intent intent = new Intent(this, ApplicationActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 

那是因为你需要开始时活动开始活动内容以外的新任务。但我强烈建议不要从您的应用程序的onCreate()开始Activity。


Android有4个组件:Activity,Service,ContentProvider和Broadcast。

当Android需要从您的应用程序激活这些组件之一时,它会查看您的应用程序是否已存在正在运行的进程。如果没有,那么Android会启动新进程,初始化它,然后初始化您的自定义应用程序实例。然后激活所需组件之一。

现在,让我们考虑下一个场景:您的应用程序在AndroidManifest.xml中声明了内容提供者,而Android正要启动您的应用程序,以便您可以将某些数据提供给另一个前台应用程序。

  1. 内容提供商请求被发送
  2. 您的应用程序没有运行,而Android为它开始新的进程。
  3. 您的自定义应用程序实例已创建
  4. Application.onCreate()被调用。
  5. 你开始一个活动
  6. 你的内容提供商接收请求

有人只是想连接到您的内容提供商,但你的应用程序启动的活动来代替。同样适用于启动后台服务和有时广播接收器。

而且还要考虑一些其他应用程序的活动A是否想从应用程序中启动活动X.但是在onCreate()中,您开始了活动Y,然后X也由Android启动。然后用户按下。应该发生什么?它的棘手...

ApplicationonCreate开始活动可能会导致相当奇怪的用户体验。所以不要这样做。


UPDATE: 由于Android保证创建应用程序只有一次,任何其他组件之前,你可以用下面的代码来访问你的应用程序的单一实例:

public class MyApplication extends Application 
{ 
    private static MyApplication s_instance; 

    public MyApplication() 
    { 
     s_instance = this; 
    } 

    public static MyApplication getApplication() 
    { 
     return s_instance; 
    } 
} 
+0

非常好,谢谢。因此,在MyApplication中声明自定义方法的方面,我可以将其暴露给“Activity”的其余部分,这可能吗?我将如何访问它们('getApplication()'似乎没有办法) –

+0

我已经更新了答案。 – inazaruk

+0

因此,我想在MyApplication中访问的任何方法都可以通过MyApplication.getApplication()。myMethod()来访问? –

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>