启动应用程序的Activity时,运行的第一段代码是Application.onCreate()的子类。有没有办法知道哪个活动触发了这个?
更具体地说,在我的Application子类onCreate()中,我做了一些数据库初始化。这可能会失败,我失败的一般解决方案是启动另一个活动,我可以向用户显示内容。如果失败在Application.onCreate()中,则可以正常工作。
当失败发生在Application.onCreate()中时,Android会尝试重启我的Application子类,而子类又会失败,依此类推。我可以使用活动SingleInstance属性阻止无限循环。但这可以阻止任何活动的启动。
一种解决方案是将我的数据库代码移动到我的主要活动的onStart()中。但是,如果有一种方法可以在错误处理活动尝试启动时绕过它,我宁愿将它保留在Application.onCreate()中。
答案 0 :(得分:1)
一种方法是切换到ACRA进行异常处理活动,或者至少使用他们的技术。
ACRA在单独的:acra
流程中结束。然后,他们使用ActivityManager
和getRunningAppProcesses()
来确定当前流程是否为: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 ==“”,那么启动此活动的不是您自己的应用。
干杯