如何拦截Android应用程序启动(不使用主Activity的onCreate事件)

时间:2018-03-01 13:55:46

标签: android

每当我的Android应用程序启动时,我都需要执行一些代码,以便我可以初始化我的mainActivity菜单。菜单应该仅在应用程序启动时初始化,并且应该记住所选的菜单项,例如当我从其他子项Activies返回mainActivity时(即在按下后退或向上按钮之后)。

我已经尝试过使用onCreate事件,sharedPreference和getIntent()函数,但它们不适合那个pourpose。我需要与onLoad()HTML页面事件类似的东西。有什么帮助吗?

1)只要设备旋转,键盘打开,或者您切换应用程序,系统就会调用OnCreate,系统会决定是否需要回收一些内存并终止您的应用程序。 OnCreate与应用程序lyfecycle无关,而只与Activity Lifecycle有关。如果你没有在清单中使用android:launchmode = singleTop,当你使用“向上”按钮返回主活动时也会调用它。是的,你可以存储你以前的状态...结束恢复onResume,但它似乎很棘手,不自然。

2)每当我从其他子活动(在某些情况下)返回主Activity时,getIntent()都会返回相同的操作。

3)我可以使用sharedPreference永久存储一个值,但是当我重新启动应用程序时,该值具有设置的最后一个值,如果该应用程序刚刚启动,我无法知道这一点。 / p>

如果你不同意这些句子,请提供一个证明我错的例子。我尝试了很多解决方案。

2 个答案:

答案 0 :(得分:3)

我试着给出一个完整的答案。 如果您只需要在应用程序启动时执行某些代码,那么您可以创建自定义Application类。你可以这样做:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //Here you can put your startup logic
    }
}

然后,您必须修改manifest.xml文件中的标记。您需要告诉它应用程序必须是您定义的应用程序,您可以这样做:

<application
    android:name=".MyApplication"
    ...
    >

显然,我假设您的MyApplication类位于应用程序的基础包中。

但是,从我在你的帖子中阅读的内容来看,你需要一些与此不同的东西。您无法从应用程序设置UI,因为还没有用户界面,而UI只是一个活动(当然还有其子项)可以拥有的。我会进一步调查你在onCreate方法中做了什么。您是否每次在调用创建时设置所选菜单项?如果是这样,您可以在共享首选项中编写实际选定的菜单项。您可以在每次选择不同的菜单项时更新此值,然后,在onCreate中,您只需从共享首选项中读取此值并选择已保存的项目,而不仅仅是&#34;默认项目&#34;。

答案 1 :(得分:1)

这是我的例子:

public class MainApplication extends Application {

    private static Resources mResources;

    @Override
    public void onCreate() {
        super.onCreate();

        mResources = this.getApplicationContext().getResources();
    }

    public static String getStringResource(int resId) {
        return mResources.getString(resId);
    }
}

不要忘记在AndroidManifest.xml中添加这个新应用程序:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.example">

    <application

        android:name=".MainApplication"

        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

最后你可以像这样使用初始化:

public class DetailModel {
  private String title;

  public DetailModel(boolean aFlag) {
    if(aFlag) {
      title = movieData.getTitle();
    } else {
      title = MainApplication.getStringResource(R.string.default_title);
    }
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String t) {
    this.title = t;
  }
}

希望这有帮助