Android应用程序与活动

Pau*_*ega 14 android android-manifest

我已经写了一些Android应用程序,并且总是声明一个起点Activity:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

如果我可以使用一个在设置prefs等Application之后调用第一个应用程序来启动我的应用程序,这对于确定一些全局方法,静态,共享首选项等是Activity很好的onCreate(),但是我还没有找到任何示例这个设计模式......当我在代码中尝试这个时,我得到一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

InitialActivity.class确实是一个Activity可以正常工作,如果我设置它MAIN,但尝试从它启动它MyApplication被声明MAIN生成错误.可能是一个非常愚蠢的问题,但我是否解决了这一切?

谢谢,

保罗

ina*_*ruk 21

您可以使用FLAG_ACTIVITY_NEW_TASK标志来解决此问题:

Intent intent = new Intent(this, ApplicationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

这是因为当Activity在Activity上下文之外启动时,您需要启动新任务.但我强烈建议不要从您的应用程序启动Activity onCreate().


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

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

现在,让我们考虑下一个场景:您的应用程序声明内容提供程序AndroidManifest.xml,Android即将启动您的应用程序,以便您可以向另一个前台应用程序提供一些数据.

  1. 发送内容提供商请求
  2. 您的应用程序未运行,Android会为其启动新进程.
  3. 您的自定义Application实例已创建
  4. Application.onCreate() 叫做.
  5. 你开始一项活动
  6. 您的内容提供商收到请求

有人只想连接到您的内容提供商,但您的应用程序启动了一个Activity.对于启动后台服务和有时广播接收器也是如此.

并且还要考虑一些其他应用程序的活动A是否想要从您的应用程序启动活动X. 但是在onCreate()你开始活动Y,然后X也是由Android启动的.然后用户按下.应该怎么办?这很棘手...

Application's 开始活动onCreate可能会导致非常奇怪的用户体验.所以不要这样做.


更新: 因为Android保证Application只会创建一次,并且在任何其他组件之前,您可以使用下一个代码来访问Application的单个实例:

public class MyApplication extends Application 
{   
    private static MyApplication s_instance;

    public MyApplication()
    {
        s_instance = this;
    }

    public static MyApplication getApplication()
    {
        return s_instance;
    }
}
Run Code Online (Sandbox Code Playgroud)