如何检测导致Application启动的活动?

时间:2016-04-05 15:08:59

标签: android android-activity

启动应用程序的Activity时,运行的第一段代码是Application.onCreate()的子类。有没有办法知道哪个活动触发了这个?

更具体地说,在我的Application子类onCreate()中,我做了一些数据库初始化。这可能会失败,我失败的一般解决方案是启动另一个活动,我可以向用户显示内容。如果失败在Application.onCreate()中,则可以正常工作。

当失败发生在Application.onCreate()中时,Android会尝试重启我的Application子类,而子类又会失败,依此类推。我可以使用活动SingleInstance属性阻止无限循环。但这可以阻止任何活动的启动。

一种解决方案是将我的数据库代码移动到我的主要活动的onStart()中。但是,如果有一种方法可以在错误处理活动尝试启动时绕过它,我宁愿将它保留在Application.onCreate()中。

2 个答案:

答案 0 :(得分:1)

一种方法是切换到ACRA进行异常处理活动,或者至少使用他们的技术。

ACRA在单独的:acra流程中结束。然后,他们使用ActivityManagergetRunningAppProcesses()来确定当前流程是否为:acra流程:

/**
 * @return true if the current process is the process running the SenderService.
 *          NB this assumes that your SenderService is configured to used the default ':acra' process.
 */
public static boolean isACRASenderServiceProcess(@NonNull Application app) {
    final String processName = getCurrentProcessName(app);
    if (ACRA.DEV_LOGGING) log.d(LOG_TAG, "ACRA processName='" + processName + "'");
    return (processName != null) && processName.equals(ACRA_PRIVATE_PROCESS_NAME);
}

@Nullable
private static String getCurrentProcessName(@NonNull Application app) {
    final int processId = android.os.Process.myPid();
    final ActivityManager manager = (ActivityManager) app.getSystemService(Context.ACTIVITY_SERVICE);
    for (final ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()){
        if(processInfo.pid == processId){
            return processInfo.processName;
        }
    }
    return null;
}

虽然在Android 5.0+中已经对getRunningAppProcesses()进行了分类,但您仍然可以将它用于您自己的进程,这就是我们需要的所有内容。

鉴于您知道自己是否在ACRA流程中,您可以决定是否进行某些初始化,例如数据库初始化。

在您的情况下,您将在单独的命名进程中隔离异常处理活动,查看您是否在Application#onCreate()中的该进程中,并且如果您正在跳过数据库初始化。

答案 1 :(得分:0)

如果我理解正确,您想知道,世卫组织开始了您的活动。 如果我也理解正确,你会从你的应用程序中开始(至少有时候)这个活动。

如果两个假设均为真,请查看Intent类。您可以使用.putString(...)等类似的方法开始一个具有intent的活动,您可以在其中放置任何内容。

因此,在开始您的活动时,请执行类似

的操作
Intent intent = new Intent(this, myotheractivity.class);
intent.putString("caller", this.getClass().getSimpleName());
startActivity(intent);

并在活动中存储调用类的名称(或其他任何内容!)。

在onCreate()或你的活动中,只需检查一下这样的结构:

Intent intent = getIntent();
if (intent != null) {
    String caller = intent.getString("caller", "");
    if (!caller.equals("")) {
        // Here caller contains the name of the calling class
    }
}

如果此intent为null或caller ==“”,那么启动此活动的不是您自己的应用。

干杯