Android 应用程序与 Activity

标签 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,它可以正常工作,但试图从 启动它声明为 MAIN 的 >MyApplication 会生成错误。可能是一个非常愚蠢的问题,但我是不是处理错了?

谢谢,

保罗

最佳答案

您可以通过使用 FLAG_ACTIVITY_NEW_TASK 标记来解决此问题:

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 会启动新进程,对其进行初始化,然后它会初始化您的自定义 Application 实例。然后它激活所需的组件之一。

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

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

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

还要考虑其他应用程序的 Activity A 是否想从您的应用程序启动 Activity X。但是在 onCreate() 中你启动了 Activity Y,然后 X 也被 Android 启动了。然后用户按回。应该发生什么?这很棘手...

ApplicationonCreate 开始 Activity 可能会导致非常奇怪的用户体验。所以不要这样做。


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

public class MyApplication extends Application 
{   
    private static MyApplication s_instance;

    public MyApplication()
    {
        s_instance = this;
    }

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

关于Android 应用程序与 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6775346/

相关文章:

android - 在替换之前检查 framelayout 中加载了哪个 fragment

java - 尝试获取应用程序对象时偶尔发生崩溃

android - configchanges编译错误

android - 重命名 Play 商店应用程序

java - 期待 `android:screenOrientation="未指定的 "` or ` “fullSensor”

Android如何设置按钮具有透明背景但轮廓仍然存在

java - Android 警报对话框在我认为应该显示的时候没有显示

android - 从 ExpandableListView 检索 ChildItem?

java - 如何在 React Native for Android 应用程序中设置 canOverrideExistingModule=true?

android.hardware.telephony 中断了模拟器上的安装